libnvdimm, namespace: filter out of range labels in scan_labels()
Short-circuit doomed-to-fail label validation attempts by skipping labels that are outside the given region. For example a DIMM that has multiple PMEM regions will waste time attempting to create namespaces only to find that the interleave-set-cookie does not validate, e.g.: nd_region region6: invalid cookie in label: 73e608dc-47b9-4b2a-b5c7-2d55a32e0c2 Similar to how we skip BLK labels when performing PMEM validation we can skip out-of-range labels early. Signed-off-by: Dan Williams <dan.j.williams@intel.com>
This commit is contained in:
parent
762d067dba
commit
c969e24c1b
|
@ -2013,10 +2013,11 @@ static int cmp_dpa(const void *a, const void *b)
|
||||||
|
|
||||||
static struct device **scan_labels(struct nd_region *nd_region)
|
static struct device **scan_labels(struct nd_region *nd_region)
|
||||||
{
|
{
|
||||||
struct nd_mapping *nd_mapping = &nd_region->mapping[0];
|
int i, count = 0;
|
||||||
struct device *dev, **devs = NULL;
|
struct device *dev, **devs = NULL;
|
||||||
struct nd_label_ent *label_ent, *e;
|
struct nd_label_ent *label_ent, *e;
|
||||||
int i, count = 0;
|
struct nd_mapping *nd_mapping = &nd_region->mapping[0];
|
||||||
|
resource_size_t map_end = nd_mapping->start + nd_mapping->size - 1;
|
||||||
|
|
||||||
/* "safe" because create_namespace_pmem() might list_move() label_ent */
|
/* "safe" because create_namespace_pmem() might list_move() label_ent */
|
||||||
list_for_each_entry_safe(label_ent, e, &nd_mapping->labels, list) {
|
list_for_each_entry_safe(label_ent, e, &nd_mapping->labels, list) {
|
||||||
|
@ -2033,6 +2034,10 @@ static struct device **scan_labels(struct nd_region *nd_region)
|
||||||
else
|
else
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
/* skip labels that describe extents outside of the region */
|
||||||
|
if (nd_label->dpa < nd_mapping->start || nd_label->dpa > map_end)
|
||||||
|
continue;
|
||||||
|
|
||||||
i = add_namespace_resource(nd_region, nd_label, devs, count);
|
i = add_namespace_resource(nd_region, nd_label, devs, count);
|
||||||
if (i < 0)
|
if (i < 0)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
Loading…
Reference in New Issue