| From 0429b61574d21052f98ee11b2b5bbaeb1290ce10 Mon Sep 17 00:00:00 2001 |
| From: "Aneesh Kumar K.V" <aneesh.kumar@linux.ibm.com> |
| Date: Fri, 9 Aug 2019 13:17:26 +0530 |
| Subject: [PATCH] =?UTF-8?q?libnvdimm:=20Fix=20endian=20conversion=20issues?= |
| =?UTF-8?q?=C2=A0?= |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| commit 86aa66687442ef45909ff9814b82b4d2bb892294 upstream. |
| |
| nd_label->dpa issue was observed when trying to enable the namespace created |
| with little-endian kernel on a big-endian kernel. That made me run |
| `sparse` on the rest of the code and other changes are the result of that. |
| |
| Fixes: d9b83c756953 ("libnvdimm, btt: rework error clearing") |
| Fixes: 9dedc73a4658 ("libnvdimm/btt: Fix LBA masking during 'free list' population") |
| Reviewed-by: Vishal Verma <vishal.l.verma@intel.com> |
| Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com> |
| Link: https://lore.kernel.org/r/20190809074726.27815-1-aneesh.kumar@linux.ibm.com |
| Signed-off-by: Dan Williams <dan.j.williams@intel.com> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/nvdimm/btt.c b/drivers/nvdimm/btt.c |
| index a8d56887ec88..3e9f45aec8d1 100644 |
| --- a/drivers/nvdimm/btt.c |
| +++ b/drivers/nvdimm/btt.c |
| @@ -392,9 +392,9 @@ static int btt_flog_write(struct arena_info *arena, u32 lane, u32 sub, |
| arena->freelist[lane].sub = 1 - arena->freelist[lane].sub; |
| if (++(arena->freelist[lane].seq) == 4) |
| arena->freelist[lane].seq = 1; |
| - if (ent_e_flag(ent->old_map)) |
| + if (ent_e_flag(le32_to_cpu(ent->old_map))) |
| arena->freelist[lane].has_err = 1; |
| - arena->freelist[lane].block = le32_to_cpu(ent_lba(ent->old_map)); |
| + arena->freelist[lane].block = ent_lba(le32_to_cpu(ent->old_map)); |
| |
| return ret; |
| } |
| @@ -560,8 +560,8 @@ static int btt_freelist_init(struct arena_info *arena) |
| * FIXME: if error clearing fails during init, we want to make |
| * the BTT read-only |
| */ |
| - if (ent_e_flag(log_new.old_map) && |
| - !ent_normal(log_new.old_map)) { |
| + if (ent_e_flag(le32_to_cpu(log_new.old_map)) && |
| + !ent_normal(le32_to_cpu(log_new.old_map))) { |
| arena->freelist[i].has_err = 1; |
| ret = arena_clear_freelist_error(arena, i); |
| if (ret) |
| diff --git a/drivers/nvdimm/namespace_devs.c b/drivers/nvdimm/namespace_devs.c |
| index a434a5964cb9..d1a062d6ff70 100644 |
| --- a/drivers/nvdimm/namespace_devs.c |
| +++ b/drivers/nvdimm/namespace_devs.c |
| @@ -1987,7 +1987,7 @@ static struct device *create_namespace_pmem(struct nd_region *nd_region, |
| nd_mapping = &nd_region->mapping[i]; |
| label_ent = list_first_entry_or_null(&nd_mapping->labels, |
| typeof(*label_ent), list); |
| - label0 = label_ent ? label_ent->label : 0; |
| + label0 = label_ent ? label_ent->label : NULL; |
| |
| if (!label0) { |
| WARN_ON(1); |
| @@ -2322,8 +2322,9 @@ static struct device **scan_labels(struct nd_region *nd_region) |
| continue; |
| |
| /* skip labels that describe extents outside of the region */ |
| - if (nd_label->dpa < nd_mapping->start || nd_label->dpa > map_end) |
| - continue; |
| + if (__le64_to_cpu(nd_label->dpa) < nd_mapping->start || |
| + __le64_to_cpu(nd_label->dpa) > map_end) |
| + continue; |
| |
| i = add_namespace_resource(nd_region, nd_label, devs, count); |
| if (i < 0) |
| -- |
| 2.7.4 |
| |