Received: by 2002:a6b:fb09:0:0:0:0:0 with SMTP id h9csp220694iog; Fri, 17 Jun 2022 02:15:35 -0700 (PDT) X-Google-Smtp-Source: AGRyM1s/r/i+dLM3nOj6pOkUfGgGI+eQyslK5HndLwuX/UMvii9/Hv71kR39NMQ3q8aUEDHBorYc X-Received: by 2002:aa7:c803:0:b0:435:6522:c3cc with SMTP id a3-20020aa7c803000000b004356522c3ccmr1102032edt.75.1655457334814; Fri, 17 Jun 2022 02:15:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1655457334; cv=none; d=google.com; s=arc-20160816; b=NXBihCWioQ4lMJJCRc7HOUR2HRnktS50c7buEYOu0dadzOp3u9aYHatasbAhIZZK8o 89b1M5yee2wPieWGJNsgY54KMMJBFanJquxNtUV3hEPUn39k+2lyUDTeQv/6GRw2PR5J xONULymB0U9USlAhDIabNWsS+Ju6HZXUqs/WM0F6tutamhKHiFR7zkEE8+au984hnScp t0DsnT7pLzXmUiPNrKRoJE41kKwTfkvUSVtvYMEjAiZhxDyR/YUhDFFNCkP4vHV6BT3q 0kns5kRIFvXYJbRFFHVjR6VHD6y6AQk2vdSXrp7l/rJfolBrrohbNzrC5lqyYEQoVzJR PAnQ== 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 :dkim-signature; bh=G086Dnit23XcYgqGZXR8d4QAiX5I5zPq+4/SqclxxJs=; b=iSbNAYgfXUAuAAyDd++ANvsknz4HzIF8eRRPWwG36GFcA35vvZovWl4zrXinjcKql5 WaBFExjONYt3zaootoW+1ZmpMGo4hcaWaJaQj2u14ytvThHV4hPyoJX0Z/ISXvc+8p7I VJfz/nc4iE7qt7devYkA6fsAh6bwfs1QY2jC9zLuAGOWDuB9XagQr/9qpWkaveeBcX2g CYqn6umHVaQy3YeXwt2TOqwrvcVTtgTflHbEzGNtnvwvgIKZQFtjqdq4zNoBm+FA9qL0 f0LJhBv2XEJRDmLbfkEIemaMtpS1sr0dtMcs81L1X3FCzq8u7hP2HUHwA+VymDZlpgYj jzRw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=VdbwQ4cd; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id y20-20020a056402171400b0042f94821fbfsi3554392edu.176.2022.06.17.02.15.08; Fri, 17 Jun 2022 02:15:34 -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; dkim=pass header.i=@chromium.org header.s=google header.b=VdbwQ4cd; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1381203AbiFQIjx (ORCPT + 99 others); Fri, 17 Jun 2022 04:39:53 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51804 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1381199AbiFQIjb (ORCPT ); Fri, 17 Jun 2022 04:39:31 -0400 Received: from mail-pl1-x62f.google.com (mail-pl1-x62f.google.com [IPv6:2607:f8b0:4864:20::62f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9E7D969730 for ; Fri, 17 Jun 2022 01:39:16 -0700 (PDT) Received: by mail-pl1-x62f.google.com with SMTP id o6so3330506plg.2 for ; Fri, 17 Jun 2022 01:39:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=G086Dnit23XcYgqGZXR8d4QAiX5I5zPq+4/SqclxxJs=; b=VdbwQ4cd6v433oanoE0oyHKGpgJ6Sqwso/c30X2vOYB5aA4/iAtfKKyfVWc0dmgiXu CWjpdg0Kc8jVXkJVDW8W21xhw0scR/bhN55J5YUHztOeynl60wnyx6Yav+WWA1iL1NKy BrkUYqeLHVQqTyDE2xNlZuADrrmCANFnZj9WU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=G086Dnit23XcYgqGZXR8d4QAiX5I5zPq+4/SqclxxJs=; b=Fv5sxBpX7FldpH94LKUrBUSDDmToWmMJPU93F2C2YutdQNKbT2RvOnUfjEYiVEyQ3m l6KIJnCstNb73AineKZdNspSc0VJrRB2+kcWnPqAAINqUAICb+coPRW44RvgVvbnkUOT ldBVPFNF71xO4lrK0JFHvsF7AmQ0a0P0E3dH7JVMct1UdS08kZYkc31ISglipjyrQU5t asywondtSxjC4ciWmbqyH4kiYwNEWxI6INTjRqkzsBatU6zY58wa3eWmYNiVITmkGYms HL4CkupUZKvLW2CKN5DBt5nSt+GKOaggOB2SsvG2ZCcrPxo5rMV2TSJ2yc8CaPX8U8wZ uDtA== X-Gm-Message-State: AJIora8Dj21Tg7jrP5G05Di3e7gWyDPnnPxHVMuYmvLdZm7wTIuMNGNz GB2tvuqmWqh2gSV+LMid63wi+Q== X-Received: by 2002:a17:90b:388c:b0:1e2:f376:b8d with SMTP id mu12-20020a17090b388c00b001e2f3760b8dmr20205301pjb.148.1655455152985; Fri, 17 Jun 2022 01:39:12 -0700 (PDT) Received: from hsinyi-z840.tpe.corp.google.com ([2401:fa00:1:10:a0dc:9427:fea8:f78a]) by smtp.gmail.com with ESMTPSA id d12-20020a62f80c000000b005185407eda5sm3154103pfh.44.2022.06.17.01.39.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jun 2022 01:39:12 -0700 (PDT) From: Hsin-Yi Wang To: Phillip Lougher , Matthew Wilcox , Marek Szyprowski , Andrew Morton Cc: Xiongwei Song , Zheng Liang , Zhang Yi , Hou Tao , Miao Xie , "linux-mm @ kvack . org" , "squashfs-devel @ lists . sourceforge . net" , linux-kernel@vger.kernel.org Subject: [PATCH v7 4/4] squashfs: support reading fragments in readahead call Date: Fri, 17 Jun 2022 16:38:15 +0800 Message-Id: <20220617083810.337573-5-hsinyi@chromium.org> X-Mailer: git-send-email 2.36.1.476.g0c4daa206d-goog In-Reply-To: <20220617083810.337573-1-hsinyi@chromium.org> References: <20220617083810.337573-1-hsinyi@chromium.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.7 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,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 From: Phillip Lougher 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 Signed-off-by: Hsin-Yi Wang --- fs/squashfs/file.c | 47 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 44 insertions(+), 3 deletions(-) diff --git a/fs/squashfs/file.c b/fs/squashfs/file.c index f0c64ee272d5d..98e64fec75b77 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 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; @@ -513,9 +548,6 @@ static void squashfs_readahead(struct readahead_control *ractl) readahead_expand(ractl, start, (len | mask) + 1); - if (file_end == 0) - return; - pages = kmalloc_array(max_pages, sizeof(void *), GFP_KERNEL); if (!pages) return; @@ -541,6 +573,15 @@ static void squashfs_readahead(struct readahead_control *ractl) (i_size_read(inode) & (msblk->block_size - 1)) : msblk->block_size; + if (index == file_end && squashfs_i(inode)->fragment_block != + SQUASHFS_INVALID_BLK) { + res = squashfs_readahead_fragment(pages, nr_pages, + expected); + if (res) + goto skip_pages; + continue; + } + bsize = read_blocklist(inode, index, &block); if (bsize == 0) goto skip_pages; -- 2.36.1.476.g0c4daa206d-goog