From 9e0be15d0d0bb0a55cd6996c786e1536a82c221b Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Wed, 27 Feb 2013 17:05:25 -0800 Subject: [PATCH] --- yaml --- r: 359399 b: refs/heads/master c: 3a2d63f87989e01437ba994df5f297528c353d7d h: refs/heads/master i: 359397: 7fe7b3a452c84dec35e51ace090dc9d97aee2689 359395: 867412c9d13ea54b836a70e92929f13a4ed541cf 359391: 0bfa4a82a99f8a8ab04f017d87941120da4369c3 v: v3 --- [refs] | 2 +- trunk/drivers/block/nbd.c | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 2721d0b6eb2d..7fa25f7dc09e 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 75f187aba5e7a3eea259041f85099029774a4c5b +refs/heads/master: 3a2d63f87989e01437ba994df5f297528c353d7d diff --git a/trunk/drivers/block/nbd.c b/trunk/drivers/block/nbd.c index 695c68fedd32..869861a87f40 100644 --- a/trunk/drivers/block/nbd.c +++ b/trunk/drivers/block/nbd.c @@ -608,12 +608,20 @@ static int __nbd_ioctl(struct block_device *bdev, struct nbd_device *nbd, struct request sreq; dev_info(disk_to_dev(nbd->disk), "NBD_DISCONNECT\n"); + if (!nbd->sock) + return -EINVAL; + mutex_unlock(&nbd->tx_lock); + fsync_bdev(bdev); + mutex_lock(&nbd->tx_lock); blk_rq_init(NULL, &sreq); sreq.cmd_type = REQ_TYPE_SPECIAL; nbd_cmd(&sreq) = NBD_CMD_DISC; + + /* Check again after getting mutex back. */ if (!nbd->sock) return -EINVAL; + nbd_send_req(nbd, &sreq); return 0; } @@ -627,6 +635,7 @@ static int __nbd_ioctl(struct block_device *bdev, struct nbd_device *nbd, nbd_clear_que(nbd); BUG_ON(!list_empty(&nbd->queue_head)); BUG_ON(!list_empty(&nbd->waiting_queue)); + kill_bdev(bdev); if (file) fput(file); return 0; @@ -719,6 +728,7 @@ static int __nbd_ioctl(struct block_device *bdev, struct nbd_device *nbd, nbd->file = NULL; nbd_clear_que(nbd); dev_warn(disk_to_dev(nbd->disk), "queue cleared\n"); + kill_bdev(bdev); queue_flag_clear_unlocked(QUEUE_FLAG_DISCARD, nbd->disk->queue); if (file) fput(file);