/* Try to grab all the pages covered by the Squashfs block */ for (i = 0, index = start_index; index <= end_index; index++) {
page[i] = (index == folio->index) ? target_page :
grab_cache_page_nowait(folio->mapping, index);
if (page[i] == NULL) continue;
if (PageUptodate(page[i])) {
unlock_page(page[i]);
put_page(page[i]); continue;
}
i++;
}
pages = i;
/* * Create a "page actor" which will kmap and kunmap the * page cache pages appropriately within the decompressor
*/
actor = squashfs_page_actor_init_special(msblk, page, pages, expected,
start_index << PAGE_SHIFT); if (actor == NULL) goto out;
/* Decompress directly into the page cache buffers */
res = squashfs_read_data(inode->i_sb, block, bsize, NULL, actor);
last_page = squashfs_page_actor_free(actor);
if (res < 0) goto mark_errored;
if (res != expected || IS_ERR(last_page)) {
res = -EIO; goto mark_errored;
}
/* Last page (if present) may have trailing bytes not filled */
bytes = res % PAGE_SIZE; if (end_index == file_end && last_page && bytes) {
pageaddr = kmap_local_page(last_page);
memset(pageaddr + bytes, 0, PAGE_SIZE - bytes);
kunmap_local(pageaddr);
}
/* Mark pages as uptodate, unlock and release */ for (i = 0; i < pages; i++) {
flush_dcache_page(page[i]);
SetPageUptodate(page[i]);
unlock_page(page[i]); if (page[i] != target_page)
put_page(page[i]);
}
kfree(page);
return 0;
mark_errored: /* Decompression failed. Target_page is * dealt with by the caller
*/ for (i = 0; i < pages; i++) { if (page[i] == NULL || page[i] == target_page) continue;
flush_dcache_page(page[i]);
unlock_page(page[i]);
put_page(page[i]);
}
out:
kfree(page); return res;
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.13 Sekunden
(vorverarbeitet am 2026-04-29)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.