diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c index b53fdb0..38397d4 100644 --- a/drivers/block/nbd.c +++ b/drivers/block/nbd.c @@ -158,6 +158,14 @@ static int sock_xmit(struct nbd_device *lo, int send, void *buf, int size, siginitsetinv(&blocked, sigmask(SIGKILL)); sigprocmask(SIG_SETMASK, &blocked, &oldset); + if (!send) { + /* sleep 30s to expose race with 'nbd-client -d' */ + printk(KERN_WARNING "%s: sleeping 30s before recv in sock_xmit\n", + lo->disk->disk_name); + set_current_state(TASK_INTERRUPTIBLE); + schedule_timeout(msecs_to_jiffies(30000)); + } + do { sock->sk->sk_allocation = GFP_NOIO; iov.iov_base = buf; @@ -550,7 +558,14 @@ static int nbd_ioctl(struct inode *inode, struct file *file, case NBD_CLEAR_SOCK: error = 0; mutex_lock(&lo->tx_lock); - lo->sock = NULL; + if (lo->sock) { + lo->sock = NULL; + /* sleep 30s to expose race with sock_xmit */ + printk(KERN_WARNING "%s: sleeping 30s after setting sock to NULL in NBD_CLEAR_SOCK\n", + lo->disk->disk_name); + set_current_state(TASK_INTERRUPTIBLE); + schedule_timeout(msecs_to_jiffies(30000)); + } mutex_unlock(&lo->tx_lock); file = lo->file; lo->file = NULL;