diff options
Diffstat (limited to 'drivers/nvdimm/namespace_devs.c')
-rw-r--r-- | drivers/nvdimm/namespace_devs.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/drivers/nvdimm/namespace_devs.c b/drivers/nvdimm/namespace_devs.c index ce3e8dfa10ad..1b481a5fb966 100644 --- a/drivers/nvdimm/namespace_devs.c +++ b/drivers/nvdimm/namespace_devs.c | |||
@@ -1700,6 +1700,7 @@ static int select_pmem_id(struct nd_region *nd_region, u8 *pmem_id) | |||
1700 | struct device *create_namespace_pmem(struct nd_region *nd_region, | 1700 | struct device *create_namespace_pmem(struct nd_region *nd_region, |
1701 | struct nd_namespace_label *nd_label) | 1701 | struct nd_namespace_label *nd_label) |
1702 | { | 1702 | { |
1703 | u64 altcookie = nd_region_interleave_set_altcookie(nd_region); | ||
1703 | u64 cookie = nd_region_interleave_set_cookie(nd_region); | 1704 | u64 cookie = nd_region_interleave_set_cookie(nd_region); |
1704 | struct nd_label_ent *label_ent; | 1705 | struct nd_label_ent *label_ent; |
1705 | struct nd_namespace_pmem *nspm; | 1706 | struct nd_namespace_pmem *nspm; |
@@ -1718,7 +1719,11 @@ struct device *create_namespace_pmem(struct nd_region *nd_region, | |||
1718 | if (__le64_to_cpu(nd_label->isetcookie) != cookie) { | 1719 | if (__le64_to_cpu(nd_label->isetcookie) != cookie) { |
1719 | dev_dbg(&nd_region->dev, "invalid cookie in label: %pUb\n", | 1720 | dev_dbg(&nd_region->dev, "invalid cookie in label: %pUb\n", |
1720 | nd_label->uuid); | 1721 | nd_label->uuid); |
1721 | return ERR_PTR(-EAGAIN); | 1722 | if (__le64_to_cpu(nd_label->isetcookie) != altcookie) |
1723 | return ERR_PTR(-EAGAIN); | ||
1724 | |||
1725 | dev_dbg(&nd_region->dev, "valid altcookie in label: %pUb\n", | ||
1726 | nd_label->uuid); | ||
1722 | } | 1727 | } |
1723 | 1728 | ||
1724 | nspm = kzalloc(sizeof(*nspm), GFP_KERNEL); | 1729 | nspm = kzalloc(sizeof(*nspm), GFP_KERNEL); |
@@ -1733,9 +1738,14 @@ struct device *create_namespace_pmem(struct nd_region *nd_region, | |||
1733 | res->name = dev_name(&nd_region->dev); | 1738 | res->name = dev_name(&nd_region->dev); |
1734 | res->flags = IORESOURCE_MEM; | 1739 | res->flags = IORESOURCE_MEM; |
1735 | 1740 | ||
1736 | for (i = 0; i < nd_region->ndr_mappings; i++) | 1741 | for (i = 0; i < nd_region->ndr_mappings; i++) { |
1737 | if (!has_uuid_at_pos(nd_region, nd_label->uuid, cookie, i)) | 1742 | if (has_uuid_at_pos(nd_region, nd_label->uuid, cookie, i)) |
1738 | break; | 1743 | continue; |
1744 | if (has_uuid_at_pos(nd_region, nd_label->uuid, altcookie, i)) | ||
1745 | continue; | ||
1746 | break; | ||
1747 | } | ||
1748 | |||
1739 | if (i < nd_region->ndr_mappings) { | 1749 | if (i < nd_region->ndr_mappings) { |
1740 | struct nvdimm_drvdata *ndd = to_ndd(&nd_region->mapping[i]); | 1750 | struct nvdimm_drvdata *ndd = to_ndd(&nd_region->mapping[i]); |
1741 | 1751 | ||