From patchwork Wed Oct 25 14:10:17 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 13436234 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 7A3F3C0032E for ; Wed, 25 Oct 2023 14:10:43 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id DDE766B0302; Wed, 25 Oct 2023 10:10:41 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id D8C9E6B0305; Wed, 25 Oct 2023 10:10:41 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id C7CA66B0307; Wed, 25 Oct 2023 10:10:41 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id ACACD6B0305 for ; Wed, 25 Oct 2023 10:10:41 -0400 (EDT) Received: from smtpin14.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id 56EF3C04F3 for ; Wed, 25 Oct 2023 14:10:41 +0000 (UTC) X-FDA: 81384169482.14.93DD165 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) by imf11.hostedemail.com (Postfix) with ESMTP id 173AE40023 for ; Wed, 25 Oct 2023 14:10:37 +0000 (UTC) Authentication-Results: imf11.hostedemail.com; dkim=pass header.d=infradead.org header.s=bombadil.20210309 header.b=kjmYQYUX; dmarc=none; spf=none (imf11.hostedemail.com: domain of BATV+38ff0d3703fb120512f4+7367+infradead.org+hch@bombadil.srs.infradead.org has no SPF policy when checking 198.137.202.133) smtp.mailfrom=BATV+38ff0d3703fb120512f4+7367+infradead.org+hch@bombadil.srs.infradead.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1698243038; 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=xXpAs87vXAa9NcBEUc0wVOYAyOZDx4ei3lj0IRgnDRM=; b=bwQYTV2OW16yrrcwNPMV0tPVdnu54u9v5hTWvVJazY0X+gc6rSbUKSfoS4227+cwrLJ80E gNi5nlfbLCwOsZxCTT6FBtZRG4HnM8AVFD29p9+eONt01nZLyzFh9OjLPyRYr4av/8H5vL 1jhama5WpbG8aZG3IwrUkYz4hiW9e18= ARC-Authentication-Results: i=1; imf11.hostedemail.com; dkim=pass header.d=infradead.org header.s=bombadil.20210309 header.b=kjmYQYUX; dmarc=none; spf=none (imf11.hostedemail.com: domain of BATV+38ff0d3703fb120512f4+7367+infradead.org+hch@bombadil.srs.infradead.org has no SPF policy when checking 198.137.202.133) smtp.mailfrom=BATV+38ff0d3703fb120512f4+7367+infradead.org+hch@bombadil.srs.infradead.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1698243038; a=rsa-sha256; cv=none; b=YOSqsg/ZN+9mtghRmI+UFCiGI1tz8dakTIDrUKItnCuDl5Hp7HndA3K/uwt5FobzN1LM0E yYXNRvamHTYUJ41nU+3PCobrZqmUUzfskYWoIir0x023Dbg+5UxlEm1eL7LIIIceorsm/Y lsg3hkWu3xurV7hGsqld6YOvHy53kV4= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20210309; 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=xXpAs87vXAa9NcBEUc0wVOYAyOZDx4ei3lj0IRgnDRM=; b=kjmYQYUXdwr23Na3Fs85kvexm3 tKafXooWcQ+nC1AYT81ALSCMPJQR1IxvgYrd9qXM+tmSkjdQEyKwqtzdO/Rh8OxjRl9dZnqw+iHzK lz6ZYNJPwUISI38kJGEDyJ+fd2T4cuCaDbcMWZFGZG/nhWNKhN5Lmmx9UHt/uuCBVBBQZ4VhgTwCy ZF8IqLEMn5OUDYhEXtH9j5e4F8nhz+zqvspVy/I/TQfhff41N4CxOdZ4yJtrhUsx6Q0SCa+1Z8p1t 1ICFXCt1HDWvaUE5GgJET3XdEzt3obj589ysFIjHVjgO9reBbkpYPXn9S2XmIc7excThupGm07EMF v1QPnScg==; Received: from 2a02-8389-2341-5b80-39d3-4735-9a3c-88d8.cable.dynamic.v6.surfer.at ([2a02:8389:2341:5b80:39d3:4735:9a3c:88d8] helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.96 #2 (Red Hat Linux)) id 1qveag-00CTws-0x; Wed, 25 Oct 2023 14:10:34 +0000 From: Christoph Hellwig To: Jens Axboe , Matthew Wilcox Cc: Ilya Dryomov , Andrew Morton , linux-block@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-xfs@vger.kernel.org, linux-mm@kvack.org, "Darrick J . Wong" Subject: [PATCH 1/4] filemap: add a per-mapping stable writes flag Date: Wed, 25 Oct 2023 16:10:17 +0200 Message-Id: <20231025141020.192413-2-hch@lst.de> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20231025141020.192413-1-hch@lst.de> References: <20231025141020.192413-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Rspam-User: X-Rspamd-Server: rspam12 X-Rspamd-Queue-Id: 173AE40023 X-Stat-Signature: 8aht97f8x41a119bewtck9kyqpd9qidj X-HE-Tag: 1698243037-270826 X-HE-Meta: U2FsdGVkX1/SjH2rmLaHA0T6cHwKCr8OXoG6prls/u/DcneZ/zsz/fbN6TTDs2NMmGRkB4EaAiwFTaxazMBb9ql/zwehS08ngF0IEzAh2u8HQ4K8zwO5m/SDKvmNYfKQpIct6K+n8ecoSIuLNI5FKsC80TMGN/SW85e0HAad840MEzj4F2rFWHwPjjvIPgSgBckCLYDHhcHQryQ9u1qPx9EYa/CDfOU/ChGaJFqvDFkWvvE920+DZuWfLO4jLYnDimyegweI4nRsADGKFG9etdo+Rp4RMQ9CgCkdZoNClo1n/ny9HxA5nXYx2KywCF4o7XNWEKrhmTDz8/+pViBnzyydL6KV5bxnJe7nXibe0o3KH36jEUv8q+Oy8EhUGa+dakrCbmHaCzwnp0s7vRhWpYl2pUBjNoIlvLS5vxTP/TK9N+HxeRe5yXHNz0+7WsmmbMrthBvnAxS6EHdtr1552N/saS4Wm8cfSC/YUHuFtNUKg//7PdTxGI3nVw0duWTaWnc4nD1eWLcmMF3BG/fvTPRIWAzc1It6vytVhQAeFctya9wQKrA8KhKhcn823sg11Q+K4ctizuWHVFff4+WYjgs1T6j3kMo9HlTAM7uiojZhjWRtwCczGxJTQL44RMHw1rUBowynRkejYxITtDaW+cUfzvbakbFB9UIif94et1dYwzLLmT+2EwwuFWhYM8LnUmqXQ6D9/3aFRDepgb6l9LtyN4JBYYKY5EMCRzAZR1bWTv13Of1W2zkzGuBoRLgsihE4eZBtRqZ8e/TT4ISJBTEMbUjdCYwmg5zixT9s4K4F1b3S5giDyDzvcljzE9W4n/wA7IYek4ZTcVRH2vLnK25NKXexpessyg1eT6UPqy91a2wUUH0Cdwr+LlJaj7Pv+x6K1cKmBOVgwNiRsfKSX3Pj1CHWw5dk5UWczCX5SVTsuOo3jD5VefY2HHQozW2hIuo4zZAuP2R1qK3+Pet 3AIjY6Ds B63pT36nZGMi5uzBDPBTG78J9bT+EgDEgZBUJ+31m8YuLXyLSqnv0WMMRoOBQC5KgkjYxl0hF3JZVlbIU75m8ywh7OH3Q52NWbsjZpSZBagPfv/R0u9R05v791xUIvuo/PcV0ngReiSGZ9OuWr/ex3d85kW2MjzwqEKRxh3nWUV44niW0yhOIQsykpLpMPUTYUv8k1UJUEFn5xGDuJFltQpxkxY1YnEZsy0t2hnnTpoYwwMGx55cdc4HIf44q3toJO8psY7v+8qZWe2m3QDhy4J1DXByqWYGwvg9U7Ap1jHAJalGu+kKKZEUTKeEYGkQQv/4K/7BKgk877+2ulNTiNDbv7i4JG2Gmu3KHIE5hyDk+lr6GEyMEvWJrBFsWyQfppFobQz70jIqHlIhfTDKB+enfyq7U4UhiGZ/rhJ83aqeM0ttYHaNBwrexI3TGrxph2z89s3yOe3f5ke1tzLZZ7QJFX+NjB7DgNkOczt1/hIwa8I1bL8PnW/B3UeJEpA2UTTEA10rsyQkx0SqfU6cAllT3Q3ufYccbrcHTOUquTycumXfgokl6yr24zg== 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: List-Subscribe: List-Unsubscribe: folio_wait_stable waits for writeback to finish before modifying the contents of a folio again, e.g. to support check summing of the data in the block integrity code. Currently this behavior is controlled by the SB_I_STABLE_WRITES flag on the super_block, which means it is uniform for the entire file system. This is wrong for the block device pseudofs which is shared by all block devices, or file systems that can use multiple devices like XFS witht the RT subvolume or btrfs (although btrfs currently reimplements folio_wait_stable anyway). Add a per-address_space AS_STABLE_WRITES flag to control the behavior in a more fine grained way. The existing SB_I_STABLE_WRITES is kept to initialize AS_STABLE_WRITES to the existing default which covers most cases. Signed-off-by: Christoph Hellwig Reviewed-by: Matthew Wilcox (Oracle) Reviewed-by: Darrick J. Wong Tested-by: Ilya Dryomov --- fs/inode.c | 2 ++ include/linux/pagemap.h | 17 +++++++++++++++++ mm/page-writeback.c | 2 +- 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/fs/inode.c b/fs/inode.c index 84bc3c76e5ccb5..ae1a6410b53d7e 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -215,6 +215,8 @@ int inode_init_always(struct super_block *sb, struct inode *inode) lockdep_set_class_and_name(&mapping->invalidate_lock, &sb->s_type->invalidate_lock_key, "mapping.invalidate_lock"); + if (sb->s_iflags & SB_I_STABLE_WRITES) + mapping_set_stable_writes(mapping); inode->i_private = NULL; inode->i_mapping = mapping; INIT_HLIST_HEAD(&inode->i_dentry); /* buggered by rcu freeing */ diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h index 351c3b7f93a14e..8c9608b217b000 100644 --- a/include/linux/pagemap.h +++ b/include/linux/pagemap.h @@ -204,6 +204,8 @@ enum mapping_flags { AS_NO_WRITEBACK_TAGS = 5, AS_LARGE_FOLIO_SUPPORT = 6, AS_RELEASE_ALWAYS, /* Call ->release_folio(), even if no private data */ + AS_STABLE_WRITES, /* must wait for writeback before modifying + folio contents */ }; /** @@ -289,6 +291,21 @@ static inline void mapping_clear_release_always(struct address_space *mapping) clear_bit(AS_RELEASE_ALWAYS, &mapping->flags); } +static inline bool mapping_stable_writes(const struct address_space *mapping) +{ + return test_bit(AS_STABLE_WRITES, &mapping->flags); +} + +static inline void mapping_set_stable_writes(struct address_space *mapping) +{ + set_bit(AS_STABLE_WRITES, &mapping->flags); +} + +static inline void mapping_clear_stable_writes(struct address_space *mapping) +{ + clear_bit(AS_STABLE_WRITES, &mapping->flags); +} + static inline gfp_t mapping_gfp_mask(struct address_space * mapping) { return mapping->gfp_mask; diff --git a/mm/page-writeback.c b/mm/page-writeback.c index b8d3d7040a506a..4656534b8f5cc6 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c @@ -3110,7 +3110,7 @@ EXPORT_SYMBOL_GPL(folio_wait_writeback_killable); */ void folio_wait_stable(struct folio *folio) { - if (folio_inode(folio)->i_sb->s_iflags & SB_I_STABLE_WRITES) + if (mapping_stable_writes(folio_mapping(folio))) folio_wait_writeback(folio); } EXPORT_SYMBOL_GPL(folio_wait_stable);