From 3c7a9be77d2dbc037728226b103f9c57e49bcaad Mon Sep 17 00:00:00 2001 From: Jeremy Kerr Date: Wed, 13 Jul 2022 13:19:24 +0800 Subject: [PATCH] nvme: Introduce a union in struct nvme_dev for different transport types This change modifies struct nvme_dev to allow for future transport types, by moving the transport-specific data into a union. We will add new types in a future change. Signed-off-by: Jeremy Kerr --- nvme.c | 10 ++++++---- nvme.h | 27 +++++++++++++++++++++++---- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/nvme.c b/nvme.c index 50099a92..95c23ed4 100644 --- a/nvme.c +++ b/nvme.c @@ -207,12 +207,12 @@ static ssize_t getrandom_bytes(void *buf, size_t buflen) static bool is_chardev(struct nvme_dev *dev) { - return S_ISCHR(dev->stat.st_mode); + return S_ISCHR(dev->direct.stat.st_mode); } static bool is_blkdev(struct nvme_dev *dev) { - return S_ISBLK(dev->stat.st_mode); + return S_ISBLK(dev->direct.stat.st_mode); } static int open_dev(struct nvme_dev **devp, char *devstr, int flags) @@ -223,15 +223,17 @@ static int open_dev(struct nvme_dev **devp, char *devstr, int flags) dev = calloc(1, sizeof(*dev)); if (!dev) return -1; + + dev->type = NVME_DEV_DIRECT; dev->name = basename(devstr); err = open(devstr, flags); if (err < 0) { perror(devstr); goto err_free; } - dev->fd = err; + dev->direct.fd = err; - err = fstat(dev_fd(dev), &dev->stat); + err = fstat(dev_fd(dev), &dev->direct.stat); if (err < 0) { perror(devstr); goto err_close; diff --git a/nvme.h b/nvme.h index 549cd9cd..0f0f1ead 100644 --- a/nvme.h +++ b/nvme.h @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -37,15 +38,33 @@ enum nvme_print_flags { #define SYS_NVME "/sys/class/nvme" +enum nvme_dev_type { + NVME_DEV_DIRECT, +}; + struct nvme_dev { - int fd; - struct stat stat; + enum nvme_dev_type type; + union { + struct { + int fd; + struct stat stat; + } direct; + }; + const char *name; }; -static inline int dev_fd(struct nvme_dev *dev) +#define dev_fd(d) __dev_fd(d, __func__, __LINE__) + +static inline int __dev_fd(struct nvme_dev *dev, const char *func, int line) { - return dev->fd; + if (dev->type != NVME_DEV_DIRECT) { + fprintf(stderr, + "warning: %s:%d not a direct transport!\n", + func, line); + return -1; + } + return dev->direct.fd; } void register_extension(struct plugin *plugin); -- 2.50.1