diff mbox series

[ndctl] ndctl/dimm: Flush invalidated labels after overwrite

Message ID 165119008839.1783158.3766085644383173318.stgit@dwillia2-desk3.amr.corp.intel.com
State New, archived
Headers show
Series [ndctl] ndctl/dimm: Flush invalidated labels after overwrite | expand

Commit Message

Dan Williams April 28, 2022, 11:54 p.m. UTC
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 <jmoyer@redhat.com>
Cc: Dave Jiang <dave.jiang@intel.com>
Link: https://lore.kernel.org/all/165118817010.1772793.5101398830527716084.stgit@dwillia2-desk3.amr.corp.intel.com/
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
---
 ndctl/dimm.c |   34 ++++++++++++++++++++++------------
 1 file changed, 22 insertions(+), 12 deletions(-)

Comments

Jeff Moyer May 2, 2022, 2:48 p.m. UTC | #1
Dan Williams <dan.j.williams@intel.com> writes:

> 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 <jmoyer@redhat.com>
> Cc: Dave Jiang <dave.jiang@intel.com>
> Link: https://lore.kernel.org/all/165118817010.1772793.5101398830527716084.stgit@dwillia2-desk3.amr.corp.intel.com/
> Signed-off-by: Dan Williams <dan.j.williams@intel.com>
> ---
>  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,

Acked-by: Jeff Moyer <jmoyer@redhat.com>
diff mbox series

Patch

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,