All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dan Williams <dan.j.williams@intel.com>
To: linux-nvdimm@lists.01.org
Subject: [ndctl PATCH 2/5] ndctl, scrub: report the bus scrub state in 'ndctl list'
Date: Wed, 04 Apr 2018 14:12:06 -0700	[thread overview]
Message-ID: <152287632679.29230.14997478290667449138.stgit@dwillia2-desk3.amr.corp.intel.com> (raw)
In-Reply-To: <152287631592.29230.11531789298631204393.stgit@dwillia2-desk3.amr.corp.intel.com>

In preparation for adding 'wait-scrub' and 'start-scrub' utility
helpers, indicate the current state of ARS operations in the listing for
bus objects. The field is omitted if the bus does not support ARS
operations.

Signed-off-by: Dan Williams <dan.j.williams@intel.com>
---
 ndctl/lib/libndctl.c   |   49 ++++++++++++++++++++++++++++++++++++++----------
 ndctl/lib/libndctl.sym |    1 +
 ndctl/libndctl.h       |    1 +
 util/json.c            |   10 ++++++++++
 4 files changed, 51 insertions(+), 10 deletions(-)

diff --git a/ndctl/lib/libndctl.c b/ndctl/lib/libndctl.c
index 743863b5c7e7..ff0d44ffefe6 100644
--- a/ndctl/lib/libndctl.c
+++ b/ndctl/lib/libndctl.c
@@ -1114,29 +1114,58 @@ NDCTL_EXPORT int ndctl_bus_wait_probe(struct ndctl_bus *bus)
 	return rc < 0 ? -ENXIO : 0;
 }
 
-NDCTL_EXPORT unsigned int ndctl_bus_get_scrub_count(struct ndctl_bus *bus)
+static int __ndctl_bus_get_scrub_state(struct ndctl_bus *bus,
+		unsigned int *scrub_count, bool *active)
 {
 	struct ndctl_ctx *ctx = ndctl_bus_get_ctx(bus);
 	char buf[SYSFS_ATTR_SIZE];
-	unsigned int scrub_count;
 	char in_progress = '\0';
 	int rc;
 
 	rc = sysfs_read_attr(ctx, bus->scrub_path, buf);
 	if (rc < 0)
-		return UINT_MAX;
+		return -EOPNOTSUPP;
 
-	rc = sscanf(buf, "%u%c", &scrub_count, &in_progress);
+	rc = sscanf(buf, "%u%c", scrub_count, &in_progress);
 	if (rc < 0)
-		return UINT_MAX;
-	if (rc == 0) {
+		return -ENXIO;
+
+	switch (rc) {
+	case 1:
+		*active = false;
+		return 0;
+	case 2:
+		if (in_progress == '+') {
+			*active = true;
+			return 0;
+		}
+		/* fall through */
+	default:
 		/* unable to read scrub count */
-		return UINT_MAX;
+		return -ENXIO;
 	}
-	if (rc >= 1)
-		return scrub_count;
+}
+
+NDCTL_EXPORT int ndctl_bus_get_scrub_state(struct ndctl_bus *bus)
+{
+	unsigned int scrub_count = 0;
+	bool active = false;
+	int rc;
+
+	rc = __ndctl_bus_get_scrub_state(bus, &scrub_count, &active);
+	if (rc < 0)
+		return rc;
+	return active;
+}
+
+NDCTL_EXPORT unsigned int ndctl_bus_get_scrub_count(struct ndctl_bus *bus)
+{
+	unsigned int scrub_count = 0;
+	bool active = false;
 
-	return UINT_MAX;
+	if (__ndctl_bus_get_scrub_state(bus, &scrub_count, &active))
+		return UINT_MAX;
+	return scrub_count;
 }
 
 /**
diff --git a/ndctl/lib/libndctl.sym b/ndctl/lib/libndctl.sym
index 3209aefe6672..06cace96724f 100644
--- a/ndctl/lib/libndctl.sym
+++ b/ndctl/lib/libndctl.sym
@@ -352,4 +352,5 @@ global:
 	ndctl_dimm_fw_update_supported;
 	ndctl_region_get_persistence_domain;
 	ndctl_bus_get_persistence_domain;
+	ndctl_bus_get_scrub_state;
 } LIBNDCTL_14;
diff --git a/ndctl/libndctl.h b/ndctl/libndctl.h
index cf6a77fd0992..36c04d871bd5 100644
--- a/ndctl/libndctl.h
+++ b/ndctl/libndctl.h
@@ -121,6 +121,7 @@ enum ndctl_persistence_domain ndctl_bus_get_persistence_domain(
 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_has_error_injection(struct ndctl_bus *bus);
 
 struct ndctl_dimm;
diff --git a/util/json.c b/util/json.c
index a464f21d6d5a..5b4b4c374d44 100644
--- a/util/json.c
+++ b/util/json.c
@@ -124,6 +124,7 @@ struct json_object *util_bus_to_json(struct ndctl_bus *bus)
 {
 	struct json_object *jbus = json_object_new_object();
 	struct json_object *jobj;
+	int scrub;
 
 	if (!jbus)
 		return NULL;
@@ -138,6 +139,15 @@ struct json_object *util_bus_to_json(struct ndctl_bus *bus)
 		goto err;
 	json_object_object_add(jbus, "dev", jobj);
 
+	scrub = ndctl_bus_get_scrub_state(bus);
+	if (scrub < 0)
+		return jbus;
+
+	jobj = json_object_new_string(scrub ? "active" : "idle");
+	if (!jobj)
+		goto err;
+	json_object_object_add(jbus, "scrub_state", jobj);
+
 	return jbus;
  err:
 	json_object_put(jbus);

_______________________________________________
Linux-nvdimm mailing list
Linux-nvdimm@lists.01.org
https://lists.01.org/mailman/listinfo/linux-nvdimm

  parent reply	other threads:[~2018-04-04 21:22 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-04-04 21:11 [ndctl PATCH 0/5] Address Range Scrub (ARS) Utilities Dan Williams
2018-04-04 21:12 ` [ndctl PATCH 1/5] ndctl, scrub: fix ndctl_bus_wait_for_scrub_completion() Dan Williams
2018-04-04 21:12 ` Dan Williams [this message]
2018-04-04 21:12 ` [ndctl PATCH 3/5] ndctl, scrub: add ndctl_bus_start_scrub() Dan Williams
2018-04-04 21:12 ` [ndctl PATCH 4/5] ndctl: add new START and WAIT actions Dan Williams
2018-04-04 21:12 ` [ndctl PATCH 5/5] ndctl, scrub: add {wait, start}-scrub helper utilities Dan Williams

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=152287632679.29230.14997478290667449138.stgit@dwillia2-desk3.amr.corp.intel.com \
    --to=dan.j.williams@intel.com \
    --cc=linux-nvdimm@lists.01.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.