[PATCH V2 nvme-cli 1/2] initialize disk "access" variable

Chaitanya Kulkarni chaitanyak at nvidia.com
Mon Sep 27 12:34:35 PDT 2021


On 9/26/21 6:41 PM, chengjike wrote:
> External email: Use caution opening links or attachments
> 
> 
> When it is failed to get nvme_id_ns data from NVMe Subsystem, the failure may be caused
> by a link disconnection or an error code returned by the subsystem(such as NVME_SC_*).
> Then the "access" of disk is set to "faulty"(otherwise, set the value to "live").
> Some displaying content of fault device can be obtained from the disk attribute files.
> 

commit log is overly long and somewhat needs an improvement about what 
code changes we are doing... see below comments...

> Signed-off-by: chengjike <chengjike.cheng at huawei.com>
> ---
>   src/nvme/private.h |  1 +
>   src/nvme/tree.c    | 57 ++++++++++++++++++++++++++++++++++++++++++----
>   src/nvme/tree.h    |  8 +++++++
>   3 files changed, 61 insertions(+), 5 deletions(-)
> 
> diff --git a/src/nvme/private.h b/src/nvme/private.h
> index 2a151bf..255c1b1 100644
> --- a/src/nvme/private.h
> +++ b/src/nvme/private.h
> @@ -37,6 +37,7 @@ struct nvme_ns {
>          __u32 nsid;
>          char *name;
>          char *sysfs_dir;
> +       char *access;
> 
>          int lba_shift;
>          int lba_size;
> diff --git a/src/nvme/tree.c b/src/nvme/tree.c
> index 293b0c0..dea0f45 100644
> --- a/src/nvme/tree.c
> +++ b/src/nvme/tree.c
> @@ -229,9 +229,11 @@ nvme_ns_t nvme_subsystem_next_ns(nvme_subsystem_t s, nvme_ns_t n)
>   static void __nvme_free_ns(struct nvme_ns *n)
>   {
>          list_del_init(&n->entry);
> -       close(n->fd);
> +       if (n->fd > 0)
> +               close(n->fd);
>          free(n->name);
>          free(n->sysfs_dir);
> +       free(n->access);
>          free(n);
>   }
> 
> @@ -1023,9 +1025,6 @@ static int nvme_configure_ctrl(nvme_ctrl_t c, const char *path,
>          closedir(d);
> 
>          c->fd = nvme_open(name);
> -       if (c->fd < 0)
> -               return c->fd;
> -
>          c->name = strdup(name);
>          c->sysfs_dir = (char *)path;
>          c->firmware = nvme_get_ctrl_attr(c, "firmware_rev");
> @@ -1277,6 +1276,11 @@ const char *nvme_ns_get_name(nvme_ns_t n)
>          return n->name;
>   }
> 
> +const char *nvme_ns_get_access(nvme_ns_t n)
> +{
> +       return n->access;
> +}
> +

why introduce a function that is not used in this patch ? Is this a prep 
patch if so please update the commit log accordingly.

>   const char *nvme_ns_get_model(nvme_ns_t n)
>   {
>          return n->c ? n->c->model : n->s->model;
> @@ -1515,6 +1519,37 @@ free_ns:
>          return NULL;
>   }
> 
> +static nvme_ns_t nvme_ns_get_local_data(const char *name, const char *path)
> +{
> +       struct nvme_ns *n;
> +       char *ns_id;
> +
> +       n = calloc(1, sizeof(*n));
> +       if (!n) {
> +               errno = ENOMEM;
> +               return NULL;
> +       }
> +       memset(n, 0, sizeof(struct nvme_ns));
> +

setting the memory to zero when allocating from calloc()  ?

> +       n->name = strdup(name);
> +       n->fd = -1;
> +       ns_id = nvme_get_attr(path, "nsid");
> +       if (!ns_id)
> +               goto free_ns;

this label is used only once just return here and remove the goto label.

> +       n->nsid = atoi(ns_id);
> +       free(ns_id);
> +
> +       list_head_init(&n->paths);
> +       list_node_init(&n->entry);
> +
> +       return n;
> +
> +free_ns:
> +       free(n->name);
> +       free(n);
> +       return NULL;

above error handling code should be moved to if (!ns_id) ...

> +}
> +
>   static struct nvme_ns *__nvme_scan_namespace(const char *sysfs_dir, const char *name)
>   {
>          struct nvme_ns *n;
> @@ -1528,9 +1563,21 @@ static struct nvme_ns *__nvme_scan_namespace(const char *sysfs_dir, const char *
>          }
> 
>          n = nvme_ns_open(name);
> -       if (!n)
> +       if (!n) {
> +               n = nvme_ns_get_local_data(name, path);
> +               if (!n)
> +                       goto free_path;
> +               ret = asprintf(&n->access, "%s", "faulty");
> +               if (ret < 0)
> +                       goto free_path;
> +               goto get_attr;
> +       }
> +
> +       ret = asprintf(&n->access, "%s", "live");
> +       if (ret < 0)
>                  goto free_path;
> 
> +get_attr:
>          n->sysfs_dir = path;
>          return n;
> 
> diff --git a/src/nvme/tree.h b/src/nvme/tree.h
> index 68f5cbf..7d3d049 100644
> --- a/src/nvme/tree.h
> +++ b/src/nvme/tree.h
> @@ -452,6 +452,14 @@ const char *nvme_ns_get_sysfs_dir(nvme_ns_t n);
>    */
>   const char *nvme_ns_get_name(nvme_ns_t n);
> 
> +/**
> + * nvme_ns_get_access() -
> + * @n:
> + *
> + * Return:
> + */

Wrong function documentation comment, you need to be more descriptive
wht the function is doing...

> +const char *nvme_ns_get_access(nvme_ns_t n);
> +
>   /**
>    * nvme_ns_get_firmware() -
>    * @n:
> --
> 2.21.0.windows.1
> 



More information about the Linux-nvme mailing list