diff mbox

[ndctl,v2] ndctl, list: fix namespace json object parenting

Message ID 152098394967.38244.14033629842721195081.stgit@dwillia2-desk3.amr.corp.intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Dan Williams March 13, 2018, 11:33 p.m. UTC
When listing namespaces and regions a generic jplatform object is
created to house the regions array. However, commit f8cc6fee4e4d "ndctl,
list: refactor core topology walking into util_filter_walk()"
inadvertently added namespaces to that jplatform, and otherwise failed
to parent namespaces to their proper parent region.

    # ndctl list -RNu
    {
      "regions":[
        {
          "dev":"region1",
          "size":"511.00 GiB (548.68 GB)",
          "available_size":0,
          "type":"pmem",
          "numa_node":0,
          "namespaces":[
            {
              "dev":"namespace1.0",
              "mode":"raw",
              "size":"511.00 GiB (548.68 GB)",
              "sector_size":512,
              "blockdev":"pmem1",
              "numa_node":0
            },
            {
              "dev":"namespace0.0", <------- wrong region
              "mode":"fsdax",
              "size":"4.00 GiB (4.29 GB)",
              "sector_size":512,
              "blockdev":"pmem0",
              "numa_node":0
            }
          ]
        },
        {
          "dev":"region0",
          "size":"4.00 GiB (4.29 GB)",
          "available_size":0,
          "type":"pmem"
        }
      ],
      "namespaces":[  <------ we already listed the namespaces
        {
          "dev":"namespace1.0",
          "mode":"raw",
          "size":"511.00 GiB (548.68 GB)",
          "sector_size":512,
          "blockdev":"pmem1",
          "numa_node":0
        },
        {
          "dev":"namespace0.0",
          "mode":"fsdax",
          "size":"4.00 GiB (4.29 GB)",
          "sector_size":512,
          "blockdev":"pmem0",
          "numa_node":0
        }
      ]
    }
    ndctl: json_object.c:188: json_object_put: Assertion `jso->_ref_count > 0' failed.
    Aborted (core dumped)  <------ not ideal

Clear out the jnamespaces tracking as the filter walk transitions to the
next region, and make sure that jnamepsaces is not added to jplatform
when regions are being displayed.

Fixes: f8cc6fee4e4d(" ndctl, list: refactor core topology walking...")
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
---
v2: fix breaking namespace arrays on region boundaries

 ndctl/list.c |    9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

Comments

Verma, Vishal L March 15, 2018, 11:46 p.m. UTC | #1
On Tue, 2018-03-13 at 16:33 -0700, Dan Williams wrote:
> When listing namespaces and regions a generic jplatform object is
> created to house the regions array. However, commit f8cc6fee4e4d
> "ndctl,
> list: refactor core topology walking into util_filter_walk()"
> inadvertently added namespaces to that jplatform, and otherwise
> failed
> to parent namespaces to their proper parent region.
> 
>     # ndctl list -RNu
>     {
>       "regions":[
>         {
>           "dev":"region1",
>           "size":"511.00 GiB (548.68 GB)",
>           "available_size":0,
>           "type":"pmem",
>           "numa_node":0,
>           "namespaces":[
>             {
>               "dev":"namespace1.0",
>               "mode":"raw",
>               "size":"511.00 GiB (548.68 GB)",
>               "sector_size":512,
>               "blockdev":"pmem1",
>               "numa_node":0
>             },
>             {
>               "dev":"namespace0.0", <------- wrong region
>               "mode":"fsdax",
>               "size":"4.00 GiB (4.29 GB)",
>               "sector_size":512,
>               "blockdev":"pmem0",
>               "numa_node":0
>             }
>           ]
>         },
>         {
>           "dev":"region0",
>           "size":"4.00 GiB (4.29 GB)",
>           "available_size":0,
>           "type":"pmem"
>         }
>       ],
>       "namespaces":[  <------ we already listed the namespaces
>         {
>           "dev":"namespace1.0",
>           "mode":"raw",
>           "size":"511.00 GiB (548.68 GB)",
>           "sector_size":512,
>           "blockdev":"pmem1",
>           "numa_node":0
>         },
>         {
>           "dev":"namespace0.0",
>           "mode":"fsdax",
>           "size":"4.00 GiB (4.29 GB)",
>           "sector_size":512,
>           "blockdev":"pmem0",
>           "numa_node":0
>         }
>       ]
>     }
>     ndctl: json_object.c:188: json_object_put: Assertion `jso-
> >_ref_count > 0' failed.
>     Aborted (core dumped)  <------ not ideal
> 
> Clear out the jnamespaces tracking as the filter walk transitions to
> the
> next region, and make sure that jnamepsaces is not added to jplatform
> when regions are being displayed.
> 
> Fixes: f8cc6fee4e4d(" ndctl, list: refactor core topology
> walking...")
> Signed-off-by: Dan Williams <dan.j.williams@intel.com>
> ---
> v2: fix breaking namespace arrays on region boundaries
> 
>  ndctl/list.c |    9 ++++++++-
>  1 file changed, 8 insertions(+), 1 deletion(-)

Looks good, queued.

> 
> diff --git a/ndctl/list.c b/ndctl/list.c
> index 0ca5b6dee5eb..fe8036eabc3b 100644
> --- a/ndctl/list.c
> +++ b/ndctl/list.c
> @@ -245,6 +245,13 @@ static bool filter_region(struct ndctl_region
> *region,
>  	lfa->jregion = jregion;
>  
>  	/*
> +	 * We've started a new region, any previous jnamespaces will
> +	 * have been parented to the last region. Clear out
> jnamespaces
> +	 * so we start a new array per region.
> +	 */
> +	lfa->jnamespaces = NULL;
> +
> +	/*
>  	 * Without a bus we are collecting regions anonymously
> across
>  	 * the platform.
>  	 */
> @@ -366,7 +373,7 @@ static int list_display(struct list_filter_arg
> *lfa)
>  			json_object_object_add(jplatform, "dimms",
> jdimms);
>  		if (jregions)
>  			json_object_object_add(jplatform, "regions",
> jregions);
> -		if (jnamespaces)
> +		if (jnamespaces && !jregions)
>  			json_object_object_add(jplatform,
> "namespaces",
>  					jnamespaces);
>  		printf("%s\n",
> json_object_to_json_string_ext(jplatform,
>
diff mbox

Patch

diff --git a/ndctl/list.c b/ndctl/list.c
index 0ca5b6dee5eb..fe8036eabc3b 100644
--- a/ndctl/list.c
+++ b/ndctl/list.c
@@ -245,6 +245,13 @@  static bool filter_region(struct ndctl_region *region,
 	lfa->jregion = jregion;
 
 	/*
+	 * We've started a new region, any previous jnamespaces will
+	 * have been parented to the last region. Clear out jnamespaces
+	 * so we start a new array per region.
+	 */
+	lfa->jnamespaces = NULL;
+
+	/*
 	 * Without a bus we are collecting regions anonymously across
 	 * the platform.
 	 */
@@ -366,7 +373,7 @@  static int list_display(struct list_filter_arg *lfa)
 			json_object_object_add(jplatform, "dimms", jdimms);
 		if (jregions)
 			json_object_object_add(jplatform, "regions", jregions);
-		if (jnamespaces)
+		if (jnamespaces && !jregions)
 			json_object_object_add(jplatform, "namespaces",
 					jnamespaces);
 		printf("%s\n", json_object_to_json_string_ext(jplatform,