Similar to "ndctl write-labels", after "ndctl sanitize-dimm --overwrite"
the kernel may contain a cached copy of the label area that has been
invalidated by the overwrite. Toggle the enabled state of the dimm-device
to trigger the kernel to release the cached copy.

Cc: Jeff Moyer <[email protected]>
Cc: Dave Jiang <[email protected]>
Link: 
https://lore.kernel.org/all/165118817010.1772793.5101398830527716084.st...@dwillia2-desk3.amr.corp.intel.com/
Signed-off-by: Dan Williams <[email protected]>
---
 ndctl/dimm.c |   34 ++++++++++++++++++++++------------
 1 file changed, 22 insertions(+), 12 deletions(-)

diff --git a/ndctl/dimm.c b/ndctl/dimm.c
index d9718a33b22f..ac7c5270e971 100644
--- a/ndctl/dimm.c
+++ b/ndctl/dimm.c
@@ -354,6 +354,23 @@ static int rw_bin(FILE *f, struct ndctl_cmd *cmd, ssize_t 
size,
        return 0;
 }
 
+static int revalidate_labels(struct ndctl_dimm *dimm)
+{
+       int rc;
+
+       /*
+        * If the dimm is already disabled the kernel is not holding a cached
+        * copy of the label space.
+        */
+       if (!ndctl_dimm_is_enabled(dimm))
+               return 0;
+
+       rc = ndctl_dimm_disable(dimm);
+       if (rc)
+               return rc;
+       return ndctl_dimm_enable(dimm);
+}
+
 static int action_write(struct ndctl_dimm *dimm, struct action_context *actx)
 {
        struct ndctl_cmd *cmd_read, *cmd_write;
@@ -377,18 +394,10 @@ static int action_write(struct ndctl_dimm *dimm, struct 
action_context *actx)
 
        size = ndctl_cmd_cfg_read_get_size(cmd_read);
        rc = rw_bin(actx->f_in, cmd_write, size, param.offset, WRITE);
-
-       /*
-        * If the dimm is already disabled the kernel is not holding a cached
-        * copy of the label space.
-        */
-       if (!ndctl_dimm_is_enabled(dimm))
-               goto out;
-
-       rc = ndctl_dimm_disable(dimm);
        if (rc)
                goto out;
-       rc = ndctl_dimm_enable(dimm);
+
+       rc = revalidate_labels(dimm);
 
  out:
        ndctl_cmd_unref(cmd_read);
@@ -1043,7 +1052,7 @@ static int action_security_freeze(struct ndctl_dimm *dimm,
 static int action_sanitize_dimm(struct ndctl_dimm *dimm,
                struct action_context *actx)
 {
-       int rc;
+       int rc = 0;
        enum ndctl_key_type key_type;
 
        if (ndctl_dimm_get_security(dimm) < 0) {
@@ -1085,9 +1094,10 @@ static int action_sanitize_dimm(struct ndctl_dimm *dimm,
                rc = ndctl_dimm_overwrite_key(dimm);
                if (rc < 0)
                        return rc;
+               rc = revalidate_labels(dimm);
        }
 
-       return 0;
+       return rc;
 }
 
 static int action_wait_overwrite(struct ndctl_dimm *dimm,


Reply via email to