From patchwork Thu Jan 26 20:12:55 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matthew Wilcox X-Patchwork-Id: 13117696 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id B7060C05027 for ; Thu, 26 Jan 2023 20:13:06 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 54B666B0073; Thu, 26 Jan 2023 15:13:06 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 4D45F8E0001; Thu, 26 Jan 2023 15:13:06 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 2D88D6B0075; Thu, 26 Jan 2023 15:13:06 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id 1C6496B0073 for ; Thu, 26 Jan 2023 15:13:06 -0500 (EST) Received: from smtpin10.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id E2879C0F24 for ; Thu, 26 Jan 2023 20:13:05 +0000 (UTC) X-FDA: 80398049130.10.A967BFC Received: from casper.infradead.org (casper.infradead.org [90.155.50.34]) by imf25.hostedemail.com (Postfix) with ESMTP id 4E436A000F for ; Thu, 26 Jan 2023 20:13:03 +0000 (UTC) Authentication-Results: imf25.hostedemail.com; dkim=pass header.d=infradead.org header.s=casper.20170209 header.b=jLWO4o3d; spf=none (imf25.hostedemail.com: domain of willy@infradead.org has no SPF policy when checking 90.155.50.34) smtp.mailfrom=willy@infradead.org; dmarc=none ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1674763984; a=rsa-sha256; cv=none; b=KF2K8TmUaIIldJ4T3TLwYtKG2SwPAMHPgD0tW4lsxmhSENzT7I21Ya9EwCppZP2fzcLKDO VGLuO8c5L+7qQve5Z++t/bLIlMOPTkIXeDvnsarhEff+65tfCP+GzjzNXAk/nhb/CP27Tv YdfTUOBf44WcSvqp9XbK7Z7+Nsy29I8= ARC-Authentication-Results: i=1; imf25.hostedemail.com; dkim=pass header.d=infradead.org header.s=casper.20170209 header.b=jLWO4o3d; spf=none (imf25.hostedemail.com: domain of willy@infradead.org has no SPF policy when checking 90.155.50.34) smtp.mailfrom=willy@infradead.org; dmarc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1674763984; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=t0A8wOKvaxrst2mVs1ZAI9ZA4QTUUo/XXggbrHRoOo0=; b=tGE0IEH8MBfqQiwk6ifKP7UExQ4cfxH86lsmmbj60L/xNiuHWxn8AfMOavsvR4IblbDvXp INirER+oBGsdesHZln1uOvDFebx0l3llX+sQj/T94M52r/LJrv559mEA0dZs3iZVQUkdh7 a7brXdwDTE2p2jZhoyZ3BfClSenpAS4= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To: Content-Type:Content-ID:Content-Description; bh=t0A8wOKvaxrst2mVs1ZAI9ZA4QTUUo/XXggbrHRoOo0=; b=jLWO4o3dIJG80P0aoBcdBkcnMX hndfjZDIGFFMvwC1p5H1T5YfEsdSkgp5Lkt7RDsp01iONXPo+zA5MU/igXBAOab1ye3et8/aVP89W 9guQC551EOdzqYXGAwvt1+MZ/C1C0EybqX8AgqGk6VGWAWtSAbBaq5QMXwY/NBLRA4Y+GUlNediX5 FQzBRs2naRyx1CQHH/3cRJUIpSvtLAoc70byW39ag4ey3pww56y9eAsE/6okdYgJjB7HA3lZQvdLs qqy2zd4mgRm8AZZHpeoLBLJORm41U6PLICHWPjJMDX4T2aszbbWya5M+udcp4AUzv7po0ixaQ5N4w PpVUVemg==; Received: from willy by casper.infradead.org with local (Exim 4.94.2 #2 (Red Hat Linux)) id 1pL8cD-0073MA-KG; Thu, 26 Jan 2023 20:12:57 +0000 From: "Matthew Wilcox (Oracle)" To: Andrew Morton Cc: "Matthew Wilcox (Oracle)" , Christoph Hellwig , linux-fsdevel@vger.kernel.org, linux-mm@kvack.org Subject: [PATCH 2/2] mpage: Convert __mpage_writepage() to use a folio more fully Date: Thu, 26 Jan 2023 20:12:55 +0000 Message-Id: <20230126201255.1681189-3-willy@infradead.org> X-Mailer: git-send-email 2.37.1 In-Reply-To: <20230126201255.1681189-1-willy@infradead.org> References: <20230126201255.1681189-1-willy@infradead.org> MIME-Version: 1.0 X-Rspam-User: X-Rspamd-Queue-Id: 4E436A000F X-Rspamd-Server: rspam01 X-Stat-Signature: xuh1gsn45511wapkk9xwqf1xpgz5iq75 X-HE-Tag: 1674763983-965121 X-HE-Meta: U2FsdGVkX19CacJZeaaOSNvkvKEkpBOdJt9TFxBYQCHAzXPrL6+URbO48u7HtNL1z4b5mYRp6alKmgRHT4TzoNIF22YjxxPn2mvwBoaEd7Us5pPyDa1rwpI+jumyagObt9lK9Lt94nrvtoL0Kumf+W6MyOx2fzuXiDZNqoNleZ9gGuO1bgJqVkgaY9Db1VHG+9ngsAkoVH3LftCvYNhyC1JIROB2LOGnHaJgq6e3tutlfJysCAK0f0fy5kdvYfTfNkF/du4EwSdMw6XXTC9xypSbFGYrkHX5cHzSIAxPYw7rhFE31AMXBF1wWL/nrdeK1eK2i4lG4XgDii2xHjWumRvAphk5sS586H9osn1U03PY2ncUu2Jj7V8TKteW1eQNd4hzeWXRqQIzgtLK5ZZfSqJ3/ap5OJpn4Hggtl4YgcRtJlUyB4PskfXo79NcMxrW+pRqcWy4hZ8+SzP2sXFNvsiUTnwbHmouG5K3x+arXfY/6Pk1gDR7yKeoC1qA/RIbfRY3qhwPRMTjnJMbTLaCygi0aWe9BTWnxCsyMw98RItOhizZDM7us2MdWleqZ6jwuUNa5V82w/SGA+2YZtutsLWV7zpv+MoTbqq+CSBZ0H82dax0qJZqa3BjzraacxdkI5a0jUWJakGIeqoFHyRiMGuAq47t/CFd+SJkw8u6fTTmKe4L97W1alTG8leuIt6IvjBzDCi988uSunzog30IkbW/Jh7wHeUVgEijLPRjaD+CniwftkwL40VrIYOxUNFvB0pAxniHVxtxMAdzcENiHeOKnK59S8HgXmAql4gH5aVgZYZ5mvglXCRafUo2zfGdY9IDS33k6JxVdyDTs8SWQObCmQH8o+es9pzs7C/9JXZIzvmFWUnxSuMZD2s8zJrvDrJGbxELtDrN8rRRaAq/XCL25LPsgmBpq+zAlrtl6w7Ln0yU6A6Mp34NZnBvTjH2+skxru91AovqQ+VrNsf SCZGTl7W ZpvjcQ2H8+jwKd6PauxGJ6+WDq9Pa/tTF5jXDTwglIkF16FPqO4w80fO1QKKGqyaaBQtW6Fb8fKC/NKe5TttcrSQLxEAyrwvwckfjI3UMKnFQQXPmfBo16sArELQC2of1cbsbkLjuSAtNJApTXZoh5lcABVylwqwqdmqh3MlfMyX+Md4d6JlkQmgaDZH8w7mgekVFy2LWoL6yZ4EBNPb1kDWtasnn7ozL3wvKrsnc03faR4AIpu4l5gbyAA== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: This is just a conversion to the folio API. While there are some nods towards supporting multi-page folios in here, the blocks array is still sized for one page's worth of blocks, and there are other assumptions such as the blocks_per_page variable. Signed-off-by: Matthew Wilcox (Oracle) --- fs/mpage.c | 45 +++++++++++++++++++++------------------------ 1 file changed, 21 insertions(+), 24 deletions(-) diff --git a/fs/mpage.c b/fs/mpage.c index 840f57ed2542..2efa393f0db7 100644 --- a/fs/mpage.c +++ b/fs/mpage.c @@ -448,13 +448,11 @@ void clean_page_buffers(struct page *page) static int __mpage_writepage(struct folio *folio, struct writeback_control *wbc, void *data) { - struct page *page = &folio->page; struct mpage_data *mpd = data; struct bio *bio = mpd->bio; - struct address_space *mapping = page->mapping; - struct inode *inode = page->mapping->host; + struct address_space *mapping = folio->mapping; + struct inode *inode = mapping->host; const unsigned blkbits = inode->i_blkbits; - unsigned long end_index; const unsigned blocks_per_page = PAGE_SIZE >> blkbits; sector_t last_block; sector_t block_in_file; @@ -465,13 +463,13 @@ static int __mpage_writepage(struct folio *folio, struct writeback_control *wbc, int boundary = 0; sector_t boundary_block = 0; struct block_device *boundary_bdev = NULL; - int length; + size_t length; struct buffer_head map_bh; loff_t i_size = i_size_read(inode); int ret = 0; + struct buffer_head *head = folio_buffers(folio); - if (page_has_buffers(page)) { - struct buffer_head *head = page_buffers(page); + if (head) { struct buffer_head *bh = head; /* If they're all mapped and dirty, do it */ @@ -523,8 +521,8 @@ static int __mpage_writepage(struct folio *folio, struct writeback_control *wbc, /* * The page has no buffers: map it to disk */ - BUG_ON(!PageUptodate(page)); - block_in_file = (sector_t)page->index << (PAGE_SHIFT - blkbits); + BUG_ON(!folio_test_uptodate(folio)); + block_in_file = (sector_t)folio->index << (PAGE_SHIFT - blkbits); /* * Whole page beyond EOF? Skip allocating blocks to avoid leaking * space. @@ -532,7 +530,7 @@ static int __mpage_writepage(struct folio *folio, struct writeback_control *wbc, if (block_in_file >= (i_size + (1 << blkbits) - 1) >> blkbits) goto page_is_mapped; last_block = (i_size - 1) >> blkbits; - map_bh.b_page = page; + map_bh.b_folio = folio; for (page_block = 0; page_block < blocks_per_page; ) { map_bh.b_state = 0; @@ -561,8 +559,8 @@ static int __mpage_writepage(struct folio *folio, struct writeback_control *wbc, first_unmapped = page_block; page_is_mapped: - end_index = i_size >> PAGE_SHIFT; - if (page->index >= end_index) { + length = folio_size(folio); + if (folio_pos(folio) + length > i_size) { /* * The page straddles i_size. It must be zeroed out on each * and every writepage invocation because it may be mmapped. @@ -571,11 +569,10 @@ static int __mpage_writepage(struct folio *folio, struct writeback_control *wbc, * is zeroed when mapped, and writes to that region are not * written out to the file." */ - unsigned offset = i_size & (PAGE_SIZE - 1); - - if (page->index > end_index || !offset) + length = i_size - folio_pos(folio); + if (WARN_ON_ONCE(folio_pos(folio) >= i_size)) goto confused; - zero_user_segment(page, offset, PAGE_SIZE); + folio_zero_segment(folio, length, folio_size(folio)); } /* @@ -588,7 +585,7 @@ static int __mpage_writepage(struct folio *folio, struct writeback_control *wbc, if (bio == NULL) { if (first_unmapped == blocks_per_page) { if (!bdev_write_page(bdev, blocks[0] << (blkbits - 9), - page, wbc)) + &folio->page, wbc)) goto out; } bio = bio_alloc(bdev, BIO_MAX_VECS, @@ -603,18 +600,18 @@ static int __mpage_writepage(struct folio *folio, struct writeback_control *wbc, * the confused fail path above (OOM) will be very confused when * it finds all bh marked clean (i.e. it will not write anything) */ - wbc_account_cgroup_owner(wbc, page, PAGE_SIZE); + wbc_account_cgroup_owner(wbc, &folio->page, folio_size(folio)); length = first_unmapped << blkbits; - if (bio_add_page(bio, page, length, 0) < length) { + if (!bio_add_folio(bio, folio, length, 0)) { bio = mpage_bio_submit(bio); goto alloc_new; } - clean_buffers(page, first_unmapped); + clean_buffers(&folio->page, first_unmapped); - BUG_ON(PageWriteback(page)); - set_page_writeback(page); - unlock_page(page); + BUG_ON(folio_test_writeback(folio)); + folio_start_writeback(folio); + folio_unlock(folio); if (boundary || (first_unmapped != blocks_per_page)) { bio = mpage_bio_submit(bio); if (boundary_block) { @@ -633,7 +630,7 @@ static int __mpage_writepage(struct folio *folio, struct writeback_control *wbc, /* * The caller has a ref on the inode, so *mapping is stable */ - ret = block_write_full_page(page, mpd->get_block, wbc); + ret = block_write_full_page(&folio->page, mpd->get_block, wbc); mapping_set_error(mapping, ret); out: mpd->bio = bio;