Provide a helper routine to kick off a new ARS scrub if one is not
already running, or otherwise detect if ARS functionality is available.
Signed-off-by: Dan Williams <dan.j.williams(a)intel.com>
---
ndctl/lib/libndctl.c | 13 +++++++++++++
ndctl/lib/libndctl.sym | 1 +
ndctl/libndctl.h | 1 +
3 files changed, 15 insertions(+)
diff --git a/ndctl/lib/libndctl.c b/ndctl/lib/libndctl.c
index ff0d44ffefe6..21dd7207ea5e 100644
--- a/ndctl/lib/libndctl.c
+++ b/ndctl/lib/libndctl.c
@@ -1146,6 +1146,19 @@ static int __ndctl_bus_get_scrub_state(struct ndctl_bus *bus,
}
}
+NDCTL_EXPORT int ndctl_bus_start_scrub(struct ndctl_bus *bus)
+{
+ struct ndctl_ctx *ctx = ndctl_bus_get_ctx(bus);
+ int rc;
+
+ rc = sysfs_write_attr(ctx, bus->scrub_path, "1\n");
+ if (rc == -EBUSY)
+ return rc;
+ else if (rc < 0)
+ return -EOPNOTSUPP;
+ return 0;
+}
+
NDCTL_EXPORT int ndctl_bus_get_scrub_state(struct ndctl_bus *bus)
{
unsigned int scrub_count = 0;
diff --git a/ndctl/lib/libndctl.sym b/ndctl/lib/libndctl.sym
index 06cace96724f..fd8f37d1783e 100644
--- a/ndctl/lib/libndctl.sym
+++ b/ndctl/lib/libndctl.sym
@@ -353,4 +353,5 @@ global:
ndctl_region_get_persistence_domain;
ndctl_bus_get_persistence_domain;
ndctl_bus_get_scrub_state;
+ ndctl_bus_start_scrub;
} LIBNDCTL_14;
diff --git a/ndctl/libndctl.h b/ndctl/libndctl.h
index 36c04d871bd5..e690f9483fbf 100644
--- a/ndctl/libndctl.h
+++ b/ndctl/libndctl.h
@@ -122,6 +122,7 @@ int ndctl_bus_wait_probe(struct ndctl_bus *bus);
int ndctl_bus_wait_for_scrub_completion(struct ndctl_bus *bus);
unsigned int ndctl_bus_get_scrub_count(struct ndctl_bus *bus);
int ndctl_bus_get_scrub_state(struct ndctl_bus *bus);
+int ndctl_bus_start_scrub(struct ndctl_bus *bus);
int ndctl_bus_has_error_injection(struct ndctl_bus *bus);
struct ndctl_dimm;