diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/configure.ac | 4 | ||||
-rw-r--r-- | kernel/dev.c | 19 |
2 files changed, 23 insertions, 0 deletions
diff --git a/kernel/configure.ac b/kernel/configure.ac index a9f1ee8..1358f47 100644 --- a/kernel/configure.ac +++ b/kernel/configure.ac @@ -50,6 +50,10 @@ if echo "$kernsrcver" | grep -q "^2.4"; then AC_DEFINE(HAVE_I_SIZE_FUNC, 1, [Kernel has i_size_read() and i_size_write() functions]),, [#include <linux/fs.h>]) + AC_CHECK_DECL(recalc_sigpending_tsk, + AC_DEFINE(HAVE_RECALC_SIGPENDING_TSK, 1, + [Kernel has recalc_sigpending_tsk() function]),, + [#include <linux/sched.h>]) CFLAGS="$old_cflags" else fuse_configured=no diff --git a/kernel/dev.c b/kernel/dev.c index ef46eb9..8ce078b 100644 --- a/kernel/dev.c +++ b/kernel/dev.c @@ -65,6 +65,24 @@ static inline void restore_sigs(sigset_t *oldset) sigprocmask(SIG_SETMASK, oldset, NULL); } #else +#ifdef HAVE_RECALC_SIGPENDING_TSK +static inline void block_sigs(sigset_t *oldset) +{ + spin_lock_irq(¤t->sighand->siglock); + *oldset = current->blocked; + siginitsetinv(¤t->blocked, sigmask(SIGKILL) & ~oldset->sig[0]); + recalc_sigpending(); + spin_unlock_irq(¤t->sighand->siglock); +} + +static inline void restore_sigs(sigset_t *oldset) +{ + spin_lock_irq(¤t->sighand->siglock); + current->blocked = *oldset; + recalc_sigpending(); + spin_unlock_irq(¤t->sighand->siglock); +} +#else static inline void block_sigs(sigset_t *oldset) { spin_lock_irq(¤t->sigmask_lock); @@ -82,6 +100,7 @@ static inline void restore_sigs(sigset_t *oldset) spin_unlock_irq(¤t->sigmask_lock); } #endif +#endif void fuse_reset_request(struct fuse_req *req) { |