From c7a0275edf4109abaf33b01df9d93b758ff89f6b Mon Sep 17 00:00:00 2001 From: Liu Xiaodong Date: Mon, 1 Feb 2021 08:19:14 -0500 Subject: [PATCH] nbd: set io timeout After setting io timeout, host can avoid nbd io stuck or kernel hang occasionally caused by nbd stop or underlying bdev removal. Signed-off-by: Liu Xiaodong Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6191 (master) (cherry picked from commit b7c33b5e610fd8894a0d4a67894f71c750f357d1) Change-Id: I4ba2a0af7ff7bed369cdaf86121f082136dc1a0b Signed-off-by: Tomasz Zawadzki Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6394 Tested-by: SPDK CI Jenkins Reviewed-by: Jim Harris Reviewed-by: Ben Walker Reviewed-by: --- lib/nbd/nbd.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/lib/nbd/nbd.c b/lib/nbd/nbd.c index 2da906630..3a9299d32 100644 --- a/lib/nbd/nbd.c +++ b/lib/nbd/nbd.c @@ -50,6 +50,7 @@ #define GET_IO_LOOP_COUNT 16 #define NBD_BUSY_WAITING_MS 1000 #define NBD_BUSY_POLLING_INTERVAL_US 20000 +#define NBD_IO_TIMEOUT_S 60 enum nbd_io_state_t { /* Receiving or ready to receive nbd request header */ @@ -922,6 +923,17 @@ nbd_start_complete(struct spdk_nbd_start_ctx *ctx) goto err; } +#ifdef NBD_SET_TIMEOUT + rc = ioctl(ctx->nbd->dev_fd, NBD_SET_TIMEOUT, NBD_IO_TIMEOUT_S); + if (rc == -1) { + SPDK_ERRLOG("ioctl(NBD_SET_TIMEOUT) failed: %s\n", spdk_strerror(errno)); + rc = -errno; + goto err; + } +#else + SPDK_NOTICELOG("ioctl(NBD_SET_TIMEOUT) is not supported.\n"); +#endif + #ifdef NBD_FLAG_SEND_TRIM rc = ioctl(ctx->nbd->dev_fd, NBD_SET_FLAGS, NBD_FLAG_SEND_TRIM); if (rc == -1) {