aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorDan Williams <dan.j.williams@intel.com>2022-04-28 16:54:48 -0700
committerVishal Verma <vishal.l.verma@intel.com>2022-06-15 16:28:51 -0600
commit8186ec87dcd1b347ab0ee27ec5e87bda8c9a67e2 (patch)
treee77f86db0e971b620a52746659281615ddc7d50d
parent2f3851912624e9ede3132cd3749b4f60a348b1d4 (diff)
ndctl/dimm: Flush invalidated labels after overwrite
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. Link: https://lore.kernel.org/all/165118817010.1772793.5101398830527716084.stgit@dwillia2-desk3.amr.corp.intel.com/ Link: https://lore.kernel.org/r/165119008839.1783158.3766085644383173318.stgit@dwillia2-desk3.amr.corp.intel.com Cc: Jeff Moyer <jmoyer@redhat.com> Cc: Dave Jiang <dave.jiang@intel.com> Acked-by: Jeff Moyer <jmoyer@redhat.com> Signed-off-by: Dan Williams <dan.j.williams@intel.com> Signed-off-by: Vishal Verma <vishal.l.verma@intel.com>
-rw-r--r--ndctl/dimm.c34
1 files changed, 22 insertions, 12 deletions
diff --git a/ndctl/dimm.c b/ndctl/dimm.c
index d9718a33..ac7c5270 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,