The lfsck pool of kernel threads uses force_sig() to signal
the worker threads to stop. A signal is used here as the
lfsck workers may be waiting in various, and possibly
nested, states.
As force_sig() has been removed let us simply enable SIGINT
to be passed to the worker threads using send_sig().
Test-parameters: testlist=sanity-lfsck,lfsck-performance
HPE-bug-id: LUS-11670
Fixes:
db9f9543ec ("LU-12634 libcfs: force_sig() removed task parameter")
Signed-off-by: Shaun Tancheff <shaun.tancheff@hpe.com>
Change-Id: Ibf6a67f43687960b3eff9cb9a7c7dc8b1be1da63
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/51470
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: James Simmons <jsimmons@infradead.org>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
Reviewed-by: Neil Brown <neilb@suse.de>
]) # LIBCFS_LOOKUP_USER_KEY
#
-# LIBCFS_FORCE_SIG_WITH_TASK
-#
-# kernel 5.3 commit 3cf5d076fb4d48979f382bc9452765bf8b79e740
-# signal: Remove task parameter from force_sig
-#
-AC_DEFUN([LIBCFS_SRC_FORCE_SIG_WITH_TASK], [
- LB2_LINUX_TEST_SRC([force_sig_with_task], [
- #include <linux/sched/signal.h>
- ],[
- force_sig(SIGINT, NULL);
- ],[-Werror])
-])
-AC_DEFUN([LIBCFS_FORCE_SIG_WITH_TASK], [
- AC_MSG_CHECKING([if force_sig has task parameter])
- LB2_LINUX_TEST_RESULT([force_sig_with_task], [
- AC_DEFINE(HAVE_FORCE_SIG_WITH_TASK, 1,
- [force_sig() has task parameter])
- ])
-]) # LIBCFS_FORCE_SIG_WITH_TASK
-
-#
# LIBCFS_CACHE_DETAIL_WRITERS
#
# kernel v5.3-rc2-1-g64a38e840ce5
LIBCFS_SRC_KOBJ_TYPE_DEFAULT_GROUPS
# 5.3
LIBCFS_SRC_LOOKUP_USER_KEY
- LIBCFS_SRC_FORCE_SIG_WITH_TASK
LIBCFS_SRC_CACHE_DETAIL_WRITERS
# 5.4
LIBCFS_SRC_GENL_DUMPIT_INFO
LIBCFS_KOBJ_TYPE_DEFAULT_GROUPS
# 5.3
LIBCFS_LOOKUP_USER_KEY
- LIBCFS_FORCE_SIG_WITH_TASK
LIBCFS_CACHE_DETAIL_WRITERS
# 5.4
LIBCFS_GENL_DUMPIT_INFO
}
#endif /* HAVE_KREF_READ */
-#ifdef HAVE_FORCE_SIG_WITH_TASK
-#define cfs_force_sig(sig, task) force_sig((sig), (task))
-#else
-#define cfs_force_sig(sig, task) \
-do { \
- unsigned long flags; \
- \
- spin_lock_irqsave(&task->sighand->siglock, flags); \
- task->sighand->action[sig - 1].sa.sa_handler = SIG_DFL; \
- send_sig(sig, task, 1); \
- spin_unlock_irqrestore(&task->sighand->siglock, flags); \
-} while (0)
-#endif
-
void cfs_arch_init(void);
#ifndef container_of_safe
int rc;
ENTRY;
+ /*
+ * thread is spawned with all signals set to SIG_IGN, re-enable
+ * SIGINT for lfsck_stop() to awaken and stop the thread.
+ */
+ allow_signal(SIGINT);
spin_lock(&lfsck->li_lock);
lfsck->li_task = current;
spin_unlock(&lfsck->li_lock);
GOTO(fini, rc);
}
+ /*
+ * thread is spawned with all signals set to SIG_IGN, re-enable
+ * SIGINT for lfsck_stop() to awaken and stop the thread.
+ */
+ allow_signal(SIGINT);
spin_lock(&lad->lad_lock);
lad->lad_task = current;
thread_set_flags(athread, SVC_RUNNING);
thread_set_flags(thread, SVC_STOPPING);
- LASSERT(lfsck->li_task != NULL);
- cfs_force_sig(SIGINT, lfsck->li_task);
+ LASSERT(lfsck->li_task);
+ send_sig(SIGINT, lfsck->li_task, 1);
if (lfsck->li_master) {
struct lfsck_component *com;
list_for_each_entry(com, &lfsck->li_list_scan, lc_link) {
lad = com->lc_data;
spin_lock(&lad->lad_lock);
- if (lad->lad_task != NULL)
- cfs_force_sig(SIGINT, lad->lad_task);
+ if (lad->lad_task)
+ send_sig(SIGINT, lad->lad_task, 1);
spin_unlock(&lad->lad_lock);
}
list_for_each_entry(com, &lfsck->li_list_double_scan, lc_link) {
lad = com->lc_data;
spin_lock(&lad->lad_lock);
- if (lad->lad_task != NULL)
- cfs_force_sig(SIGINT, lad->lad_task);
+ if (lad->lad_task)
+ send_sig(SIGINT, lad->lad_task, 1);
spin_unlock(&lad->lad_lock);
}
}