diff --git a/lib/nbd/nbd.c b/lib/nbd/nbd.c index 5768c8ffd..15b8ddfad 100644 --- a/lib/nbd/nbd.c +++ b/lib/nbd/nbd.c @@ -37,6 +37,7 @@ #include #include "spdk/nbd.h" +#include "nbd_internal.h" #include "spdk/bdev.h" #include "spdk/endian.h" #include "spdk/env.h" @@ -72,6 +73,7 @@ struct spdk_nbd_disk { struct spdk_bdev_desc *bdev_desc; struct spdk_io_channel *ch; int dev_fd; + char *nbd_path; int kernel_sp_fd; int spdk_sp_fd; struct nbd_io io; @@ -98,6 +100,18 @@ spdk_nbd_fini(void) { } +const char * +spdk_nbd_disk_get_nbd_path(struct spdk_nbd_disk *nbd) +{ + return nbd->nbd_path; +} + +const char * +spdk_nbd_disk_get_bdev_name(struct spdk_nbd_disk *nbd) +{ + return spdk_bdev_get_name(nbd->bdev); +} + static bool is_read(enum spdk_bdev_io_type io_type) { @@ -135,6 +149,10 @@ _nbd_stop(struct spdk_nbd_disk *nbd) close(nbd->dev_fd); } + if (nbd->nbd_path) { + free(nbd->nbd_path); + } + if (nbd->spdk_sp_fd >= 0) { close(nbd->spdk_sp_fd); } @@ -473,6 +491,12 @@ spdk_nbd_start(const char *bdev_name, const char *nbd_path) nbd->spdk_sp_fd = sp[0]; nbd->kernel_sp_fd = sp[1]; + nbd->nbd_path = strdup(nbd_path); + if (!nbd->nbd_path) { + SPDK_ERRLOG("strdup allocation failure\n"); + goto err; + } + nbd->dev_fd = open(nbd_path, O_RDWR); if (nbd->dev_fd == -1) { spdk_strerror_r(errno, buf, sizeof(buf)); diff --git a/lib/nbd/nbd_internal.h b/lib/nbd/nbd_internal.h new file mode 100644 index 000000000..4b173c733 --- /dev/null +++ b/lib/nbd/nbd_internal.h @@ -0,0 +1,44 @@ +/*- + * BSD LICENSE + * + * Copyright (c) Intel Corporation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SPDK_NBD_INTERNAL_H +#define SPDK_NBD_INTERNAL_H + +#include "spdk/stdinc.h" +#include "spdk/nbd.h" + +const char *spdk_nbd_disk_get_nbd_path(struct spdk_nbd_disk *nbd); + +const char *spdk_nbd_disk_get_bdev_name(struct spdk_nbd_disk *nbd); + +#endif /* SPDK_NBD_INTERNAL_H */