Dan Williams <[email protected]> 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 <[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,

Acked-by: Jeff Moyer <[email protected]>


Reply via email to