From fe626a8a8a1b1bc94ea95c693ec672109909e3dc Mon Sep 17 00:00:00 2001 From: Redhairer Li Date: Thu, 28 Jan 2021 22:03:39 +0800 Subject: [PATCH 008/217] ndctl/namespace: Fix disable-namespace accounting relative to seed devices Seed namespaces are included in "ndctl disable-namespace all". However since the user never "creates" them it is surprising to see "disable-namespace" report 1 more namespace relative to the number that have been created. Catch attempts to disable a zero-sized namespace: Before: { "dev":"namespace1.0", "size":"492.00 MiB (515.90 MB)", "blockdev":"pmem1" } { "dev":"namespace1.1", "size":"492.00 MiB (515.90 MB)", "blockdev":"pmem1.1" } { "dev":"namespace1.2", "size":"492.00 MiB (515.90 MB)", "blockdev":"pmem1.2" } disabled 4 namespaces After: { "dev":"namespace1.0", "size":"492.00 MiB (515.90 MB)", "blockdev":"pmem1" } { "dev":"namespace1.3", "size":"492.00 MiB (515.90 MB)", "blockdev":"pmem1.3" } { "dev":"namespace1.1", "size":"492.00 MiB (515.90 MB)", "blockdev":"pmem1.1" } disabled 3 namespaces Signed-off-by: Redhairer Li Signed-off-by: Vishal Verma Link: https://lore.kernel.org/linux-nvdimm/20210128140339.3080-1-redhairer.li@intel.com/ --- ndctl/lib/libndctl.c | 10 ++++++++-- ndctl/namespace.c | 8 ++++---- ndctl/region.c | 2 +- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/ndctl/lib/libndctl.c b/ndctl/lib/libndctl.c index 36fb6fe..2f6d806 100644 --- a/ndctl/lib/libndctl.c +++ b/ndctl/lib/libndctl.c @@ -4602,6 +4602,7 @@ NDCTL_EXPORT int ndctl_namespace_disable_safe(struct ndctl_namespace *ndns) const char *bdev = NULL; char path[50]; int fd; + unsigned long long size = ndctl_namespace_get_size(ndns); if (pfn && ndctl_pfn_is_enabled(pfn)) bdev = ndctl_pfn_get_block_device(pfn); @@ -4631,8 +4632,13 @@ NDCTL_EXPORT int ndctl_namespace_disable_safe(struct ndctl_namespace *ndns) devname, bdev, strerror(errno)); return -errno; } - } else - ndctl_namespace_disable_invalidate(ndns); + } else { + if (size == 0) + /* No disable necessary due to no capacity allocated */ + return 1; + else + ndctl_namespace_disable_invalidate(ndns); + } return 0; } diff --git a/ndctl/namespace.c b/ndctl/namespace.c index 0c8df9f..1feb74d 100644 --- a/ndctl/namespace.c +++ b/ndctl/namespace.c @@ -1125,7 +1125,7 @@ static int namespace_prep_reconfig(struct ndctl_region *region, } rc = ndctl_namespace_disable_safe(ndns); - if (rc) + if (rc < 0) return rc; ndctl_namespace_set_enforce_mode(ndns, NDCTL_NS_MODE_RAW); @@ -1431,7 +1431,7 @@ static int dax_clear_badblocks(struct ndctl_dax *dax) return -ENXIO; rc = ndctl_namespace_disable_safe(ndns); - if (rc) { + if (rc < 0) { error("%s: unable to disable namespace: %s\n", devname, strerror(-rc)); return rc; @@ -1455,7 +1455,7 @@ static int pfn_clear_badblocks(struct ndctl_pfn *pfn) return -ENXIO; rc = ndctl_namespace_disable_safe(ndns); - if (rc) { + if (rc < 0) { error("%s: unable to disable namespace: %s\n", devname, strerror(-rc)); return rc; @@ -1478,7 +1478,7 @@ static int raw_clear_badblocks(struct ndctl_namespace *ndns) return -ENXIO; rc = ndctl_namespace_disable_safe(ndns); - if (rc) { + if (rc < 0) { error("%s: unable to disable namespace: %s\n", devname, strerror(-rc)); return rc; diff --git a/ndctl/region.c b/ndctl/region.c index 3edb9b3..4552c4a 100644 --- a/ndctl/region.c +++ b/ndctl/region.c @@ -70,7 +70,7 @@ static int region_action(struct ndctl_region *region, enum device_action mode) case ACTION_DISABLE: ndctl_namespace_foreach(region, ndns) { rc = ndctl_namespace_disable_safe(ndns); - if (rc) + if (rc < 0) return rc; } rc = ndctl_region_disable_invalidate(region); -- 2.27.0