* [PATCH mm-nonmm-unstable 1/2] squashfs: fix page update race
2023-05-26 13:25 [PATCH mm-nonmm-unstable 0/2] squashfs: fixups for caching Vincent Whitchurch
@ 2023-05-26 13:25 ` Vincent Whitchurch
2023-05-26 13:36 ` Christoph Hellwig
2023-05-26 13:25 ` [PATCH mm-nonmm-unstable 2/2] squashfs: fix page indices Vincent Whitchurch
1 sibling, 1 reply; 5+ messages in thread
From: Vincent Whitchurch @ 2023-05-26 13:25 UTC (permalink / raw)
To: Phillip Lougher, Andrew Morton
Cc: hch, linux-kernel, kernel, Vincent Whitchurch
We only put the page into the cache after we've read it, so the
PageUptodate() check should not be necessary. In fact, it's actively
harmful since the check could fail (since we used find_get_page() and
not find_lock_page()) and we could end up submitting a page for I/O
after it has been read and while it's actively being used, which could
lead to corruption depending on what the block driver does with it.
Signed-off-by: Vincent Whitchurch <vincent.whitchurch@axis.com>
---
fs/squashfs/block.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/fs/squashfs/block.c b/fs/squashfs/block.c
index 6285f5afb6c6..f2412e5fc84b 100644
--- a/fs/squashfs/block.c
+++ b/fs/squashfs/block.c
@@ -92,7 +92,7 @@ static int squashfs_bio_read_cached(struct bio *fullbio,
bio_for_each_segment_all(bv, fullbio, iter_all) {
struct page *page = bv->bv_page;
- if (page->mapping == cache_mapping && PageUptodate(page)) {
+ if (page->mapping == cache_mapping) {
idx++;
continue;
}
--
2.34.1
^ permalink raw reply related [flat|nested] 5+ messages in thread* [PATCH mm-nonmm-unstable 2/2] squashfs: fix page indices
2023-05-26 13:25 [PATCH mm-nonmm-unstable 0/2] squashfs: fixups for caching Vincent Whitchurch
2023-05-26 13:25 ` [PATCH mm-nonmm-unstable 1/2] squashfs: fix page update race Vincent Whitchurch
@ 2023-05-26 13:25 ` Vincent Whitchurch
2023-05-26 13:37 ` Christoph Hellwig
1 sibling, 1 reply; 5+ messages in thread
From: Vincent Whitchurch @ 2023-05-26 13:25 UTC (permalink / raw)
To: Phillip Lougher, Andrew Morton
Cc: hch, linux-kernel, kernel, Vincent Whitchurch
The page cache functions want the page index as an argument but we're
currently passing in the byte address.
Signed-off-by: Vincent Whitchurch <vincent.whitchurch@axis.com>
---
fs/squashfs/block.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/fs/squashfs/block.c b/fs/squashfs/block.c
index f2412e5fc84b..447fb04f2b61 100644
--- a/fs/squashfs/block.c
+++ b/fs/squashfs/block.c
@@ -142,7 +142,7 @@ static int squashfs_bio_read_cached(struct bio *fullbio,
if (head_to_cache) {
int ret = add_to_page_cache_lru(head_to_cache, cache_mapping,
- read_start, GFP_NOIO);
+ read_start >> PAGE_SHIFT, GFP_NOIO);
if (!ret) {
SetPageUptodate(head_to_cache);
@@ -153,7 +153,7 @@ static int squashfs_bio_read_cached(struct bio *fullbio,
if (tail_to_cache) {
int ret = add_to_page_cache_lru(tail_to_cache, cache_mapping,
- read_end - PAGE_SIZE, GFP_NOIO);
+ (read_end >> PAGE_SHIFT) - 1, GFP_NOIO);
if (!ret) {
SetPageUptodate(tail_to_cache);
@@ -192,7 +192,7 @@ static int squashfs_bio_read(struct super_block *sb, u64 index, int length,
if (cache_mapping)
page = find_get_page(cache_mapping,
- read_start + i * PAGE_SIZE);
+ (read_start >> PAGE_SHIFT) + i);
if (!page)
page = alloc_page(GFP_NOIO);
--
2.34.1
^ permalink raw reply related [flat|nested] 5+ messages in thread