95 lines
2.8 KiB
Diff
95 lines
2.8 KiB
Diff
|
From 8186ec87dcd1b347ab0ee27ec5e87bda8c9a67e2 Mon Sep 17 00:00:00 2001
|
||
|
From: Dan Williams <dan.j.williams@intel.com>
|
||
|
Date: Thu, 28 Apr 2022 16:54:48 -0700
|
||
|
Subject: [PATCH 170/217] 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>
|
||
|
---
|
||
|
ndctl/dimm.c | 34 ++++++++++++++++++++++------------
|
||
|
1 file changed, 22 insertions(+), 12 deletions(-)
|
||
|
|
||
|
diff --git a/ndctl/dimm.c b/ndctl/dimm.c
|
||
|
index d9718a3..ac7c527 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,
|
||
|
--
|
||
|
2.27.0
|
||
|
|