|
@@ -122,17 +122,12 @@ static int sock_xmit(struct socket *sock, int send, void *buf, int size,
|
|
|
int result;
|
|
|
struct msghdr msg;
|
|
|
struct kvec iov;
|
|
|
- unsigned long flags;
|
|
|
- sigset_t oldset;
|
|
|
+ sigset_t blocked, oldset;
|
|
|
|
|
|
/* Allow interception of SIGKILL only
|
|
|
* Don't allow other signals to interrupt the transmission */
|
|
|
- spin_lock_irqsave(¤t->sighand->siglock, flags);
|
|
|
- oldset = current->blocked;
|
|
|
- sigfillset(¤t->blocked);
|
|
|
- sigdelsetmask(¤t->blocked, sigmask(SIGKILL));
|
|
|
- recalc_sigpending();
|
|
|
- spin_unlock_irqrestore(¤t->sighand->siglock, flags);
|
|
|
+ siginitsetinv(&blocked, sigmask(SIGKILL));
|
|
|
+ sigprocmask(SIG_SETMASK, &blocked, &oldset);
|
|
|
|
|
|
do {
|
|
|
sock->sk->sk_allocation = GFP_NOIO;
|
|
@@ -151,11 +146,9 @@ static int sock_xmit(struct socket *sock, int send, void *buf, int size,
|
|
|
|
|
|
if (signal_pending(current)) {
|
|
|
siginfo_t info;
|
|
|
- spin_lock_irqsave(¤t->sighand->siglock, flags);
|
|
|
printk(KERN_WARNING "nbd (pid %d: %s) got signal %d\n",
|
|
|
- current->pid, current->comm,
|
|
|
- dequeue_signal(current, ¤t->blocked, &info));
|
|
|
- spin_unlock_irqrestore(¤t->sighand->siglock, flags);
|
|
|
+ current->pid, current->comm,
|
|
|
+ dequeue_signal_lock(current, ¤t->blocked, &info));
|
|
|
result = -EINTR;
|
|
|
break;
|
|
|
}
|
|
@@ -169,10 +162,7 @@ static int sock_xmit(struct socket *sock, int send, void *buf, int size,
|
|
|
buf += result;
|
|
|
} while (size > 0);
|
|
|
|
|
|
- spin_lock_irqsave(¤t->sighand->siglock, flags);
|
|
|
- current->blocked = oldset;
|
|
|
- recalc_sigpending();
|
|
|
- spin_unlock_irqrestore(¤t->sighand->siglock, flags);
|
|
|
+ sigprocmask(SIG_SETMASK, &oldset, NULL);
|
|
|
|
|
|
return result;
|
|
|
}
|