Received: by 2002:a6b:fb09:0:0:0:0:0 with SMTP id h9csp9886iog; Thu, 16 Jun 2022 20:06:03 -0700 (PDT) X-Google-Smtp-Source: AGRyM1v8PbZM4r3063qzmFVBCYui7mnSSrXkwTMwmLbdjRXIY1McF16ylvH+cS4nfKB0odCgXPUM X-Received: by 2002:a63:8841:0:b0:3fc:704c:24ff with SMTP id l62-20020a638841000000b003fc704c24ffmr7341713pgd.116.1655435163425; Thu, 16 Jun 2022 20:06:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1655435163; cv=none; d=google.com; s=arc-20160816; b=sZtsWuooI/7rj29Fv+GlBU8QiypE9LvSeOWnedvYbkj78/EgqkS6AmKUu4JXOtF4Rw SfjNRMNpx2O2maooL5yuysA5fOEEQR0jKADPJSuFfRZFIXEzT1fTxtBPaougBI9piPRv IvZSAQrQo5RrN2hbGQ6n8ZIvMiCb+7p2vdRzrPa3haGbHa2ZsE7gdwh+GWmgjBN6KptC s0i1ck6RVbxQdWuPQk3dZPhk1IQDIErDUFCQzGteCbuN+/x0QDOvytYrViY5xaMP5bwW oBdtfLbcBoUNlaiM6d9gAyh/ULbrj4ngwzwJq6YPSk0AgKhE2yq/lSnUaMuas2EpGpWL nf/Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=Ow8bB7bEfG9VT2oXOR1/1WiRXNIlOLlhlaka2k9vOUA=; b=MMg2AJ+8pApSUf3Hot2ogyK247NQY9pF9I5aejAcgil+EAbRMb727BCgiHDiGXalaE 2/0nOYrJhFhmBKMQGQMJ9uCN/4PrdiiUuwZXOeANmyY1aJf1fCTiSSLEuBYNb69nqhDb PxYRX+P83XoSR2iDOijmfVgGPi58L5PrsI66JcHdS7vocxUBN7b7Hy8PfRl6aJ6jwj/u Ld26dyM6beQtlXpk0vsLbCKIr0EAjJqh1B5qDTPbsQwSqgAbUVXwqePfj3hEvPSMwwU4 rDr70D+9RhAqXV+ZWYIhy3d3X/QC53R1t6ecDC6otKLoGiIZsO2BJxNK2p8Hg9Z4KTZL ITHg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id f1-20020a170902ce8100b00163e1c910dbsi5581555plg.13.2022.06.16.20.05.39; Thu, 16 Jun 2022 20:06:03 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1379911AbiFQDEM (ORCPT + 99 others); Thu, 16 Jun 2022 23:04:12 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44558 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1379532AbiFQDEJ (ORCPT ); Thu, 16 Jun 2022 23:04:09 -0400 Received: from p3plwbeout12-05.prod.phx3.secureserver.net (p3plsmtp12-05-2.prod.phx3.secureserver.net [173.201.192.62]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E4AF066229 for ; Thu, 16 Jun 2022 20:04:05 -0700 (PDT) Received: from mailex.mailcore.me ([94.136.40.142]) by :WBEOUT: with ESMTP id 22HEoNdiiOWGS22HEogv9B; Thu, 16 Jun 2022 20:04:05 -0700 X-CMAE-Analysis: v=2.4 cv=EsoXEQQA c=1 sm=1 tr=0 ts=62abef25 a=s1hRAmXuQnGNrIj+3lWWVA==:117 a=84ok6UeoqCVsigPHarzEiQ==:17 a=ggZhUymU-5wA:10 a=JPEYwPQDsx4A:10 a=FXvPX3liAAAA:8 a=Lo680ACL7Cit5IcG_IsA:9 a=UObqyxdv-6Yh2QiB9mM_:22 X-SECURESERVER-ACCT: phillip@squashfs.org.uk X-SID: 22HEoNdiiOWGS Received: from 82-69-79-175.dsl.in-addr.zen.co.uk ([82.69.79.175] helo=localhost.localdomain) by smtp11.mailcore.me with esmtpa (Exim 4.94.2) (envelope-from ) id 1o22HD-0005dm-Ey; Fri, 17 Jun 2022 04:04:03 +0100 From: Phillip Lougher To: hsinyi@chromium.org Cc: Xiongwei.Song@windriver.com, akpm@linux-foundation.org, houtao1@huawei.com, linux-kernel@vger.kernel.org, linux-mm@kvack.org, m.szyprowski@samsung.com, miaoxie@huawei.com, phillip@squashfs.org.uk, squashfs-devel@lists.sourceforge.net, willy@infradead.org, yi.zhang@huawei.com, zhengliang6@huawei.com Subject: [PATCH 4/3] squashfs: support reading fragments in readahead call Date: Fri, 17 Jun 2022 04:03:45 +0100 Message-Id: <20220617030345.24712-1-phillip@squashfs.org.uk> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220613082802.1301238-4-hsinyi@chromium.org> References: <20220613082802.1301238-4-hsinyi@chromium.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Mailcore-Auth: 439999529 X-Mailcore-Domain: 1394945 X-123-reg-Authenticated: phillip@squashfs.org.uk X-Originating-IP: 82.69.79.175 X-CMAE-Envelope: MS4xfPiCow8nZGMKKRlPN9OwHQz0KMzh7h8PcNhfepBHfmiPhQLHMBxsruJkRyHbwga5WDPzKqxreM5NLdlZNkI3Vh6XtkqMWdXxIkF+2uLfxN9iygTzveD1 6V5GcNXYWk/gbEmuX4sc7jY0U3Qj+AmjuELXv24LY87a7bQy75zODR3dYX0Hb1GKW+gdCmksOkTFLiHTA9xgqYIxYKF2mfwmzaE= X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_NONE,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This patch adds a function which can be used to read fragments in the readahead call. This function is necessary because filesystems built with the -tailends (or -always-use-fragments) option may have fragments present which cannot be currently handled. Signed-off-by: Phillip Lougher --- fs/squashfs/file.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/fs/squashfs/file.c b/fs/squashfs/file.c index f0c64ee272d5..3a4cce16d7da 100644 --- a/fs/squashfs/file.c +++ b/fs/squashfs/file.c @@ -497,6 +497,41 @@ static int squashfs_read_folio(struct file *file, struct folio *folio) return res; } +static unsigned int squashfs_readahead_fragment(struct page **page, + unsigned int pages, unsigned int expected) +{ + struct inode *inode = page[0]->mapping->host; + struct squashfs_cache_entry *buffer = squashfs_get_fragment(inode->i_sb, + squashfs_i(inode)->fragment_block, + squashfs_i(inode)->fragment_size); + struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info; + unsigned int n, mask = (1 << (msblk->block_log - PAGE_SHIFT)) - 1; + + if (buffer->error) + goto out; + + expected += squashfs_i(inode)->fragment_offset; + + for (n = 0; n < pages; n++) { + unsigned int base = (page[n]->index & mask) << PAGE_SHIFT; + unsigned int offset = base + squashfs_i(inode)->fragment_offset; + + if (expected > offset) { + unsigned int avail = min_t(unsigned int, expected - + offset, PAGE_SIZE); + + squashfs_fill_page(page[n], buffer, offset, avail); + } + + unlock_page(page[n]); + put_page(page[n]); + } + +out: + squashfs_cache_put(buffer); + return buffer->error; +} + static void squashfs_readahead(struct readahead_control *ractl) { struct inode *inode = ractl->mapping->host; -- 2.34.1