]> git.karo-electronics.de Git - linux-beck.git/commitdiff
Orangefs: update signal blocking code before Oleg sees it.
authorMike Marshall <hubcap@omnibond.com>
Tue, 29 Sep 2015 16:07:46 +0000 (12:07 -0400)
committerMike Marshall <hubcap@omnibond.com>
Sat, 3 Oct 2015 15:44:36 +0000 (11:44 -0400)
Signed-off-by: Mike Marshall <hubcap@omnibond.com>
fs/orangefs/pvfs2-kernel.h
fs/orangefs/pvfs2-utils.c
fs/orangefs/waitqueue.c

index be30111b40d2f7c6bc5b0b4cecf32c494a56216b..299b48c37cab894917b57c36a8bd8fbd971b1f81 100644 (file)
@@ -649,9 +649,9 @@ void pvfs2_op_initialize(struct pvfs2_kernel_op_s *op);
 
 void pvfs2_make_bad_inode(struct inode *inode);
 
-void mask_blocked_signals(sigset_t *orig_sigset);
+void block_signals(sigset_t *);
 
-void unmask_blocked_signals(sigset_t *orig_sigset);
+void set_signals(sigset_t *);
 
 int pvfs2_unmount_sb(struct super_block *sb);
 
index 11ee073ecd19c2d5b193ca0037b801fd13aa2d84..834e06674d0ae50de5670259a5042c97f25ea47f 100644 (file)
@@ -632,36 +632,25 @@ void pvfs2_make_bad_inode(struct inode *inode)
        }
 }
 
-/* this code is based on linux/net/sunrpc/clnt.c:rpc_clnt_sigmask */
-void mask_blocked_signals(sigset_t *orig_sigset)
+/* Block all blockable signals... */
+void block_signals(sigset_t *orig_sigset)
 {
-       unsigned long sigallow = sigmask(SIGKILL);
-       unsigned long irqflags = 0;
-       struct k_sigaction *action = pvfs2_current_sigaction;
-
-       sigallow |= ((action[SIGINT - 1].sa.sa_handler == SIG_DFL) ?
-                    sigmask(SIGINT) :
-                    0);
-       sigallow |= ((action[SIGQUIT - 1].sa.sa_handler == SIG_DFL) ?
-                    sigmask(SIGQUIT) :
-                    0);
-
-       spin_lock_irqsave(&pvfs2_current_signal_lock, irqflags);
-       *orig_sigset = current->blocked;
-       siginitsetinv(&current->blocked, sigallow & ~orig_sigset->sig[0]);
-       recalc_sigpending();
-       spin_unlock_irqrestore(&pvfs2_current_signal_lock, irqflags);
+       sigset_t mask;
+
+       /*
+        * Initialize all entries in the signal set to the
+        * inverse of the given mask.
+        */
+       siginitsetinv(&mask, sigmask(SIGKILL));
+
+       /* Block 'em Danno... */
+       sigprocmask(SIG_BLOCK, &mask, orig_sigset);
 }
 
-/* this code is based on linux/net/sunrpc/clnt.c:rpc_clnt_sigunmask */
-void unmask_blocked_signals(sigset_t *orig_sigset)
+/* set the signal mask to the given template... */
+void set_signals(sigset_t *sigset)
 {
-       unsigned long irqflags = 0;
-
-       spin_lock_irqsave(&pvfs2_current_signal_lock, irqflags);
-       current->blocked = *orig_sigset;
-       recalc_sigpending();
-       spin_unlock_irqrestore(&pvfs2_current_signal_lock, irqflags);
+       sigprocmask(SIG_SETMASK, sigset, NULL);
 }
 
 __u64 pvfs2_convert_time_field(void *time_ptr)
index ad79e534dc8e9a903a4e01d4a7a40bcb721d627b..d7b0eba043ab1e55be74f296e99e710034ec76d0 100644 (file)
@@ -80,7 +80,7 @@ retry_servicing:
 
        /* mask out signals if this operation is not to be interrupted */
        if (!(flags & PVFS2_OP_INTERRUPTIBLE))
-               mask_blocked_signals(&orig_sigset);
+               block_signals(&orig_sigset);
 
        if (!(flags & PVFS2_OP_NO_SEMAPHORE)) {
                ret = mutex_lock_interruptible(&request_mutex);
@@ -90,7 +90,7 @@ retry_servicing:
                 */
                if (ret < 0) {
                        if (!(flags & PVFS2_OP_INTERRUPTIBLE))
-                               unmask_blocked_signals(&orig_sigset);
+                               set_signals(&orig_sigset);
                        op->downcall.status = ret;
                        gossip_debug(GOSSIP_WAIT_DEBUG,
                                     "pvfs2: service_operation interrupted.\n");
@@ -160,7 +160,7 @@ retry_servicing:
        }
 
        if (!(flags & PVFS2_OP_INTERRUPTIBLE))
-               unmask_blocked_signals(&orig_sigset);
+               set_signals(&orig_sigset);
 
        BUG_ON(ret != op->downcall.status);
        /* retry if operation has not been serviced and if requested */