On Wed, Oct 30, 2019 at 4:39 PM Verma, Vishal L
<vishal.l.verma(a)intel.com> wrote:
On Thu, 2019-10-17 at 08:35 +0530, Aneesh Kumar K.V wrote:
>
> > > ---
> > > ndctl/namespace.c | 3 ++-
> > > 1 file changed, 2 insertions(+), 1 deletion(-)
> > >
> > > diff --git a/ndctl/namespace.c b/ndctl/namespace.c
> > > index 58a9e3c53474..1f212a2b3a9b 100644
> > > --- a/ndctl/namespace.c
> > > +++ b/ndctl/namespace.c
> > > @@ -455,7 +455,8 @@ static int is_namespace_active(struct ndctl_namespace
*ndns)
> > > return ndns && (ndctl_namespace_is_enabled(ndns)
> > > || ndctl_namespace_get_pfn(ndns)
> > > || ndctl_namespace_get_dax(ndns)
> > > - || ndctl_namespace_get_btt(ndns));
> > > + || ndctl_namespace_get_btt(ndns)
> > > + || ndctl_namespace_get_size(ndns));
> > > }
> > >
> > > /*
[..]
>
> > The failing unit tests are sector-mode.sh and dax.sh
> >
>
> I will see if i can run them on ppc64. We still had issues in getting
> ndctl check to be running on ppc64.
>
I dug into this a bit more.
The failure happens on 'legacy' namespaces (ND_DEVICE_NAMESPACE_IO).
There is an assumption that legacy namespaces cannot be fully deleted,
so as part of a reconfigure, when it comes time to delete the namespace
(ndctl_namespace_delete()), we refuse to do that, and bail, before
setting the size to zero.
libndctl.c:4467
case ND_DEVICE_NAMESPACE_BLK:
break;
default:
dbg(ctx, "%s: nstype: %d not deletable\n",
ndctl_namespace_get_devname(ndns),
ndctl_namespace_get_type(ndns));
return 0;
}
rc = namespace_set_size(ndns, 0);
...
Indeed, destroy namespace wouldn't even get to that point, because that
assumption is repeated in namespace_destroy(), where we switch on
namespace type, and potentially skip over the ndctl_namespace_destroy
call entirely.
If setting the size to zero is now significant we'd need to rework both
of these sites. In destroy_namespace(), delay the did_zero checking
until after ndctl_namespace_delete(), and in ndctl_namespace_delete(),
set the size to zero before the type check.
Dan, does the above make sense - was there reason to refrain from
touching the size on legacy namespaces?
It's because the size is read-only on legacy namespaces, so writes
will always fail so the assumption is that ndctl_namespace_delete() is
a nop. Hmm, but that makes me think that size == read-only might be a
good gate for this idle check, i.e.:
if (size_is_writable(ndns) && size(ndns) != 0)
return not_idle;