ubifs: Set page uptodate in the correct place
[ Upstream commit 723012cab779eee8228376754e22c6594229bf8f ]
Page cache reads are lockless, so setting the freshly allocated page
uptodate before we've overwritten it with the data it's supposed to have
in it will allow a simultaneous reader to see old data. Move the call
to SetPageUptodate into ubifs_write_end(), which is after we copied the
new data into the page.
Fixes: 1e51764a3c
("UBIFS: add new flash file system")
Cc: stable@vger.kernel.org
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: Zhihao Cheng <chengzhihao1@huawei.com>
Signed-off-by: Richard Weinberger <richard@nod.at>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
f52d7663a1
commit
778c6ad402
@ -262,9 +262,6 @@ static int write_begin_slow(struct address_space *mapping,
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SetPageUptodate(page);
|
|
||||||
ClearPageError(page);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (PagePrivate(page))
|
if (PagePrivate(page))
|
||||||
@ -463,9 +460,6 @@ static int ubifs_write_begin(struct file *file, struct address_space *mapping,
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SetPageUptodate(page);
|
|
||||||
ClearPageError(page);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
err = allocate_budget(c, page, ui, appending);
|
err = allocate_budget(c, page, ui, appending);
|
||||||
@ -475,10 +469,8 @@ static int ubifs_write_begin(struct file *file, struct address_space *mapping,
|
|||||||
* If we skipped reading the page because we were going to
|
* If we skipped reading the page because we were going to
|
||||||
* write all of it, then it is not up to date.
|
* write all of it, then it is not up to date.
|
||||||
*/
|
*/
|
||||||
if (skipped_read) {
|
if (skipped_read)
|
||||||
ClearPageChecked(page);
|
ClearPageChecked(page);
|
||||||
ClearPageUptodate(page);
|
|
||||||
}
|
|
||||||
/*
|
/*
|
||||||
* Budgeting failed which means it would have to force
|
* Budgeting failed which means it would have to force
|
||||||
* write-back but didn't, because we set the @fast flag in the
|
* write-back but didn't, because we set the @fast flag in the
|
||||||
@ -569,6 +561,9 @@ static int ubifs_write_end(struct file *file, struct address_space *mapping,
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (len == PAGE_SIZE)
|
||||||
|
SetPageUptodate(page);
|
||||||
|
|
||||||
if (!PagePrivate(page)) {
|
if (!PagePrivate(page)) {
|
||||||
SetPagePrivate(page);
|
SetPagePrivate(page);
|
||||||
atomic_long_inc(&c->dirty_pg_cnt);
|
atomic_long_inc(&c->dirty_pg_cnt);
|
||||||
|
Loading…
Reference in New Issue
Block a user