lkml.org 
[lkml]   [2020]   [Dec]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 705/717] libnvdimm/namespace: Fix reaping of invalidated block-window-namespace labels
    Date
    From: Dan Williams <dan.j.williams@intel.com>

    commit 2dd2a1740ee19cd2636d247276cf27bfa434b0e2 upstream.

    A recent change to ndctl to attempt to reconfigure namespaces in place
    uncovered a label accounting problem in block-window-type namespaces.
    The ndctl "create.sh" test is able to trigger this signature:

    WARNING: CPU: 34 PID: 9167 at drivers/nvdimm/label.c:1100 __blk_label_update+0x9a3/0xbc0 [libnvdimm]
    [..]
    RIP: 0010:__blk_label_update+0x9a3/0xbc0 [libnvdimm]
    [..]
    Call Trace:
    uuid_store+0x21b/0x2f0 [libnvdimm]
    kernfs_fop_write+0xcf/0x1c0
    vfs_write+0xcc/0x380
    ksys_write+0x68/0xe0

    When allocated capacity for a namespace is renamed (new UUID) the labels
    with the old UUID need to be deleted. The ndctl behavior to always
    destroy namespaces on reconfiguration hid this problem.

    The immediate impact of this bug is limited since block-window-type
    namespaces only seem to exist in the specification and not in any
    shipping products. However, the label handling code is being reused for
    other technologies like CXL region labels, so there is a benefit to
    making sure both vertical labels sets (block-window) and horizontal
    label sets (pmem) have a functional reference implementation in
    libnvdimm.

    Fixes: c4703ce11c23 ("libnvdimm/namespace: Fix label tracking error")
    Cc: <stable@vger.kernel.org>
    Cc: Vishal Verma <vishal.l.verma@intel.com>
    Cc: Dave Jiang <dave.jiang@intel.com>
    Cc: Ira Weiny <ira.weiny@intel.com>
    Signed-off-by: Dan Williams <dan.j.williams@intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/nvdimm/label.c | 9 +++++++++
    1 file changed, 9 insertions(+)

    --- a/drivers/nvdimm/label.c
    +++ b/drivers/nvdimm/label.c
    @@ -980,6 +980,15 @@ static int __blk_label_update(struct nd_
    }
    }

    + /* release slots associated with any invalidated UUIDs */
    + mutex_lock(&nd_mapping->lock);
    + list_for_each_entry_safe(label_ent, e, &nd_mapping->labels, list)
    + if (test_and_clear_bit(ND_LABEL_REAP, &label_ent->flags)) {
    + reap_victim(nd_mapping, label_ent);
    + list_move(&label_ent->list, &list);
    + }
    + mutex_unlock(&nd_mapping->lock);
    +
    /*
    * Find the resource associated with the first label in the set
    * per the v1.2 namespace specification.

    \
     
     \ /
      Last update: 2020-12-28 15:39    [W:4.300 / U:1.280 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site