#endif /* !HAVE_KSTRTOBOOL_FROM_USER */
/* Block all signals except for the @sigs */
-sigset_t cfs_block_sigsinv(unsigned long sigs)
+void cfs_block_sigsinv(unsigned long sigs, sigset_t *old)
{
- unsigned long flags;
- sigset_t old;
-
- spin_lock_irqsave(¤t->sighand->siglock, flags);
- old = current->blocked;
- sigaddsetmask(¤t->blocked, ~sigs);
- recalc_sigpending();
- spin_unlock_irqrestore(¤t->sighand->siglock, flags);
- return old;
+ sigset_t new;
+
+ siginitsetinv(&new, sigs);
+ sigorsets(&new, ¤t->blocked, &new);
+ sigprocmask(SIG_BLOCK, &new, old);
}
EXPORT_SYMBOL(cfs_block_sigsinv);
void
-cfs_restore_sigs(sigset_t old)
+cfs_restore_sigs(sigset_t *old)
{
- unsigned long flags;
-
- spin_lock_irqsave(¤t->sighand->siglock, flags);
- current->blocked = old;
- recalc_sigpending();
- spin_unlock_irqrestore(¤t->sighand->siglock, flags);
+ sigprocmask(SIG_SETMASK, old, NULL);
}
EXPORT_SYMBOL(cfs_restore_sigs);