diff options
-rw-r--r-- | drivers/block/nbd.c | 7 | ||||
-rw-r--r-- | include/linux/nbd.h | 1 |
2 files changed, 7 insertions, 1 deletions
diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c index 4d62fe076b89..5fb6885516fa 100644 --- a/drivers/block/nbd.c +++ b/drivers/block/nbd.c @@ -598,8 +598,10 @@ static int __nbd_ioctl(struct block_device *bdev, struct nbd_device *lo, if (!lo->sock) return -EINVAL; + lo->disconnect = 1; + nbd_send_req(lo, &sreq); - return 0; + return 0; } case NBD_CLEAR_SOCK: { @@ -629,6 +631,7 @@ static int __nbd_ioctl(struct block_device *bdev, struct nbd_device *lo, lo->sock = SOCKET_I(inode); if (max_part > 0) bdev->bd_invalidated = 1; + lo->disconnect = 0; /* we're connected now */ return 0; } else { fput(file); @@ -701,6 +704,8 @@ static int __nbd_ioctl(struct block_device *bdev, struct nbd_device *lo, set_capacity(lo->disk, 0); if (max_part > 0) ioctl_by_bdev(bdev, BLKRRPART, 0); + if (lo->disconnect) /* user requested, ignore socket errors */ + return 0; return lo->harderror; } diff --git a/include/linux/nbd.h b/include/linux/nbd.h index d146ca10c0f5..e6fe17431b95 100644 --- a/include/linux/nbd.h +++ b/include/linux/nbd.h @@ -68,6 +68,7 @@ struct nbd_device { u64 bytesize; pid_t pid; /* pid of nbd-client, if attached */ int xmit_timeout; + int disconnect; /* a disconnect has been requested by user */ }; #endif |