From 96353bb19b13844c8edb3cb39eeafc59521403ae Mon Sep 17 00:00:00 2001 From: Xiaodong Liu Date: Wed, 3 Jan 2018 07:23:03 -0500 Subject: [PATCH] nbd: relocate 2 mop-up ioctls If spdk_nbd_stop is called because of socket error, ioctl of NBD_CLEAR_QUE and NBD_CLEAR_SOCK may be blocked which will cause deadlock. close(kernel_sp_fd/spdk_sp_fd) first, then nbd kernel module will not block them . Change-Id: I9527d74986cbd2b6188b9a91154de8b0b85d2836 Signed-off-by: Xiaodong Liu Reviewed-on: https://review.gerrithub.io/393581 Tested-by: SPDK Automated Test System Reviewed-by: Daniel Verkamp Reviewed-by: Jim Harris --- lib/nbd/nbd.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/nbd/nbd.c b/lib/nbd/nbd.c index f640600b5..9ed5df01f 100644 --- a/lib/nbd/nbd.c +++ b/lib/nbd/nbd.c @@ -228,12 +228,6 @@ _nbd_stop(struct spdk_nbd_disk *nbd) spdk_bdev_close(nbd->bdev_desc); } - if (nbd->dev_fd >= 0) { - ioctl(nbd->dev_fd, NBD_CLEAR_QUE); - ioctl(nbd->dev_fd, NBD_CLEAR_SOCK); - close(nbd->dev_fd); - } - if (nbd->nbd_path) { free(nbd->nbd_path); } @@ -246,6 +240,12 @@ _nbd_stop(struct spdk_nbd_disk *nbd) close(nbd->kernel_sp_fd); } + if (nbd->dev_fd >= 0) { + ioctl(nbd->dev_fd, NBD_CLEAR_QUE); + ioctl(nbd->dev_fd, NBD_CLEAR_SOCK); + close(nbd->dev_fd); + } + if (nbd->nbd_poller) { spdk_poller_unregister(&nbd->nbd_poller); }