From: Keith Busch Date: Fri, 27 Mar 2020 23:43:22 +0000 (-0700) Subject: Export single namespace open X-Git-Tag: v1.0-rc0~157 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=39fe86ad3abe0e1242b72664663e724860efc0ed;p=users%2Fsagi%2Flibnvme.git Export single namespace open Signed-off-by: Keith Busch --- diff --git a/Makefile b/Makefile index 030f9abf..ef470bef 100644 --- a/Makefile +++ b/Makefile @@ -32,7 +32,7 @@ include config-host.mak endif SED_PROCESS = \ - $(SED) -e "s%@prefix@%$(prefix)%g" \ + sed -e "s%@prefix@%$(prefix)%g" \ -e "s%@libdir@%$(libdir)%g" \ -e "s%@includedir@%$(includedir)%g" \ -e "s%@NAME@%$(NAME)%g" \ diff --git a/examples/Makefile b/examples/Makefile index 3731d4ac..be867a76 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -1,5 +1,5 @@ CFLAGS ?= -g -O2 -override CFLAGS += -Wall -D_GNU_SOURCE -L../src/ -I../src/ +override CFLAGS += -Wall -D_GNU_SOURCE include ../Makefile.quiet diff --git a/src/Makefile b/src/Makefile index 8977e72a..129e624d 100644 --- a/src/Makefile +++ b/src/Makefile @@ -47,7 +47,7 @@ libccan_sobjs := $(patsubst %.c,%.os,$(libccan_srcs)) $(libccan_objs) $(libccan_sobjs): $(libccan_headers) $(CCANDIR)config.h libnvme_priv := nvme/private.h -libnvme_api := libnvme.h nvme/types.h nvme/ioctl.h nvme/filters.h nvme/tree.h nvme/util.h +libnvme_api := libnvme.h nvme/types.h nvme/ioctl.h nvme/filters.h nvme/tree.h nvme/util.h nvme/fabrics.h libnvme_srcs := nvme/ioctl.c nvme/filters.c nvme/fabrics.c nvme/util.c nvme/tree.c libnvme_objs := $(patsubst %.c,%.ol,$(libnvme_srcs)) libnvme_sobjs := $(patsubst %.c,%.os,$(libnvme_srcs)) diff --git a/src/libnvme.map b/src/libnvme.map index 6fb0c9e2..64c04b0a 100644 --- a/src/libnvme.map +++ b/src/libnvme.map @@ -207,11 +207,13 @@ nvme_path_get_ana_state; nvme_ns_get_sysfs_dir; nvme_ns_get_name; + nvme_ns_open; nvme_status_type; nvme_status_to_string; nvme_status_to_errno; nvme_fw_download_seq; nvme_get_telemetry_log; + nvme_get_ctrl_telemetry; nvme_setup_id_ns; nvme_setup_ctrl_list; nvme_dsm_range; diff --git a/src/nvme/tree.c b/src/nvme/tree.c index 05bfe74b..d850aa73 100644 --- a/src/nvme/tree.c +++ b/src/nvme/tree.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -51,6 +52,7 @@ struct nvme_ns { char *sysfs_dir; int nsid; + int lba_shift; int lba_size; int meta_size; uint64_t lba_count; @@ -668,8 +670,8 @@ static int nvme_bytes_to_lba(nvme_ns_t n, off_t offset, size_t count, return -1; } - *lba = offset / bs; - *nlb = (count / bs) - 1; + *lba = offset >> n->lba_shift; + *nlb = (count >> n->lba_shift) - 1; return 0; } @@ -807,32 +809,27 @@ static void nvme_ns_init(struct nvme_ns *n) if (nvme_ns_identify(n, &ns) != 0) return; - n->lba_size = 1 << ns.lbaf[ns.flbas & NVME_NS_FLBAS_LBA_MASK].ds; + n->lba_shift = ns.lbaf[ns.flbas & NVME_NS_FLBAS_LBA_MASK].ds; + n->lba_size = 1 << n->lba_shift; n->lba_count = le64_to_cpu(ns.nsze); n->lba_util = le64_to_cpu(ns.nuse); } -static struct nvme_ns *__nvme_scan_namespace(const char *sysfs_dir, char *name) + +nvme_ns_t nvme_ns_open(char *name) { + char *b = basename(name); struct nvme_ns *n; - char *path; - int ret; - - ret = asprintf(&path, "%s/%s", sysfs_dir, name); - if (ret < 0) { - errno = ENOMEM; - return NULL; - } n = calloc(1, sizeof(*n)); if (!n) { errno = ENOMEM; - goto free_path; + return NULL; } - n->name = strdup(name); - n->sysfs_dir = path; - n->fd = nvme_open(name); + n->name = strdup(b); + n->fd = nvme_open(b); + if (n->fd < 0) goto free_ns; @@ -849,6 +846,28 @@ close_fd: close(n->fd); free_ns: free(n); + return NULL; +} + +static struct nvme_ns *__nvme_scan_namespace(const char *sysfs_dir, char *name) +{ + struct nvme_ns *n; + char *path; + int ret; + + ret = asprintf(&path, "%s/%s", sysfs_dir, name); + if (ret < 0) { + errno = ENOMEM; + return NULL; + } + + n = nvme_ns_open(name); + if (!n) + goto free_path; + + n->sysfs_dir = path; + return n; + free_path: free(path); return NULL; diff --git a/src/nvme/tree.h b/src/nvme/tree.h index 172196a0..6cce9224 100644 --- a/src/nvme/tree.h +++ b/src/nvme/tree.h @@ -51,6 +51,12 @@ typedef struct nvme_root *nvme_root_t; */ typedef bool (*nvme_scan_filter_t)(nvme_subsystem_t); + +/** + * + */ +nvme_ns_t nvme_ns_open(char *name); + /** * nvme_first_subsystem() - * @r: