Squashfs: Update page_actor to not use page->index

This commit removes an unnecessary use of page->index,
and moves the other use over to folio->index.

Signed-off-by: Phillip Lougher <phillip@squashfs.org.uk>
Link: https://lore.kernel.org/r/20240818235847.170468-2-phillip@squashfs.org.uk
Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
Phillip Lougher 2024-08-19 00:58:44 +01:00 committed by Christian Brauner
parent 8400291e28
commit 2258e22f05
No known key found for this signature in database
GPG Key ID: 91C61BC06578DCA2
4 changed files with 13 additions and 6 deletions

View File

@ -589,7 +589,7 @@ static void squashfs_readahead(struct readahead_control *ractl)
goto skip_pages; goto skip_pages;
actor = squashfs_page_actor_init_special(msblk, pages, nr_pages, actor = squashfs_page_actor_init_special(msblk, pages, nr_pages,
expected); expected, start);
if (!actor) if (!actor)
goto skip_pages; goto skip_pages;

View File

@ -67,7 +67,8 @@ int squashfs_readpage_block(struct page *target_page, u64 block, int bsize,
* Create a "page actor" which will kmap and kunmap the * Create a "page actor" which will kmap and kunmap the
* page cache pages appropriately within the decompressor * page cache pages appropriately within the decompressor
*/ */
actor = squashfs_page_actor_init_special(msblk, page, pages, expected); actor = squashfs_page_actor_init_special(msblk, page, pages, expected,
start_index << PAGE_SHIFT);
if (actor == NULL) if (actor == NULL)
goto out; goto out;

View File

@ -60,6 +60,11 @@ struct squashfs_page_actor *squashfs_page_actor_init(void **buffer,
} }
/* Implementation of page_actor for decompressing directly into page cache. */ /* Implementation of page_actor for decompressing directly into page cache. */
static loff_t page_next_index(struct squashfs_page_actor *actor)
{
return page_folio(actor->page[actor->next_page])->index;
}
static void *handle_next_page(struct squashfs_page_actor *actor) static void *handle_next_page(struct squashfs_page_actor *actor)
{ {
int max_pages = (actor->length + PAGE_SIZE - 1) >> PAGE_SHIFT; int max_pages = (actor->length + PAGE_SIZE - 1) >> PAGE_SHIFT;
@ -68,7 +73,7 @@ static void *handle_next_page(struct squashfs_page_actor *actor)
return NULL; return NULL;
if ((actor->next_page == actor->pages) || if ((actor->next_page == actor->pages) ||
(actor->next_index != actor->page[actor->next_page]->index)) { (actor->next_index != page_next_index(actor))) {
actor->next_index++; actor->next_index++;
actor->returned_pages++; actor->returned_pages++;
actor->last_page = NULL; actor->last_page = NULL;
@ -103,7 +108,7 @@ static void direct_finish_page(struct squashfs_page_actor *actor)
} }
struct squashfs_page_actor *squashfs_page_actor_init_special(struct squashfs_sb_info *msblk, struct squashfs_page_actor *squashfs_page_actor_init_special(struct squashfs_sb_info *msblk,
struct page **page, int pages, int length) struct page **page, int pages, int length, loff_t start_index)
{ {
struct squashfs_page_actor *actor = kmalloc(sizeof(*actor), GFP_KERNEL); struct squashfs_page_actor *actor = kmalloc(sizeof(*actor), GFP_KERNEL);
@ -125,7 +130,7 @@ struct squashfs_page_actor *squashfs_page_actor_init_special(struct squashfs_sb_
actor->pages = pages; actor->pages = pages;
actor->next_page = 0; actor->next_page = 0;
actor->returned_pages = 0; actor->returned_pages = 0;
actor->next_index = page[0]->index & ~((1 << (msblk->block_log - PAGE_SHIFT)) - 1); actor->next_index = start_index >> PAGE_SHIFT;
actor->pageaddr = NULL; actor->pageaddr = NULL;
actor->last_page = NULL; actor->last_page = NULL;
actor->alloc_buffer = msblk->decompressor->alloc_buffer; actor->alloc_buffer = msblk->decompressor->alloc_buffer;

View File

@ -29,7 +29,8 @@ extern struct squashfs_page_actor *squashfs_page_actor_init(void **buffer,
int pages, int length); int pages, int length);
extern struct squashfs_page_actor *squashfs_page_actor_init_special( extern struct squashfs_page_actor *squashfs_page_actor_init_special(
struct squashfs_sb_info *msblk, struct squashfs_sb_info *msblk,
struct page **page, int pages, int length); struct page **page, int pages, int length,
loff_t start_index);
static inline struct page *squashfs_page_actor_free(struct squashfs_page_actor *actor) static inline struct page *squashfs_page_actor_free(struct squashfs_page_actor *actor)
{ {
struct page *last_page = actor->last_page; struct page *last_page = actor->last_page;