diff options
author | Phillip Lougher <phillip@squashfs.org.uk> | 2024-08-19 00:58:45 +0100 |
---|---|---|
committer | Christian Brauner <brauner@kernel.org> | 2024-08-19 14:08:20 +0200 |
commit | 6f09ffb1f4fadf156d5d1032217b9d1fa4e07dbe (patch) | |
tree | 772661ea9caa8063ce7a178ff63fc2af5a8de401 | |
parent | 2258e22f05aff5865c93cbd4e9acba55b295d832 (diff) | |
download | linux-6f09ffb1f4fadf156d5d1032217b9d1fa4e07dbe.tar.gz linux-6f09ffb1f4fadf156d5d1032217b9d1fa4e07dbe.tar.bz2 linux-6f09ffb1f4fadf156d5d1032217b9d1fa4e07dbe.zip |
Squashfs: Update squashfs_readahead() to not use page->index
This commit removes references to page->index in the pages returned
from __readahead_batch(), and instead uses the 'start' variable.
This does reveal a bug in the previous code in that 'start' was
not updated every time around the loop. This is fixed in this
commit.
Signed-off-by: Phillip Lougher <phillip@squashfs.org.uk>
Link: https://lore.kernel.org/r/20240818235847.170468-3-phillip@squashfs.org.uk
Signed-off-by: Christian Brauner <brauner@kernel.org>
-rw-r--r-- | fs/squashfs/file.c | 16 |
1 files changed, 6 insertions, 10 deletions
diff --git a/fs/squashfs/file.c b/fs/squashfs/file.c index 2b6b63f4ccd1..50fe5a078b83 100644 --- a/fs/squashfs/file.c +++ b/fs/squashfs/file.c @@ -551,7 +551,6 @@ static void squashfs_readahead(struct readahead_control *ractl) return; for (;;) { - pgoff_t index; int res, bsize; u64 block = 0; unsigned int expected; @@ -570,13 +569,8 @@ static void squashfs_readahead(struct readahead_control *ractl) if (readahead_pos(ractl) >= i_size_read(inode)) goto skip_pages; - index = pages[0]->index >> shift; - - if ((pages[nr_pages - 1]->index >> shift) != index) - goto skip_pages; - - if (index == file_end && squashfs_i(inode)->fragment_block != - SQUASHFS_INVALID_BLK) { + if (start >> msblk->block_log == file_end && + squashfs_i(inode)->fragment_block != SQUASHFS_INVALID_BLK) { res = squashfs_readahead_fragment(pages, nr_pages, expected); if (res) @@ -584,7 +578,7 @@ static void squashfs_readahead(struct readahead_control *ractl) continue; } - bsize = read_blocklist(inode, index, &block); + bsize = read_blocklist(inode, start >> msblk->block_log, &block); if (bsize == 0) goto skip_pages; @@ -602,7 +596,7 @@ static void squashfs_readahead(struct readahead_control *ractl) /* Last page (if present) may have trailing bytes not filled */ bytes = res % PAGE_SIZE; - if (index == file_end && bytes && last_page) + if (start >> msblk->block_log == file_end && bytes && last_page) memzero_page(last_page, bytes, PAGE_SIZE - bytes); @@ -616,6 +610,8 @@ static void squashfs_readahead(struct readahead_control *ractl) unlock_page(pages[i]); put_page(pages[i]); } + + start += readahead_batch_length(ractl); } kfree(pages); |