aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorVishal Verma <vishal.l.verma@intel.com>2017-08-30 19:36:00 -0600
committerDan Williams <dan.j.williams@intel.com>2017-08-31 15:05:10 -0700
commit1398199d849047c59acef0c04e550b47bb9b4be6 (patch)
treeea1bbf44a70de941d70b71007aec836993dfc98f /drivers
parentlibnvdimm, btt: refactor map entry operations with macros (diff)
downloadlinux-dev-1398199d849047c59acef0c04e550b47bb9b4be6.tar.xz
linux-dev-1398199d849047c59acef0c04e550b47bb9b4be6.zip
libnvdimm, btt: ensure that flags were also unchanged during a map_read
In btt_map_read, we read the map twice to make sure that the map entry didn't change after we added it to the read tracking table. In anticipation of expanding the use of the error bit, also make sure that the error and zero flags are constant across the two map reads. Signed-off-by: Vishal Verma <vishal.l.verma@intel.com> Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/nvdimm/btt.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/drivers/nvdimm/btt.c b/drivers/nvdimm/btt.c
index bb816bc1a906..15d1b071746b 100644
--- a/drivers/nvdimm/btt.c
+++ b/drivers/nvdimm/btt.c
@@ -1032,6 +1032,7 @@ static int btt_read_pg(struct btt *btt, struct bio_integrity_payload *bip,
*/
while (1) {
u32 new_map;
+ int new_t, new_e;
if (t_flag) {
zero_fill_data(page, off, cur_len);
@@ -1050,15 +1051,18 @@ static int btt_read_pg(struct btt *btt, struct bio_integrity_payload *bip,
*/
barrier();
- ret = btt_map_read(arena, premap, &new_map, &t_flag,
- &e_flag, NVDIMM_IO_ATOMIC);
+ ret = btt_map_read(arena, premap, &new_map, &new_t,
+ &new_e, NVDIMM_IO_ATOMIC);
if (ret)
goto out_rtt;
- if (postmap == new_map)
+ if ((postmap == new_map) && (t_flag == new_t) &&
+ (e_flag == new_e))
break;
postmap = new_map;
+ t_flag = new_t;
+ e_flag = new_e;
}
ret = btt_data_read(arena, page, off, postmap, cur_len);