diff options
author | Tarun Sahu <tsahu@linux.ibm.com> | 2022-05-02 12:34:54 +0530 |
---|---|---|
committer | Vishal Verma <vishal.l.verma@intel.com> | 2022-06-15 16:39:57 -0600 |
commit | 3e17210345482ec9795f1046c766564d3b8a0795 (patch) | |
tree | 7aeff1c83efd2f770be1ce3bad1ec31d198f881f | |
parent | 50e7a021314aa0365c9c85a359a31f26313fe93b (diff) |
ndctl/bus: Handle missing scrub commands more gracefully
Buses that don't have nfit support return "No such file or directory"
for start-scrub/wait-scrub command.
Presently, non-nfit support buses do not support start-scrub/ wait-scrub
operation. This patch is to handle these commands more gracefully by
returning" Operation not supported".
This has been tested on PPC64le lpar with nvdimm that does not support
scrub.
Previously:
$ ./ndctl start-scrub ndbus0
error starting scrub: No such file or directory
Now:
$ ./ndctl start-scrub ndbus0
error starting scrub: Operation not supported
- Invalid ndbus
$ sudo ./ndctl start-scrub ndbus5
error starting scrub: No such device or address
Link: https://lore.kernel.org/r/20220502070454.179153-1-tsahu@linux.ibm.com
Tested-by: Vaibhav Jain <vaibhav@linux.ibm.com>
Reviewed-by: Vaibhav Jain <vaibhav@linux.ibm.com>
Signed-off-by: Tarun Sahu <tsahu@linux.ibm.com>
Signed-off-by: Vishal Verma <vishal.l.verma@intel.com>
-rw-r--r-- | ndctl/lib/libndctl.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/ndctl/lib/libndctl.c b/ndctl/lib/libndctl.c index 110d8a5c..ad54f062 100644 --- a/ndctl/lib/libndctl.c +++ b/ndctl/lib/libndctl.c @@ -938,10 +938,14 @@ static void *add_bus(void *parent, int id, const char *ctl_base) if (!bus->wait_probe_path) goto err_read; - sprintf(path, "%s/device/nfit/scrub", ctl_base); - bus->scrub_path = strdup(path); - if (!bus->scrub_path) - goto err_read; + if (ndctl_bus_has_nfit(bus)) { + sprintf(path, "%s/device/nfit/scrub", ctl_base); + bus->scrub_path = strdup(path); + if (!bus->scrub_path) + goto err_read; + } else { + bus->scrub_path = NULL; + } sprintf(path, "%s/device/firmware/activate", ctl_base); if (sysfs_read_attr(ctx, path, buf) < 0) @@ -1377,6 +1381,9 @@ NDCTL_EXPORT int ndctl_bus_start_scrub(struct ndctl_bus *bus) struct ndctl_ctx *ctx = ndctl_bus_get_ctx(bus); int rc; + if (bus->scrub_path == NULL) + return -EOPNOTSUPP; + rc = sysfs_write_attr(ctx, bus->scrub_path, "1\n"); /* @@ -1447,6 +1454,9 @@ NDCTL_EXPORT int ndctl_bus_poll_scrub_completion(struct ndctl_bus *bus, char in_progress; int fd = 0, rc; + if (bus->scrub_path == NULL) + return -EOPNOTSUPP; + fd = open(bus->scrub_path, O_RDONLY|O_CLOEXEC); if (fd < 0) return -errno; |