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 |
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 --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,
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(-)