From 3b9c5e9c6ae92233fcf5bad251c651b1ab6cda48 Mon Sep 17 00:00:00 2001 From: Xiaodong Liu Date: Sat, 2 Dec 2017 03:59:14 -0500 Subject: [PATCH] nbd: put get-bdev and register-poller to lib/nbd nbd poller is put into spdk_nbd_disk. nbd test app no longer needs to process spdk_bdev. This enables upcomming patches to move nbd test app functionality to SPDK library. Change-Id: I1b563a49dc9488e8dcc20706be82b17fdbd07ff1 Signed-off-by: Xiaodong Liu Reviewed-on: https://review.gerrithub.io/390093 Tested-by: SPDK Automated Test System Reviewed-by: Changpeng Liu Reviewed-by: Jim Harris Reviewed-by: Daniel Verkamp --- include/spdk/nbd.h | 9 +-------- lib/nbd/nbd.c | 38 +++++++++++++++++++++++++++++++++++--- test/lib/bdev/nbd/nbd.c | 28 +--------------------------- 3 files changed, 37 insertions(+), 38 deletions(-) diff --git a/include/spdk/nbd.h b/include/spdk/nbd.h index adb9aef9c..9df8b4d60 100644 --- a/include/spdk/nbd.h +++ b/include/spdk/nbd.h @@ -37,14 +37,7 @@ struct spdk_bdev; struct spdk_nbd_disk; -struct spdk_nbd_disk *spdk_nbd_start(struct spdk_bdev *bdev, const char *nbd_path); - -/** - * Poll an NBD instance. - * - * \return 0 on success or negated errno values on error (e.g. connection closed). - */ -int spdk_nbd_poll(struct spdk_nbd_disk *nbd); +struct spdk_nbd_disk *spdk_nbd_start(const char *bdev_name, const char *nbd_path); void spdk_nbd_stop(struct spdk_nbd_disk *nbd); diff --git a/lib/nbd/nbd.c b/lib/nbd/nbd.c index 0557d4eaf..a25658076 100644 --- a/lib/nbd/nbd.c +++ b/lib/nbd/nbd.c @@ -75,6 +75,7 @@ struct spdk_nbd_disk { int kernel_sp_fd; int spdk_sp_fd; struct nbd_io io; + struct spdk_poller *nbd_poller; uint32_t buf_align; }; @@ -123,6 +124,10 @@ _nbd_stop(struct spdk_nbd_disk *nbd) close(nbd->kernel_sp_fd); } + if (nbd->nbd_poller) { + spdk_poller_unregister(&nbd->nbd_poller); + } + free(nbd); } @@ -286,8 +291,13 @@ process_request(struct spdk_nbd_disk *nbd) return 0; } -int -spdk_nbd_poll(struct spdk_nbd_disk *nbd) +/** + * Poll an NBD instance. + * + * \return 0 on success or negated errno values on error (e.g. connection closed). + */ +static int +_spdk_nbd_poll(struct spdk_nbd_disk *nbd) { struct nbd_io *io = &nbd->io; int fd = nbd->spdk_sp_fd; @@ -355,6 +365,19 @@ spdk_nbd_poll(struct spdk_nbd_disk *nbd) return 0; } +static void +spdk_nbd_poll(void *arg) +{ + struct spdk_nbd_disk *nbd = arg; + int rc; + + rc = _spdk_nbd_poll(nbd); + if (rc < 0) { + SPDK_NOTICELOG("spdk_nbd_poll got error %d; close it", rc); + spdk_nbd_stop(nbd); + } +} + static void * nbd_start_kernel(void *arg) { @@ -388,15 +411,22 @@ nbd_start_kernel(void *arg) } struct spdk_nbd_disk * -spdk_nbd_start(struct spdk_bdev *bdev, const char *nbd_path) +spdk_nbd_start(const char *bdev_name, const char *nbd_path) { struct spdk_nbd_disk *nbd; + struct spdk_bdev *bdev; pthread_t tid; int rc; int sp[2]; char buf[64]; int flag; + bdev = spdk_bdev_get_by_name(bdev_name); + if (bdev == NULL) { + SPDK_ERRLOG("no bdev %s exists\n", bdev_name); + return NULL; + } + nbd = calloc(1, sizeof(*nbd)); if (nbd == NULL) { return NULL; @@ -478,6 +508,8 @@ spdk_nbd_start(struct spdk_bdev *bdev, const char *nbd_path) to_be32(&nbd->io.resp.magic, NBD_REPLY_MAGIC); nbd->io.req_in_progress = true; + nbd->nbd_poller = spdk_poller_register(spdk_nbd_poll, nbd, 0); + return nbd; err: diff --git a/test/lib/bdev/nbd/nbd.c b/test/lib/bdev/nbd/nbd.c index 4ef459d09..2c1fb87b4 100644 --- a/test/lib/bdev/nbd/nbd.c +++ b/test/lib/bdev/nbd/nbd.c @@ -43,7 +43,6 @@ #include "spdk/log.h" #include "spdk/util.h" -static struct spdk_poller *g_nbd_poller; static struct spdk_nbd_disk *g_nbd_disk; static char *g_bdev_name; static char *g_nbd_name = "/dev/nbd0"; @@ -53,43 +52,18 @@ static char *g_nbd_name = "/dev/nbd0"; static void nbd_shutdown(void) { - spdk_poller_unregister(&g_nbd_poller); - spdk_nbd_stop(g_nbd_disk); spdk_app_stop(0); } -static void -nbd_poll(void *arg) -{ - int rc; - - rc = spdk_nbd_poll(g_nbd_disk); - if (rc < 0) { - SPDK_NOTICELOG("spdk_nbd_poll() returned %d; shutting down", rc); - nbd_shutdown(); - } -} - static void nbd_start(void *arg1, void *arg2) { - struct spdk_bdev *bdev; - - bdev = spdk_bdev_get_by_name(g_bdev_name); - if (bdev == NULL) { - SPDK_ERRLOG("no bdev %s exists\n", g_bdev_name); - spdk_app_stop(-1); - return; - } - - g_nbd_disk = spdk_nbd_start(bdev, g_nbd_name); + g_nbd_disk = spdk_nbd_start(g_bdev_name, g_nbd_name); if (g_nbd_disk == NULL) { spdk_app_stop(-1); return; } - - g_nbd_poller = spdk_poller_register(nbd_poll, NULL, 0); } static void usage(char *program_name)