From nobody Thu Oct 2 13:01:34 2025 Received: from mail-wm1-f52.google.com (mail-wm1-f52.google.com [209.85.128.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 164BE3191B0 for ; Tue, 16 Sep 2025 13:59:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758031179; cv=none; b=gq6BMdbyTbvT2OJTy6Yp7nMI+ob8Gv8Awo6sTeqqQawXKJ/U4uGQaJRVpnaVxqGAEWC5+epK7ZoIe4OdMUGddflOFZngaJQbQYu/n+Hv6T1GXfVI7rSHoirSQoZRRav2oCZQsuk5dBcDFC3JFtsSuoLJwxG3en85CGJi//qyDJw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758031179; c=relaxed/simple; bh=4ZH9W3P+XiG/Sp7tBDITc58g7he5Ng0NmNakO8szh+8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Vm4WpnVjSYkLMw7x4GMByWvLuHlr5AR1yId+VivYk6PXj/c36mQkZ2G5X/MP/BOMH5Ej8040T6Rq64BSBylqF5KNavqdJ16GUT1H+UDQbibQf6oIs8QpVroS0sle35uwDXK//L80atadEDa/jCjge8EpG77cSz+H4xZVg9mrcn8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=NzHK56T4; arc=none smtp.client-ip=209.85.128.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="NzHK56T4" Received: by mail-wm1-f52.google.com with SMTP id 5b1f17b1804b1-45dcfecdc0fso55132075e9.1 for ; Tue, 16 Sep 2025 06:59:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1758031174; x=1758635974; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=EhJbct8Hpn8FASNagja9p1KxL0ag1VLHqziGZAwrXc4=; b=NzHK56T4Gc9JTM6H5ShPFQQhyyD1KBGLZZDgYq4XZa1aMIo2n4DP9S0SqtZSlgWAel URh6NqbNPTAC0XBYWmTWUCNq3f7yIBNCgTDGy30CRsnWD3N6BeCrDUdCf8AY1Jy0sxfs WxF4HDJQyHIVnXBszwq0VmZmX6SitvC+7rsMYWXwI9n075Gotqh9WWoCi35qff0KJekl vzrjUrDNBpGx9Ytd4bcUK8NHqrUw/DQeUDJF/Nrmm/urXLiciDnr62isLxnvHErkwNE9 ChRWElykA0Gkfi8CJCeridEoKr/rNMWmUrWzXUSrCFAYe/597o+/Dg7K3iJmLIkP7uTy 7GFA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758031174; x=1758635974; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=EhJbct8Hpn8FASNagja9p1KxL0ag1VLHqziGZAwrXc4=; b=cZqik5zITFqSIwv8du09yGiwEs9pqp3VEfvc3+/P/watbWSjvkK+W0B6xz/p9NRm4e b6hiLjzlMO8A3PsZemZY+8ZueuuAY+Jp+OcYs2g1GTK1KBYjaCGEveKz5qLuuhgr+RYX +SlL/qGp4sklBu+4QaP2KtFmhlfg2hdeUpsMGMmdiJ3PdetILSOH16mYYHCm9BOck+Zs as2r9vJy8a+As6KaON0MwQVnwk7Uy0i2NJJoHuRXrdRJyLW3DBjzA3+H1R1WckaRfXQ7 vWJj1BL564NoFZn6LTF4gjOI2ohlW2Hy3oxH7kX2CJmIuG5XxyrXqejRcldP76G/oPHe 5rQA== X-Forwarded-Encrypted: i=1; AJvYcCXKgpt8+VsxBHm515tP5dEAJPlwf5r9QwZ0BHLkpxmG8joWMj/y4rA30cNHaXXyuItjtHLOh6U9wpRqwD0=@vger.kernel.org X-Gm-Message-State: AOJu0YxM/nE9e+eCigCIOc11CaNLhaEGiBblRSx6TEmRYjW3ymUuRlXj 01xuuRZDDLnxRoJWpzPZyBDtHlAsv1HGUTLi7FxU4sTuqYCXrIQ2BSir X-Gm-Gg: ASbGnctZ22OFNi6nbwmxTSBZC9eTle3Ki2qKDKVfol2sqlxU3hTvYz7baO6q2sA6dVJ s1VYdriuC+ER0TX1zD8roLRqwYwI1eaD2QLYW7qD3jW0qJqPZqe55M98p3WdgZoWQQWFhdJbGAm qfmg3aGMYTUOO9Jx2oYg8uu1N3dLRuoBzavKJX82kHzTjQo8G6alpWhYxnu6A+ejclurNg8Ln+3 MCYnZh84B7z3gnpPJDlRwUdpkiCNW6wrx1CIHFuiGYLnqmiZprbbyPrX8UQ0vNwVTUYC0QM7fW5 xNrn1IvU5XplQhMmxBeUeXDwXq+DlRnCEfewhHvJknrsY3M59fpcx6oitbUSLBqzjhX5tGIMpEL WaO+KaWCZ5Qn4Ggv+WD4UnL8t1IT685oW5yvNG6qfw/Dq52R9ukzY9TwFZNU0eCCGTDyTZKht X-Google-Smtp-Source: AGHT+IEv/yp+v5i4wDZD8rx/vzr2v/aCCUSPqPNX1ISHbufqpWah1qF1v3yMiZroJvxSpOFaPBPDfg== X-Received: by 2002:a5d:5d01:0:b0:3e1:734b:5393 with SMTP id ffacd0b85a97d-3e7657b6a36mr14835320f8f.28.1758031174218; Tue, 16 Sep 2025 06:59:34 -0700 (PDT) Received: from f.. (cst-prg-88-146.cust.vodafone.cz. [46.135.88.146]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3e7cde81491sm16557991f8f.42.2025.09.16.06.59.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 16 Sep 2025 06:59:33 -0700 (PDT) From: Mateusz Guzik To: brauner@kernel.org Cc: viro@zeniv.linux.org.uk, jack@suse.cz, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, josef@toxicpanda.com, kernel-team@fb.com, amir73il@gmail.com, linux-btrfs@vger.kernel.org, linux-ext4@vger.kernel.org, linux-xfs@vger.kernel.org, ceph-devel@vger.kernel.org, linux-unionfs@vger.kernel.org, Mateusz Guzik Subject: [PATCH v4 01/12] fs: provide accessors for ->i_state Date: Tue, 16 Sep 2025 15:58:49 +0200 Message-ID: <20250916135900.2170346-2-mjguzik@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250916135900.2170346-1-mjguzik@gmail.com> References: <20250916135900.2170346-1-mjguzik@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Open-coded accesses prevent asserting they are done correctly. One obvious aspect is locking, but significantly more can checked. For example it can be detected when the code is clearing flags which are already missing, or is setting flags when it is illegal (e.g., I_FREEING when ->i_count > 0). In order to keep things manageable this patchset merely gets the thing off the ground with only lockdep checks baked in. Current consumers can be trivially converted. Suppose flags I_A and I_B are to be handled, then if ->i_lock is held: state =3D inode->i_state =3D> state =3D inode_state_read(inode) inode->i_state |=3D (I_A | I_B) =3D> inode_state_add(inode, I_A | I_B) inode->i_state &=3D ~(I_A | I_B) =3D> inode_state_del(inode, I_A | I_B) inode->i_state =3D I_A | I_B =3D> inode_state_set(inode, I_A | I_B) If ->i_lock is not held or only held conditionally, add "_once" suffix for the read routine or "_raw" for the rest: state =3D inode->i_state =3D> state =3D inode_state_read_once(inode) inode->i_state |=3D (I_A | I_B) =3D> inode_state_add_raw(inode, I_A | I_B) inode->i_state &=3D ~(I_A | I_B) =3D> inode_state_del_raw(inode, I_A | I_B) inode->i_state =3D I_A | I_B =3D> inode_state_set_raw(inode, I_A | I_B) The "_once" vs "_raw" discrepancy stems from the read variant differing by READ_ONCE as opposed to just lockdep checks. Signed-off-by: Mateusz Guzik --- include/linux/fs.h | 59 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 57 insertions(+), 2 deletions(-) diff --git a/include/linux/fs.h b/include/linux/fs.h index c4fd010cf5bf..d54171f13c7a 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -756,7 +756,7 @@ enum inode_state_bits { /* reserved wait address bit 3 */ }; =20 -enum inode_state_flags_t { +enum inode_state_flags_enum { I_NEW =3D (1U << __I_NEW), I_SYNC =3D (1U << __I_SYNC), I_LRU_ISOLATING =3D (1U << __I_LRU_ISOLATING), @@ -840,7 +840,7 @@ struct inode { #endif =20 /* Misc */ - enum inode_state_flags_t i_state; + enum inode_state_flags_enum i_state; /* 32-bit hole */ struct rw_semaphore i_rwsem; =20 @@ -899,6 +899,61 @@ struct inode { void *i_private; /* fs or device private pointer */ } __randomize_layout; =20 +/* + * i_state handling + * + * We hide all of it behind helpers so that we can validate consumers. + */ +static inline enum inode_state_flags_enum inode_state_read_once(struct ino= de *inode) +{ + return READ_ONCE(inode->i_state); +} + +static inline enum inode_state_flags_enum inode_state_read(struct inode *i= node) +{ + lockdep_assert_held(&inode->i_lock); + return inode->i_state; +} + +static inline void inode_state_add_raw(struct inode *inode, + enum inode_state_flags_enum addflags) +{ + WRITE_ONCE(inode->i_state, inode->i_state | addflags); +} + +static inline void inode_state_add(struct inode *inode, + enum inode_state_flags_enum addflags) +{ + lockdep_assert_held(&inode->i_lock); + inode_state_add_raw(inode, addflags); +} + +static inline void inode_state_del_raw(struct inode *inode, + enum inode_state_flags_enum delflags) +{ + WRITE_ONCE(inode->i_state, inode->i_state & ~delflags); +} + +static inline void inode_state_del(struct inode *inode, + enum inode_state_flags_enum delflags) +{ + lockdep_assert_held(&inode->i_lock); + inode_state_del_raw(inode, delflags); +} + +static inline void inode_state_set_raw(struct inode *inode, + enum inode_state_flags_enum setflags) +{ + WRITE_ONCE(inode->i_state, setflags); +} + +static inline void inode_state_set(struct inode *inode, + enum inode_state_flags_enum setflags) +{ + lockdep_assert_held(&inode->i_lock); + inode_state_set_raw(inode, setflags); +} + static inline void inode_set_cached_link(struct inode *inode, char *link, = int linklen) { VFS_WARN_ON_INODE(strlen(link) !=3D linklen, inode); --=20 2.43.0 From nobody Thu Oct 2 13:01:34 2025 Received: from mail-wm1-f43.google.com (mail-wm1-f43.google.com [209.85.128.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5BF9332F77B for ; Tue, 16 Sep 2025 13:59:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758031183; cv=none; b=LeUENXQPKKtNxQI8h4r3gzw/5L+uTZCT+trVyFDECqAoMUknU4GiV+BPeDBrSApEvhjBv1WlQd48EZjqW2eS+SzIu11EIhLDZbkjWUBS9+dwk66Eb1VXBK4LPT2v+CF9+nQmbMM4dQsSyO3av027EXR/fP5Aab8w1kZ0803WR2E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758031183; c=relaxed/simple; bh=IGSunrzEElz4akZeQ3N0OYEBqVMiyo0WjCGj3Y4H9pc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=lo3HzoY5TLKS9hOxXovsgILIaVEEhic2qlhKr3MQd2amulbEt1YyMFDf3kU4w1QlnKl19QERRDOxAGL8hCH/zivL1Z8OXTRt2Q4c7L8mJmRVGxtT8NO9hBanOy12AYrassLdacD/P5fOo0sXrMI1Sz8r8ijtD+OV2anauB2GM5I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=dfWImYiL; arc=none smtp.client-ip=209.85.128.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="dfWImYiL" Received: by mail-wm1-f43.google.com with SMTP id 5b1f17b1804b1-45dfb8e986aso55260155e9.0 for ; Tue, 16 Sep 2025 06:59:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1758031177; x=1758635977; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=xyhBxHQwYteMnw1Ttku8fLep13CUYFk/AGDNu0DHIbc=; b=dfWImYiLOpP8+m+gY7HlgEKQaymOY3sAo7whasxGSgbhxN0/YcyOiNByeeRFnrzhMW LIu6w9522v9JyyGn1Yl8yOEYkf+tUmNVggFrL1n7zZwv8hoZuh5BtC9T6C4n0V33cOXX w5WSrQUJxjriFjR7hRn9HNp00XjSEOwMxK88qfDsUynVnL3m0akHZ5Io//kcWXJyRTRy trGMHYYW1c22B/95Do9KjlDn5y8/4q7SnkEZQS/ogyS8myZeXQXzpAwRFZtF1APnA4at DmL+5qhrZkeUtteIulDcVhu043XzEH3KPVICkJL68xE9qbi2pma2W0H47XnqPYbB+RcS NptQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758031177; x=1758635977; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=xyhBxHQwYteMnw1Ttku8fLep13CUYFk/AGDNu0DHIbc=; b=m0sXNyx06e9qK0lmqmXU3HSok0+BkQwe7tAVhwkKwS9fqjrDaAsx0sU7pcvdMxCeb9 0ojMoqx5lWMwhM/zqnA9nqsEjleBPqbE7CZY9jce2JGS4ADYbf9Cq6jET8z7RUDvmtBb ocPXtaxAM4pZGmBlWZkSEHY4gXtS6+M26BLIAug8A2eI1qn+9vZwviCy0yWLubEiG9Lm wBwtLFu5Lnz6XMTfb+7bDTYsjld+W3+8u+3/1WXiEiHwQGFvJ2Miuf8F21IKkrTrP0Kc umaf9G/LiRlIQCBaGpbiVVNsVV3deY7RPclsZvu83DCUChEOIrPINGGl6qPnZXAOUWcX Zrjg== X-Forwarded-Encrypted: i=1; AJvYcCUcS1MVxizDOamRiCvRYCGpKfPdm+8+WBHnvzKItdRbrNz+v3ubjUuxDv0jnFgZTbvMmHpSGzCUYcwjGIQ=@vger.kernel.org X-Gm-Message-State: AOJu0YyY/EMTfoU0GeoGdDe+fFqoksN0XgfR+6LJLjkmU53DTeBq9foY VYSttW1O02kLOv3Fxr2hOaZuWyn60tNa12CLUn379Xks4+u4/i4zziAK X-Gm-Gg: ASbGncsP5n4eduXl+w0a/gfDaOp3+KcAJlVTvfhmc6paqwUcxplPHe/wdAbX9ZPtDpH vBEvtR2JAaCXR2LcbWPiiADvsSe7dubvgS4VQ0JCIVe5KMnTmsfXnj8OOycMDrc/hcZsoLUmJVb 2KT+6OQE5voinKsQx6UX7GfFwdy40Pz0AM/LAcUJO3tsnTFY0Q5py9mwgQMa+C0ARfDi7AwjvK2 se9IOzC/es9OXgbxdWjC5PUxyIQSL2WKLv/aj1q8O26aoenYKKIvQ8Qu0sadWi3DvmUTh7xuxh/ V7BbvGJApBw5xeMHRMWSyIS+CD2HC6s8GpQvrZjsUxy9bY+TsS8z0msVG+gRAWC+1iDr/LDqDRp fwFEhPJ/rbs/KLS07DC1Toyw2UYJlJTuvFwlWz0DHhJtLeJdDbeFQqC518mpqpA5LQNWqz8RG X-Google-Smtp-Source: AGHT+IHPAVLa1C63CYK643jkviPAJC2HW2ZWDNPl/l9MBNz/LRCjVeKDvCVWGLCK1ffsYHTpLqlxzg== X-Received: by 2002:a05:600c:b5a:b0:45b:7c4c:cfbf with SMTP id 5b1f17b1804b1-45f211f6a84mr110169335e9.23.1758031176263; Tue, 16 Sep 2025 06:59:36 -0700 (PDT) Received: from f.. (cst-prg-88-146.cust.vodafone.cz. [46.135.88.146]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3e7cde81491sm16557991f8f.42.2025.09.16.06.59.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 16 Sep 2025 06:59:35 -0700 (PDT) From: Mateusz Guzik To: brauner@kernel.org Cc: viro@zeniv.linux.org.uk, jack@suse.cz, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, josef@toxicpanda.com, kernel-team@fb.com, amir73il@gmail.com, linux-btrfs@vger.kernel.org, linux-ext4@vger.kernel.org, linux-xfs@vger.kernel.org, ceph-devel@vger.kernel.org, linux-unionfs@vger.kernel.org, Mateusz Guzik Subject: [PATCH v4 02/12] fs: use ->i_state accessors in core kernel Date: Tue, 16 Sep 2025 15:58:50 +0200 Message-ID: <20250916135900.2170346-3-mjguzik@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250916135900.2170346-1-mjguzik@gmail.com> References: <20250916135900.2170346-1-mjguzik@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Signed-off-by: Mateusz Guzik --- cheat sheet: Suppose flags I_A and I_B are to be handled, then if ->i_lock is held: state =3D inode->i_state =3D> state =3D inode_state_read(inode) inode->i_state |=3D (I_A | I_B) =3D> inode_state_add(inode, I_A | I_B) inode->i_state &=3D ~(I_A | I_B) =3D> inode_state_del(inode, I_A | I_B) inode->i_state =3D I_A | I_B =3D> inode_state_set(inode, I_A | I_B) If ->i_lock is not held or only held conditionally, add "_once" suffix for the read routine or "_raw" for the rest: state =3D inode->i_state =3D> state =3D inode_state_read_once(inod= e) inode->i_state |=3D (I_A | I_B) =3D> inode_state_add_raw(inode, I_A | I_B) inode->i_state &=3D ~(I_A | I_B) =3D> inode_state_del_raw(inode, I_A | I_B) inode->i_state =3D I_A | I_B =3D> inode_state_set_raw(inode, I_A | I_B) block/bdev.c | 4 +- drivers/dax/super.c | 2 +- fs/buffer.c | 4 +- fs/crypto/keyring.c | 2 +- fs/crypto/keysetup.c | 2 +- fs/dcache.c | 8 +- fs/drop_caches.c | 2 +- fs/fs-writeback.c | 123 ++++++++++++++++--------------- fs/inode.c | 104 +++++++++++++------------- fs/libfs.c | 6 +- fs/namei.c | 8 +- fs/notify/fsnotify.c | 2 +- fs/pipe.c | 2 +- fs/quota/dquot.c | 2 +- fs/sync.c | 2 +- include/linux/backing-dev.h | 5 +- include/linux/fs.h | 4 +- include/linux/writeback.h | 4 +- include/trace/events/writeback.h | 8 +- mm/backing-dev.c | 2 +- security/landlock/fs.c | 2 +- 21 files changed, 149 insertions(+), 149 deletions(-) diff --git a/block/bdev.c b/block/bdev.c index b77ddd12dc06..a25b8607039e 100644 --- a/block/bdev.c +++ b/block/bdev.c @@ -67,7 +67,7 @@ static void bdev_write_inode(struct block_device *bdev) int ret; =20 spin_lock(&inode->i_lock); - while (inode->i_state & I_DIRTY) { + while (inode_state_read(inode) & I_DIRTY) { spin_unlock(&inode->i_lock); ret =3D write_inode_now(inode, true); if (ret) @@ -1265,7 +1265,7 @@ void sync_bdevs(bool wait) struct block_device *bdev; =20 spin_lock(&inode->i_lock); - if (inode->i_state & (I_FREEING|I_WILL_FREE|I_NEW) || + if (inode_state_read(inode) & (I_FREEING | I_WILL_FREE | I_NEW) || mapping->nrpages =3D=3D 0) { spin_unlock(&inode->i_lock); continue; diff --git a/drivers/dax/super.c b/drivers/dax/super.c index 54c480e874cb..75015a189ac8 100644 --- a/drivers/dax/super.c +++ b/drivers/dax/super.c @@ -433,7 +433,7 @@ static struct dax_device *dax_dev_get(dev_t devt) return NULL; =20 dax_dev =3D to_dax_dev(inode); - if (inode->i_state & I_NEW) { + if (inode_state_read_once(inode) & I_NEW) { set_bit(DAXDEV_ALIVE, &dax_dev->flags); inode->i_cdev =3D &dax_dev->cdev; inode->i_mode =3D S_IFCHR; diff --git a/fs/buffer.c b/fs/buffer.c index ead4dc85debd..c606b99a2838 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -611,9 +611,9 @@ int generic_buffers_fsync_noflush(struct file *file, lo= ff_t start, loff_t end, return err; =20 ret =3D sync_mapping_buffers(inode->i_mapping); - if (!(inode->i_state & I_DIRTY_ALL)) + if (!(inode_state_read_once(inode) & I_DIRTY_ALL)) goto out; - if (datasync && !(inode->i_state & I_DIRTY_DATASYNC)) + if (datasync && !(inode_state_read_once(inode) & I_DIRTY_DATASYNC)) goto out; =20 err =3D sync_inode_metadata(inode, 1); diff --git a/fs/crypto/keyring.c b/fs/crypto/keyring.c index 7557f6a88b8f..34beb60bc24e 100644 --- a/fs/crypto/keyring.c +++ b/fs/crypto/keyring.c @@ -957,7 +957,7 @@ static void evict_dentries_for_decrypted_inodes(struct = fscrypt_master_key *mk) list_for_each_entry(ci, &mk->mk_decrypted_inodes, ci_master_key_link) { inode =3D ci->ci_inode; spin_lock(&inode->i_lock); - if (inode->i_state & (I_FREEING | I_WILL_FREE | I_NEW)) { + if (inode_state_read(inode) & (I_FREEING | I_WILL_FREE | I_NEW)) { spin_unlock(&inode->i_lock); continue; } diff --git a/fs/crypto/keysetup.c b/fs/crypto/keysetup.c index c1f85715c276..b801c47f5699 100644 --- a/fs/crypto/keysetup.c +++ b/fs/crypto/keysetup.c @@ -859,7 +859,7 @@ int fscrypt_drop_inode(struct inode *inode) * userspace is still using the files, inodes can be dirtied between * then and now. We mustn't lose any writes, so skip dirty inodes here. */ - if (inode->i_state & I_DIRTY_ALL) + if (inode_state_read(inode) & I_DIRTY_ALL) return 0; =20 /* diff --git a/fs/dcache.c b/fs/dcache.c index 60046ae23d51..e01c8b678a6f 100644 --- a/fs/dcache.c +++ b/fs/dcache.c @@ -794,7 +794,7 @@ void d_mark_dontcache(struct inode *inode) de->d_flags |=3D DCACHE_DONTCACHE; spin_unlock(&de->d_lock); } - inode->i_state |=3D I_DONTCACHE; + inode_state_add(inode, I_DONTCACHE); spin_unlock(&inode->i_lock); } EXPORT_SYMBOL(d_mark_dontcache); @@ -1073,7 +1073,7 @@ struct dentry *d_find_alias_rcu(struct inode *inode) spin_lock(&inode->i_lock); // ->i_dentry and ->i_rcu are colocated, but the latter won't be // used without having I_FREEING set, which means no aliases left - if (likely(!(inode->i_state & I_FREEING) && !hlist_empty(l))) { + if (likely(!(inode_state_read(inode) & I_FREEING) && !hlist_empty(l))) { if (S_ISDIR(inode->i_mode)) { de =3D hlist_entry(l->first, struct dentry, d_u.d_alias); } else { @@ -1980,8 +1980,8 @@ void d_instantiate_new(struct dentry *entry, struct i= node *inode) security_d_instantiate(entry, inode); spin_lock(&inode->i_lock); __d_instantiate(entry, inode); - WARN_ON(!(inode->i_state & I_NEW)); - inode->i_state &=3D ~I_NEW & ~I_CREATING; + WARN_ON(!(inode_state_read(inode) & I_NEW)); + inode_state_del(inode, I_NEW | I_CREATING); /* * Pairs with the barrier in prepare_to_wait_event() to make sure * ___wait_var_event() either sees the bit cleared or diff --git a/fs/drop_caches.c b/fs/drop_caches.c index 019a8b4eaaf9..49f56a598ecb 100644 --- a/fs/drop_caches.c +++ b/fs/drop_caches.c @@ -28,7 +28,7 @@ static void drop_pagecache_sb(struct super_block *sb, voi= d *unused) * inodes without pages but we deliberately won't in case * we need to reschedule to avoid softlockups. */ - if ((inode->i_state & (I_FREEING|I_WILL_FREE|I_NEW)) || + if ((inode_state_read(inode) & (I_FREEING | I_WILL_FREE | I_NEW)) || (mapping_empty(inode->i_mapping) && !need_resched())) { spin_unlock(&inode->i_lock); continue; diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index 6088a67b2aae..edeca83a9068 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c @@ -121,7 +121,7 @@ static bool inode_io_list_move_locked(struct inode *ino= de, { assert_spin_locked(&wb->list_lock); assert_spin_locked(&inode->i_lock); - WARN_ON_ONCE(inode->i_state & I_FREEING); + WARN_ON_ONCE(inode_state_read(inode) & I_FREEING); =20 list_move(&inode->i_io_list, head); =20 @@ -304,9 +304,9 @@ static void inode_cgwb_move_to_attached(struct inode *i= node, { assert_spin_locked(&wb->list_lock); assert_spin_locked(&inode->i_lock); - WARN_ON_ONCE(inode->i_state & I_FREEING); + WARN_ON_ONCE(inode_state_read(inode) & I_FREEING); =20 - inode->i_state &=3D ~I_SYNC_QUEUED; + inode_state_del(inode, I_SYNC_QUEUED); if (wb !=3D &wb->bdi->wb) list_move(&inode->i_io_list, &wb->b_attached); else @@ -408,7 +408,7 @@ static bool inode_do_switch_wbs(struct inode *inode, * Once I_FREEING or I_WILL_FREE are visible under i_lock, the eviction * path owns the inode and we shouldn't modify ->i_io_list. */ - if (unlikely(inode->i_state & (I_FREEING | I_WILL_FREE))) + if (unlikely(inode_state_read(inode) & (I_FREEING | I_WILL_FREE))) goto skip_switch; =20 trace_inode_switch_wbs(inode, old_wb, new_wb); @@ -452,7 +452,7 @@ static bool inode_do_switch_wbs(struct inode *inode, if (!list_empty(&inode->i_io_list)) { inode->i_wb =3D new_wb; =20 - if (inode->i_state & I_DIRTY_ALL) { + if (inode_state_read(inode) & I_DIRTY_ALL) { struct inode *pos; =20 list_for_each_entry(pos, &new_wb->b_dirty, i_io_list) @@ -475,10 +475,11 @@ static bool inode_do_switch_wbs(struct inode *inode, switched =3D true; skip_switch: /* - * Paired with load_acquire in unlocked_inode_to_wb_begin() and + * Paired with an acquire fence in unlocked_inode_to_wb_begin() and * ensures that the new wb is visible if they see !I_WB_SWITCH. */ - smp_store_release(&inode->i_state, inode->i_state & ~I_WB_SWITCH); + smp_wmb(); + inode_state_del(inode, I_WB_SWITCH); =20 xa_unlock_irq(&mapping->i_pages); spin_unlock(&inode->i_lock); @@ -560,12 +561,12 @@ static bool inode_prepare_wbs_switch(struct inode *in= ode, /* while holding I_WB_SWITCH, no one else can update the association */ spin_lock(&inode->i_lock); if (!(inode->i_sb->s_flags & SB_ACTIVE) || - inode->i_state & (I_WB_SWITCH | I_FREEING | I_WILL_FREE) || + inode_state_read(inode) & (I_WB_SWITCH | I_FREEING | I_WILL_FREE) || inode_to_wb(inode) =3D=3D new_wb) { spin_unlock(&inode->i_lock); return false; } - inode->i_state |=3D I_WB_SWITCH; + inode_state_add(inode, I_WB_SWITCH); __iget(inode); spin_unlock(&inode->i_lock); =20 @@ -587,7 +588,7 @@ static void inode_switch_wbs(struct inode *inode, int n= ew_wb_id) struct inode_switch_wbs_context *isw; =20 /* noop if seems to be already in progress */ - if (inode->i_state & I_WB_SWITCH) + if (inode_state_read_once(inode) & I_WB_SWITCH) return; =20 /* avoid queueing a new switch if too many are already in flight */ @@ -1197,9 +1198,9 @@ static void inode_cgwb_move_to_attached(struct inode = *inode, { assert_spin_locked(&wb->list_lock); assert_spin_locked(&inode->i_lock); - WARN_ON_ONCE(inode->i_state & I_FREEING); + WARN_ON_ONCE(inode_state_read(inode) & I_FREEING); =20 - inode->i_state &=3D ~I_SYNC_QUEUED; + inode_state_del(inode, I_SYNC_QUEUED); list_del_init(&inode->i_io_list); wb_io_lists_depopulated(wb); } @@ -1312,7 +1313,7 @@ void inode_io_list_del(struct inode *inode) wb =3D inode_to_wb_and_lock_list(inode); spin_lock(&inode->i_lock); =20 - inode->i_state &=3D ~I_SYNC_QUEUED; + inode_state_del(inode, I_SYNC_QUEUED); list_del_init(&inode->i_io_list); wb_io_lists_depopulated(wb); =20 @@ -1370,13 +1371,13 @@ static void redirty_tail_locked(struct inode *inode= , struct bdi_writeback *wb) { assert_spin_locked(&inode->i_lock); =20 - inode->i_state &=3D ~I_SYNC_QUEUED; + inode_state_del(inode, I_SYNC_QUEUED); /* * When the inode is being freed just don't bother with dirty list * tracking. Flush worker will ignore this inode anyway and it will * trigger assertions in inode_io_list_move_locked(). */ - if (inode->i_state & I_FREEING) { + if (inode_state_read(inode) & I_FREEING) { list_del_init(&inode->i_io_list); wb_io_lists_depopulated(wb); return; @@ -1410,7 +1411,7 @@ static void inode_sync_complete(struct inode *inode) { assert_spin_locked(&inode->i_lock); =20 - inode->i_state &=3D ~I_SYNC; + inode_state_del(inode, I_SYNC); /* If inode is clean an unused, put it into LRU now... */ inode_add_lru(inode); /* Called with inode->i_lock which ensures memory ordering. */ @@ -1454,7 +1455,7 @@ static int move_expired_inodes(struct list_head *dela= ying_queue, spin_lock(&inode->i_lock); list_move(&inode->i_io_list, &tmp); moved++; - inode->i_state |=3D I_SYNC_QUEUED; + inode_state_add(inode, I_SYNC_QUEUED); spin_unlock(&inode->i_lock); if (sb_is_blkdev_sb(inode->i_sb)) continue; @@ -1540,14 +1541,14 @@ void inode_wait_for_writeback(struct inode *inode) =20 assert_spin_locked(&inode->i_lock); =20 - if (!(inode->i_state & I_SYNC)) + if (!(inode_state_read(inode) & I_SYNC)) return; =20 wq_head =3D inode_bit_waitqueue(&wqe, inode, __I_SYNC); for (;;) { prepare_to_wait_event(wq_head, &wqe.wq_entry, TASK_UNINTERRUPTIBLE); /* Checking I_SYNC with inode->i_lock guarantees memory ordering. */ - if (!(inode->i_state & I_SYNC)) + if (!(inode_state_read(inode) & I_SYNC)) break; spin_unlock(&inode->i_lock); schedule(); @@ -1573,7 +1574,7 @@ static void inode_sleep_on_writeback(struct inode *in= ode) wq_head =3D inode_bit_waitqueue(&wqe, inode, __I_SYNC); prepare_to_wait_event(wq_head, &wqe.wq_entry, TASK_UNINTERRUPTIBLE); /* Checking I_SYNC with inode->i_lock guarantees memory ordering. */ - sleep =3D !!(inode->i_state & I_SYNC); + sleep =3D !!(inode_state_read(inode) & I_SYNC); spin_unlock(&inode->i_lock); if (sleep) schedule(); @@ -1592,7 +1593,7 @@ static void requeue_inode(struct inode *inode, struct= bdi_writeback *wb, struct writeback_control *wbc, unsigned long dirtied_before) { - if (inode->i_state & I_FREEING) + if (inode_state_read(inode) & I_FREEING) return; =20 /* @@ -1600,7 +1601,7 @@ static void requeue_inode(struct inode *inode, struct= bdi_writeback *wb, * shot. If still dirty, it will be redirty_tail()'ed below. Update * the dirty time to prevent enqueue and sync it again. */ - if ((inode->i_state & I_DIRTY) && + if ((inode_state_read(inode) & I_DIRTY) && (wbc->sync_mode =3D=3D WB_SYNC_ALL || wbc->tagged_writepages)) inode->dirtied_when =3D jiffies; =20 @@ -1611,7 +1612,7 @@ static void requeue_inode(struct inode *inode, struct= bdi_writeback *wb, * is odd for clean inodes, it can happen for some * filesystems so handle that gracefully. */ - if (inode->i_state & I_DIRTY_ALL) + if (inode_state_read(inode) & I_DIRTY_ALL) redirty_tail_locked(inode, wb); else inode_cgwb_move_to_attached(inode, wb); @@ -1637,17 +1638,17 @@ static void requeue_inode(struct inode *inode, stru= ct bdi_writeback *wb, */ redirty_tail_locked(inode, wb); } - } else if (inode->i_state & I_DIRTY) { + } else if (inode_state_read(inode) & I_DIRTY) { /* * Filesystems can dirty the inode during writeback operations, * such as delayed allocation during submission or metadata * updates after data IO completion. */ redirty_tail_locked(inode, wb); - } else if (inode->i_state & I_DIRTY_TIME) { + } else if (inode_state_read(inode) & I_DIRTY_TIME) { inode->dirtied_when =3D jiffies; inode_io_list_move_locked(inode, wb, &wb->b_dirty_time); - inode->i_state &=3D ~I_SYNC_QUEUED; + inode_state_del(inode, I_SYNC_QUEUED); } else { /* The inode is clean. Remove from writeback lists. */ inode_cgwb_move_to_attached(inode, wb); @@ -1673,7 +1674,7 @@ __writeback_single_inode(struct inode *inode, struct = writeback_control *wbc) unsigned dirty; int ret; =20 - WARN_ON(!(inode->i_state & I_SYNC)); + WARN_ON(!(inode_state_read_once(inode) & I_SYNC)); =20 trace_writeback_single_inode_start(inode, wbc, nr_to_write); =20 @@ -1697,7 +1698,7 @@ __writeback_single_inode(struct inode *inode, struct = writeback_control *wbc) * mark_inode_dirty_sync() to notify the filesystem about it and to * change I_DIRTY_TIME into I_DIRTY_SYNC. */ - if ((inode->i_state & I_DIRTY_TIME) && + if ((inode_state_read_once(inode) & I_DIRTY_TIME) && (wbc->sync_mode =3D=3D WB_SYNC_ALL || time_after(jiffies, inode->dirtied_time_when + dirtytime_expire_interval * HZ))) { @@ -1712,8 +1713,8 @@ __writeback_single_inode(struct inode *inode, struct = writeback_control *wbc) * after handling timestamp expiration, as that may dirty the inode too. */ spin_lock(&inode->i_lock); - dirty =3D inode->i_state & I_DIRTY; - inode->i_state &=3D ~dirty; + dirty =3D inode_state_read(inode) & I_DIRTY; + inode_state_del(inode, dirty); =20 /* * Paired with smp_mb() in __mark_inode_dirty(). This allows @@ -1729,10 +1730,10 @@ __writeback_single_inode(struct inode *inode, struc= t writeback_control *wbc) smp_mb(); =20 if (mapping_tagged(mapping, PAGECACHE_TAG_DIRTY)) - inode->i_state |=3D I_DIRTY_PAGES; - else if (unlikely(inode->i_state & I_PINNING_NETFS_WB)) { - if (!(inode->i_state & I_DIRTY_PAGES)) { - inode->i_state &=3D ~I_PINNING_NETFS_WB; + inode_state_add(inode, I_DIRTY_PAGES); + else if (unlikely(inode_state_read(inode) & I_PINNING_NETFS_WB)) { + if (!(inode_state_read(inode) & I_DIRTY_PAGES)) { + inode_state_del(inode, I_PINNING_NETFS_WB); wbc->unpinned_netfs_wb =3D true; dirty |=3D I_PINNING_NETFS_WB; /* Cause write_inode */ } @@ -1768,11 +1769,11 @@ static int writeback_single_inode(struct inode *ino= de, =20 spin_lock(&inode->i_lock); if (!icount_read(inode)) - WARN_ON(!(inode->i_state & (I_WILL_FREE|I_FREEING))); + WARN_ON(!(inode_state_read(inode) & (I_WILL_FREE | I_FREEING))); else - WARN_ON(inode->i_state & I_WILL_FREE); + WARN_ON(inode_state_read(inode) & I_WILL_FREE); =20 - if (inode->i_state & I_SYNC) { + if (inode_state_read(inode) & I_SYNC) { /* * Writeback is already running on the inode. For WB_SYNC_NONE, * that's enough and we can just return. For WB_SYNC_ALL, we @@ -1783,7 +1784,7 @@ static int writeback_single_inode(struct inode *inode, goto out; inode_wait_for_writeback(inode); } - WARN_ON(inode->i_state & I_SYNC); + WARN_ON(inode_state_read(inode) & I_SYNC); /* * If the inode is already fully clean, then there's nothing to do. * @@ -1791,11 +1792,11 @@ static int writeback_single_inode(struct inode *ino= de, * still under writeback, e.g. due to prior WB_SYNC_NONE writeback. If * there are any such pages, we'll need to wait for them. */ - if (!(inode->i_state & I_DIRTY_ALL) && + if (!(inode_state_read(inode) & I_DIRTY_ALL) && (wbc->sync_mode !=3D WB_SYNC_ALL || !mapping_tagged(inode->i_mapping, PAGECACHE_TAG_WRITEBACK))) goto out; - inode->i_state |=3D I_SYNC; + inode_state_add(inode, I_SYNC); wbc_attach_and_unlock_inode(wbc, inode); =20 ret =3D __writeback_single_inode(inode, wbc); @@ -1808,18 +1809,18 @@ static int writeback_single_inode(struct inode *ino= de, * If the inode is freeing, its i_io_list shoudn't be updated * as it can be finally deleted at this moment. */ - if (!(inode->i_state & I_FREEING)) { + if (!(inode_state_read(inode) & I_FREEING)) { /* * If the inode is now fully clean, then it can be safely * removed from its writeback list (if any). Otherwise the * flusher threads are responsible for the writeback lists. */ - if (!(inode->i_state & I_DIRTY_ALL)) + if (!(inode_state_read(inode) & I_DIRTY_ALL)) inode_cgwb_move_to_attached(inode, wb); - else if (!(inode->i_state & I_SYNC_QUEUED)) { - if ((inode->i_state & I_DIRTY)) + else if (!(inode_state_read(inode) & I_SYNC_QUEUED)) { + if ((inode_state_read(inode) & I_DIRTY)) redirty_tail_locked(inode, wb); - else if (inode->i_state & I_DIRTY_TIME) { + else if (inode_state_read(inode) & I_DIRTY_TIME) { inode->dirtied_when =3D jiffies; inode_io_list_move_locked(inode, wb, @@ -1928,12 +1929,12 @@ static long writeback_sb_inodes(struct super_block = *sb, * kind writeout is handled by the freer. */ spin_lock(&inode->i_lock); - if (inode->i_state & (I_NEW | I_FREEING | I_WILL_FREE)) { + if (inode_state_read(inode) & (I_NEW | I_FREEING | I_WILL_FREE)) { redirty_tail_locked(inode, wb); spin_unlock(&inode->i_lock); continue; } - if ((inode->i_state & I_SYNC) && wbc.sync_mode !=3D WB_SYNC_ALL) { + if ((inode_state_read(inode) & I_SYNC) && wbc.sync_mode !=3D WB_SYNC_ALL= ) { /* * If this inode is locked for writeback and we are not * doing writeback-for-data-integrity, move it to @@ -1955,14 +1956,14 @@ static long writeback_sb_inodes(struct super_block = *sb, * are doing WB_SYNC_NONE writeback. So this catches only the * WB_SYNC_ALL case. */ - if (inode->i_state & I_SYNC) { + if (inode_state_read(inode) & I_SYNC) { /* Wait for I_SYNC. This function drops i_lock... */ inode_sleep_on_writeback(inode); /* Inode may be gone, start again */ spin_lock(&wb->list_lock); continue; } - inode->i_state |=3D I_SYNC; + inode_state_add(inode, I_SYNC); wbc_attach_and_unlock_inode(&wbc, inode); =20 write_chunk =3D writeback_chunk_size(wb, work); @@ -2000,7 +2001,7 @@ static long writeback_sb_inodes(struct super_block *s= b, */ tmp_wb =3D inode_to_wb_and_lock_list(inode); spin_lock(&inode->i_lock); - if (!(inode->i_state & I_DIRTY_ALL)) + if (!(inode_state_read(inode) & I_DIRTY_ALL)) total_wrote++; requeue_inode(inode, tmp_wb, &wbc, dirtied_before); inode_sync_complete(inode); @@ -2506,10 +2507,10 @@ void __mark_inode_dirty(struct inode *inode, int fl= ags) * We tell ->dirty_inode callback that timestamps need to * be updated by setting I_DIRTY_TIME in flags. */ - if (inode->i_state & I_DIRTY_TIME) { + if (inode_state_read_once(inode) & I_DIRTY_TIME) { spin_lock(&inode->i_lock); - if (inode->i_state & I_DIRTY_TIME) { - inode->i_state &=3D ~I_DIRTY_TIME; + if (inode_state_read(inode) & I_DIRTY_TIME) { + inode_state_del(inode, I_DIRTY_TIME); flags |=3D I_DIRTY_TIME; } spin_unlock(&inode->i_lock); @@ -2546,16 +2547,16 @@ void __mark_inode_dirty(struct inode *inode, int fl= ags) */ smp_mb(); =20 - if ((inode->i_state & flags) =3D=3D flags) + if ((inode_state_read_once(inode) & flags) =3D=3D flags) return; =20 spin_lock(&inode->i_lock); - if ((inode->i_state & flags) !=3D flags) { - const int was_dirty =3D inode->i_state & I_DIRTY; + if ((inode_state_read(inode) & flags) !=3D flags) { + const int was_dirty =3D inode_state_read(inode) & I_DIRTY; =20 inode_attach_wb(inode, NULL); =20 - inode->i_state |=3D flags; + inode_state_add(inode, flags); =20 /* * Grab inode's wb early because it requires dropping i_lock and we @@ -2574,7 +2575,7 @@ void __mark_inode_dirty(struct inode *inode, int flag= s) * the inode it will place it on the appropriate superblock * list, based upon its state. */ - if (inode->i_state & I_SYNC_QUEUED) + if (inode_state_read(inode) & I_SYNC_QUEUED) goto out_unlock; =20 /* @@ -2585,7 +2586,7 @@ void __mark_inode_dirty(struct inode *inode, int flag= s) if (inode_unhashed(inode)) goto out_unlock; } - if (inode->i_state & I_FREEING) + if (inode_state_read(inode) & I_FREEING) goto out_unlock; =20 /* @@ -2600,7 +2601,7 @@ void __mark_inode_dirty(struct inode *inode, int flag= s) if (dirtytime) inode->dirtied_time_when =3D jiffies; =20 - if (inode->i_state & I_DIRTY) + if (inode_state_read(inode) & I_DIRTY) dirty_list =3D &wb->b_dirty; else dirty_list =3D &wb->b_dirty_time; @@ -2696,7 +2697,7 @@ static void wait_sb_inodes(struct super_block *sb) spin_unlock_irq(&sb->s_inode_wblist_lock); =20 spin_lock(&inode->i_lock); - if (inode->i_state & (I_FREEING|I_WILL_FREE|I_NEW)) { + if (inode_state_read(inode) & (I_FREEING | I_WILL_FREE | I_NEW)) { spin_unlock(&inode->i_lock); =20 spin_lock_irq(&sb->s_inode_wblist_lock); diff --git a/fs/inode.c b/fs/inode.c index bf7503760206..aeb7d94f0a03 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -233,7 +233,7 @@ int inode_init_always_gfp(struct super_block *sb, struc= t inode *inode, gfp_t gfp inode->i_sb =3D sb; inode->i_blkbits =3D sb->s_blocksize_bits; inode->i_flags =3D 0; - inode->i_state =3D 0; + inode_state_set_raw(inode, 0); atomic64_set(&inode->i_sequence, 0); atomic_set(&inode->i_count, 1); inode->i_op =3D &empty_iops; @@ -471,7 +471,7 @@ EXPORT_SYMBOL(set_nlink); void inc_nlink(struct inode *inode) { if (unlikely(inode->i_nlink =3D=3D 0)) { - WARN_ON(!(inode->i_state & I_LINKABLE)); + WARN_ON(!(inode_state_read_once(inode) & I_LINKABLE)); atomic_long_dec(&inode->i_sb->s_remove_count); } =20 @@ -532,7 +532,7 @@ EXPORT_SYMBOL(ihold); =20 static void __inode_add_lru(struct inode *inode, bool rotate) { - if (inode->i_state & (I_DIRTY_ALL | I_SYNC | I_FREEING | I_WILL_FREE)) + if (inode_state_read(inode) & (I_DIRTY_ALL | I_SYNC | I_FREEING | I_WILL_= FREE)) return; if (icount_read(inode)) return; @@ -544,7 +544,7 @@ static void __inode_add_lru(struct inode *inode, bool r= otate) if (list_lru_add_obj(&inode->i_sb->s_inode_lru, &inode->i_lru)) this_cpu_inc(nr_unused); else if (rotate) - inode->i_state |=3D I_REFERENCED; + inode_state_add(inode, I_REFERENCED); } =20 struct wait_queue_head *inode_bit_waitqueue(struct wait_bit_queue_entry *w= qe, @@ -577,15 +577,15 @@ static void inode_lru_list_del(struct inode *inode) static void inode_pin_lru_isolating(struct inode *inode) { lockdep_assert_held(&inode->i_lock); - WARN_ON(inode->i_state & (I_LRU_ISOLATING | I_FREEING | I_WILL_FREE)); - inode->i_state |=3D I_LRU_ISOLATING; + WARN_ON(inode_state_read(inode) & (I_LRU_ISOLATING | I_FREEING | I_WILL_F= REE)); + inode_state_add(inode, I_LRU_ISOLATING); } =20 static void inode_unpin_lru_isolating(struct inode *inode) { spin_lock(&inode->i_lock); - WARN_ON(!(inode->i_state & I_LRU_ISOLATING)); - inode->i_state &=3D ~I_LRU_ISOLATING; + WARN_ON(!(inode_state_read(inode) & I_LRU_ISOLATING)); + inode_state_del(inode, I_LRU_ISOLATING); /* Called with inode->i_lock which ensures memory ordering. */ inode_wake_up_bit(inode, __I_LRU_ISOLATING); spin_unlock(&inode->i_lock); @@ -597,7 +597,7 @@ static void inode_wait_for_lru_isolating(struct inode *= inode) struct wait_queue_head *wq_head; =20 lockdep_assert_held(&inode->i_lock); - if (!(inode->i_state & I_LRU_ISOLATING)) + if (!(inode_state_read(inode) & I_LRU_ISOLATING)) return; =20 wq_head =3D inode_bit_waitqueue(&wqe, inode, __I_LRU_ISOLATING); @@ -607,14 +607,14 @@ static void inode_wait_for_lru_isolating(struct inode= *inode) * Checking I_LRU_ISOLATING with inode->i_lock guarantees * memory ordering. */ - if (!(inode->i_state & I_LRU_ISOLATING)) + if (!(inode_state_read(inode) & I_LRU_ISOLATING)) break; spin_unlock(&inode->i_lock); schedule(); spin_lock(&inode->i_lock); } finish_wait(wq_head, &wqe.wq_entry); - WARN_ON(inode->i_state & I_LRU_ISOLATING); + WARN_ON(inode_state_read(inode) & I_LRU_ISOLATING); } =20 /** @@ -761,11 +761,11 @@ void clear_inode(struct inode *inode) */ xa_unlock_irq(&inode->i_data.i_pages); BUG_ON(!list_empty(&inode->i_data.i_private_list)); - BUG_ON(!(inode->i_state & I_FREEING)); - BUG_ON(inode->i_state & I_CLEAR); + BUG_ON(!(inode_state_read_once(inode) & I_FREEING)); + BUG_ON(inode_state_read_once(inode) & I_CLEAR); BUG_ON(!list_empty(&inode->i_wb_list)); /* don't need i_lock here, no concurrent mods to i_state */ - inode->i_state =3D I_FREEING | I_CLEAR; + inode_state_set_raw(inode, I_FREEING | I_CLEAR); } EXPORT_SYMBOL(clear_inode); =20 @@ -786,7 +786,7 @@ static void evict(struct inode *inode) { const struct super_operations *op =3D inode->i_sb->s_op; =20 - BUG_ON(!(inode->i_state & I_FREEING)); + BUG_ON(!(inode_state_read_once(inode) & I_FREEING)); BUG_ON(!list_empty(&inode->i_lru)); =20 if (!list_empty(&inode->i_io_list)) @@ -829,7 +829,7 @@ static void evict(struct inode *inode) * This also means we don't need any fences for the call below. */ inode_wake_up_bit(inode, __I_NEW); - BUG_ON(inode->i_state !=3D (I_FREEING | I_CLEAR)); + BUG_ON(inode_state_read_once(inode) !=3D (I_FREEING | I_CLEAR)); =20 destroy_inode(inode); } @@ -879,12 +879,12 @@ void evict_inodes(struct super_block *sb) spin_unlock(&inode->i_lock); continue; } - if (inode->i_state & (I_NEW | I_FREEING | I_WILL_FREE)) { + if (inode_state_read(inode) & (I_NEW | I_FREEING | I_WILL_FREE)) { spin_unlock(&inode->i_lock); continue; } =20 - inode->i_state |=3D I_FREEING; + inode_state_add(inode, I_FREEING); inode_lru_list_del(inode); spin_unlock(&inode->i_lock); list_add(&inode->i_lru, &dispose); @@ -938,7 +938,7 @@ static enum lru_status inode_lru_isolate(struct list_he= ad *item, * sync, or the last page cache deletion will requeue them. */ if (icount_read(inode) || - (inode->i_state & ~I_REFERENCED) || + (inode_state_read(inode) & ~I_REFERENCED) || !mapping_shrinkable(&inode->i_data)) { list_lru_isolate(lru, &inode->i_lru); spin_unlock(&inode->i_lock); @@ -947,8 +947,8 @@ static enum lru_status inode_lru_isolate(struct list_he= ad *item, } =20 /* Recently referenced inodes get one more pass */ - if (inode->i_state & I_REFERENCED) { - inode->i_state &=3D ~I_REFERENCED; + if (inode_state_read(inode) & I_REFERENCED) { + inode_state_del(inode, I_REFERENCED); spin_unlock(&inode->i_lock); return LRU_ROTATE; } @@ -975,8 +975,8 @@ static enum lru_status inode_lru_isolate(struct list_he= ad *item, return LRU_RETRY; } =20 - WARN_ON(inode->i_state & I_NEW); - inode->i_state |=3D I_FREEING; + WARN_ON(inode_state_read(inode) & I_NEW); + inode_state_add(inode, I_FREEING); list_lru_isolate_move(lru, &inode->i_lru, freeable); spin_unlock(&inode->i_lock); =20 @@ -1025,11 +1025,11 @@ static struct inode *find_inode(struct super_block = *sb, if (!test(inode, data)) continue; spin_lock(&inode->i_lock); - if (inode->i_state & (I_FREEING|I_WILL_FREE)) { + if (inode_state_read(inode) & (I_FREEING | I_WILL_FREE)) { __wait_on_freeing_inode(inode, is_inode_hash_locked); goto repeat; } - if (unlikely(inode->i_state & I_CREATING)) { + if (unlikely(inode_state_read(inode) & I_CREATING)) { spin_unlock(&inode->i_lock); rcu_read_unlock(); return ERR_PTR(-ESTALE); @@ -1066,11 +1066,11 @@ static struct inode *find_inode_fast(struct super_b= lock *sb, if (inode->i_sb !=3D sb) continue; spin_lock(&inode->i_lock); - if (inode->i_state & (I_FREEING|I_WILL_FREE)) { + if (inode_state_read(inode) & (I_FREEING | I_WILL_FREE)) { __wait_on_freeing_inode(inode, is_inode_hash_locked); goto repeat; } - if (unlikely(inode->i_state & I_CREATING)) { + if (unlikely(inode_state_read(inode) & I_CREATING)) { spin_unlock(&inode->i_lock); rcu_read_unlock(); return ERR_PTR(-ESTALE); @@ -1180,8 +1180,8 @@ void unlock_new_inode(struct inode *inode) { lockdep_annotate_inode_mutex_key(inode); spin_lock(&inode->i_lock); - WARN_ON(!(inode->i_state & I_NEW)); - inode->i_state &=3D ~I_NEW & ~I_CREATING; + WARN_ON(!(inode_state_read(inode) & I_NEW)); + inode_state_del(inode, I_NEW | I_CREATING); /* * Pairs with the barrier in prepare_to_wait_event() to make sure * ___wait_var_event() either sees the bit cleared or @@ -1197,8 +1197,8 @@ void discard_new_inode(struct inode *inode) { lockdep_annotate_inode_mutex_key(inode); spin_lock(&inode->i_lock); - WARN_ON(!(inode->i_state & I_NEW)); - inode->i_state &=3D ~I_NEW; + WARN_ON(!(inode_state_read(inode) & I_NEW)); + inode_state_del(inode, I_NEW); /* * Pairs with the barrier in prepare_to_wait_event() to make sure * ___wait_var_event() either sees the bit cleared or @@ -1308,7 +1308,7 @@ struct inode *inode_insert5(struct inode *inode, unsi= gned long hashval, * caller is responsible for filling in the contents */ spin_lock(&inode->i_lock); - inode->i_state |=3D I_NEW; + inode_state_add(inode, I_NEW); hlist_add_head_rcu(&inode->i_hash, head); spin_unlock(&inode->i_lock); =20 @@ -1445,7 +1445,7 @@ struct inode *iget_locked(struct super_block *sb, uns= igned long ino) if (!old) { inode->i_ino =3D ino; spin_lock(&inode->i_lock); - inode->i_state =3D I_NEW; + inode_state_set(inode, I_NEW); hlist_add_head_rcu(&inode->i_hash, head); spin_unlock(&inode->i_lock); spin_unlock(&inode_hash_lock); @@ -1538,7 +1538,7 @@ EXPORT_SYMBOL(iunique); struct inode *igrab(struct inode *inode) { spin_lock(&inode->i_lock); - if (!(inode->i_state & (I_FREEING|I_WILL_FREE))) { + if (!(inode_state_read(inode) & (I_FREEING | I_WILL_FREE))) { __iget(inode); spin_unlock(&inode->i_lock); } else { @@ -1728,7 +1728,7 @@ struct inode *find_inode_rcu(struct super_block *sb, = unsigned long hashval, =20 hlist_for_each_entry_rcu(inode, head, i_hash) { if (inode->i_sb =3D=3D sb && - !(READ_ONCE(inode->i_state) & (I_FREEING | I_WILL_FREE)) && + !(inode_state_read_once(inode) & (I_FREEING | I_WILL_FREE)) && test(inode, data)) return inode; } @@ -1767,7 +1767,7 @@ struct inode *find_inode_by_ino_rcu(struct super_bloc= k *sb, hlist_for_each_entry_rcu(inode, head, i_hash) { if (inode->i_ino =3D=3D ino && inode->i_sb =3D=3D sb && - !(READ_ONCE(inode->i_state) & (I_FREEING | I_WILL_FREE))) + !(inode_state_read_once(inode) & (I_FREEING | I_WILL_FREE))) return inode; } return NULL; @@ -1789,7 +1789,7 @@ int insert_inode_locked(struct inode *inode) if (old->i_sb !=3D sb) continue; spin_lock(&old->i_lock); - if (old->i_state & (I_FREEING|I_WILL_FREE)) { + if (inode_state_read(old) & (I_FREEING | I_WILL_FREE)) { spin_unlock(&old->i_lock); continue; } @@ -1797,13 +1797,13 @@ int insert_inode_locked(struct inode *inode) } if (likely(!old)) { spin_lock(&inode->i_lock); - inode->i_state |=3D I_NEW | I_CREATING; + inode_state_add(inode, I_NEW | I_CREATING); hlist_add_head_rcu(&inode->i_hash, head); spin_unlock(&inode->i_lock); spin_unlock(&inode_hash_lock); return 0; } - if (unlikely(old->i_state & I_CREATING)) { + if (unlikely(inode_state_read(old) & I_CREATING)) { spin_unlock(&old->i_lock); spin_unlock(&inode_hash_lock); return -EBUSY; @@ -1826,7 +1826,7 @@ int insert_inode_locked4(struct inode *inode, unsigne= d long hashval, { struct inode *old; =20 - inode->i_state |=3D I_CREATING; + inode_state_add_raw(inode, I_CREATING); old =3D inode_insert5(inode, hashval, test, NULL, data); =20 if (old !=3D inode) { @@ -1858,10 +1858,9 @@ static void iput_final(struct inode *inode) { struct super_block *sb =3D inode->i_sb; const struct super_operations *op =3D inode->i_sb->s_op; - unsigned long state; int drop; =20 - WARN_ON(inode->i_state & I_NEW); + WARN_ON(inode_state_read(inode) & I_NEW); =20 if (op->drop_inode) drop =3D op->drop_inode(inode); @@ -1869,27 +1868,25 @@ static void iput_final(struct inode *inode) drop =3D generic_drop_inode(inode); =20 if (!drop && - !(inode->i_state & I_DONTCACHE) && + !(inode_state_read(inode) & I_DONTCACHE) && (sb->s_flags & SB_ACTIVE)) { __inode_add_lru(inode, true); spin_unlock(&inode->i_lock); return; } =20 - state =3D inode->i_state; if (!drop) { - WRITE_ONCE(inode->i_state, state | I_WILL_FREE); + inode_state_add(inode, I_WILL_FREE); spin_unlock(&inode->i_lock); =20 write_inode_now(inode, 1); =20 spin_lock(&inode->i_lock); - state =3D inode->i_state; - WARN_ON(state & I_NEW); - state &=3D ~I_WILL_FREE; + inode_state_del(inode, I_WILL_FREE); + WARN_ON(inode_state_read(inode) & I_NEW); } =20 - WRITE_ONCE(inode->i_state, state | I_FREEING); + inode_state_add(inode, I_FREEING); if (!list_empty(&inode->i_lru)) inode_lru_list_del(inode); spin_unlock(&inode->i_lock); @@ -1913,7 +1910,7 @@ void iput(struct inode *inode) =20 retry: lockdep_assert_not_held(&inode->i_lock); - VFS_BUG_ON_INODE(inode->i_state & I_CLEAR, inode); + VFS_BUG_ON_INODE(inode_state_read_once(inode) & I_CLEAR, inode); /* * Note this assert is technically racy as if the count is bogusly * equal to one, then two CPUs racing to further drop it can both @@ -1924,14 +1921,14 @@ void iput(struct inode *inode) if (atomic_add_unless(&inode->i_count, -1, 1)) return; =20 - if ((inode->i_state & I_DIRTY_TIME) && inode->i_nlink) { + if ((inode_state_read_once(inode) & I_DIRTY_TIME) && inode->i_nlink) { trace_writeback_lazytime_iput(inode); mark_inode_dirty_sync(inode); goto retry; } =20 spin_lock(&inode->i_lock); - if (unlikely((inode->i_state & I_DIRTY_TIME) && inode->i_nlink)) { + if (unlikely((inode_state_read(inode) & I_DIRTY_TIME) && inode->i_nlink))= { spin_unlock(&inode->i_lock); goto retry; } @@ -2946,7 +2943,8 @@ void dump_inode(struct inode *inode, const char *reas= on) pr_warn("%s encountered for inode %px\n" "fs %s mode %ho opflags 0x%hx flags 0x%x state 0x%x count %d\n", reason, inode, sb->s_type->name, inode->i_mode, inode->i_opflags, - inode->i_flags, inode->i_state, atomic_read(&inode->i_count)); + inode->i_flags, inode_state_read_once(inode), + atomic_read(&inode->i_count)); } =20 EXPORT_SYMBOL(dump_inode); diff --git a/fs/libfs.c b/fs/libfs.c index ce8c496a6940..ecb6bc16c5a1 100644 --- a/fs/libfs.c +++ b/fs/libfs.c @@ -1542,9 +1542,9 @@ int __generic_file_fsync(struct file *file, loff_t st= art, loff_t end, =20 inode_lock(inode); ret =3D sync_mapping_buffers(inode->i_mapping); - if (!(inode->i_state & I_DIRTY_ALL)) + if (!(inode_state_read_once(inode) & I_DIRTY_ALL)) goto out; - if (datasync && !(inode->i_state & I_DIRTY_DATASYNC)) + if (datasync && !(inode_state_read_once(inode) & I_DIRTY_DATASYNC)) goto out; =20 err =3D sync_inode_metadata(inode, 1); @@ -1664,7 +1664,7 @@ struct inode *alloc_anon_inode(struct super_block *s) * list because mark_inode_dirty() will think * that it already _is_ on the dirty list. */ - inode->i_state =3D I_DIRTY; + inode_state_set_raw(inode, I_DIRTY); /* * Historically anonymous inodes don't have a type at all and * userspace has come to rely on this. diff --git a/fs/namei.c b/fs/namei.c index cd43ff89fbaa..edfacedd3b00 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -3948,7 +3948,7 @@ int vfs_tmpfile(struct mnt_idmap *idmap, inode =3D file_inode(file); if (!(open_flag & O_EXCL)) { spin_lock(&inode->i_lock); - inode->i_state |=3D I_LINKABLE; + inode_state_add(inode, I_LINKABLE); spin_unlock(&inode->i_lock); } security_inode_post_create_tmpfile(idmap, inode); @@ -4844,7 +4844,7 @@ int vfs_link(struct dentry *old_dentry, struct mnt_id= map *idmap, =20 inode_lock(inode); /* Make sure we don't allow creating hardlink to an unlinked file */ - if (inode->i_nlink =3D=3D 0 && !(inode->i_state & I_LINKABLE)) + if (inode->i_nlink =3D=3D 0 && !(inode_state_read_once(inode) & I_LINKABL= E)) error =3D -ENOENT; else if (max_links && inode->i_nlink >=3D max_links) error =3D -EMLINK; @@ -4854,9 +4854,9 @@ int vfs_link(struct dentry *old_dentry, struct mnt_id= map *idmap, error =3D dir->i_op->link(old_dentry, dir, new_dentry); } =20 - if (!error && (inode->i_state & I_LINKABLE)) { + if (!error && (inode_state_read_once(inode) & I_LINKABLE)) { spin_lock(&inode->i_lock); - inode->i_state &=3D ~I_LINKABLE; + inode_state_del(inode, I_LINKABLE); spin_unlock(&inode->i_lock); } inode_unlock(inode); diff --git a/fs/notify/fsnotify.c b/fs/notify/fsnotify.c index 46bfc543f946..d27ff5e5f165 100644 --- a/fs/notify/fsnotify.c +++ b/fs/notify/fsnotify.c @@ -52,7 +52,7 @@ static void fsnotify_unmount_inodes(struct super_block *s= b) * the inode cannot have any associated watches. */ spin_lock(&inode->i_lock); - if (inode->i_state & (I_FREEING|I_WILL_FREE|I_NEW)) { + if (inode_state_read(inode) & (I_FREEING | I_WILL_FREE | I_NEW)) { spin_unlock(&inode->i_lock); continue; } diff --git a/fs/pipe.c b/fs/pipe.c index 731622d0738d..a7e2e8907b63 100644 --- a/fs/pipe.c +++ b/fs/pipe.c @@ -906,7 +906,7 @@ static struct inode * get_pipe_inode(void) * list because "mark_inode_dirty()" will think * that it already _is_ on the dirty list. */ - inode->i_state =3D I_DIRTY; + inode_state_set_raw(inode, I_DIRTY); inode->i_mode =3D S_IFIFO | S_IRUSR | S_IWUSR; inode->i_uid =3D current_fsuid(); inode->i_gid =3D current_fsgid(); diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c index df4a9b348769..baf9c9173445 100644 --- a/fs/quota/dquot.c +++ b/fs/quota/dquot.c @@ -1030,7 +1030,7 @@ static int add_dquot_ref(struct super_block *sb, int = type) spin_lock(&sb->s_inode_list_lock); list_for_each_entry(inode, &sb->s_inodes, i_sb_list) { spin_lock(&inode->i_lock); - if ((inode->i_state & (I_FREEING|I_WILL_FREE|I_NEW)) || + if ((inode_state_read(inode) & (I_FREEING | I_WILL_FREE | I_NEW)) || !atomic_read(&inode->i_writecount) || !dqinit_needed(inode, type)) { spin_unlock(&inode->i_lock); diff --git a/fs/sync.c b/fs/sync.c index 2955cd4c77a3..73b3efb35b26 100644 --- a/fs/sync.c +++ b/fs/sync.c @@ -182,7 +182,7 @@ int vfs_fsync_range(struct file *file, loff_t start, lo= ff_t end, int datasync) =20 if (!file->f_op->fsync) return -EINVAL; - if (!datasync && (inode->i_state & I_DIRTY_TIME)) + if (!datasync && (inode_state_read_once(inode) & I_DIRTY_TIME)) mark_inode_dirty_sync(inode); return file->f_op->fsync(file, start, end, datasync); } diff --git a/include/linux/backing-dev.h b/include/linux/backing-dev.h index e721148c95d0..e12c39e6ffad 100644 --- a/include/linux/backing-dev.h +++ b/include/linux/backing-dev.h @@ -289,10 +289,11 @@ unlocked_inode_to_wb_begin(struct inode *inode, struc= t wb_lock_cookie *cookie) rcu_read_lock(); =20 /* - * Paired with store_release in inode_switch_wbs_work_fn() and + * Paired with a release fence in inode_do_switch_wbs() and * ensures that we see the new wb if we see cleared I_WB_SWITCH. */ - cookie->locked =3D smp_load_acquire(&inode->i_state) & I_WB_SWITCH; + cookie->locked =3D inode_state_read_once(inode) & I_WB_SWITCH; + smp_rmb(); =20 if (unlikely(cookie->locked)) xa_lock_irqsave(&inode->i_mapping->i_pages, cookie->flags); diff --git a/include/linux/fs.h b/include/linux/fs.h index d54171f13c7a..11eef4ef5ace 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2682,8 +2682,8 @@ static inline int icount_read(const struct inode *ino= de) */ static inline bool inode_is_dirtytime_only(struct inode *inode) { - return (inode->i_state & (I_DIRTY_TIME | I_NEW | - I_FREEING | I_WILL_FREE)) =3D=3D I_DIRTY_TIME; + return (inode_state_read_once(inode) & + (I_DIRTY_TIME | I_NEW | I_FREEING | I_WILL_FREE)) =3D=3D I_DIRTY_TIME; } =20 extern void inc_nlink(struct inode *inode); diff --git a/include/linux/writeback.h b/include/linux/writeback.h index a2848d731a46..ab7f98e8392c 100644 --- a/include/linux/writeback.h +++ b/include/linux/writeback.h @@ -193,7 +193,7 @@ void inode_io_list_del(struct inode *inode); static inline void wait_on_inode(struct inode *inode) { wait_var_event(inode_state_wait_address(inode, __I_NEW), - !(READ_ONCE(inode->i_state) & I_NEW)); + !(inode_state_read_once(inode) & I_NEW)); } =20 #ifdef CONFIG_CGROUP_WRITEBACK @@ -234,7 +234,7 @@ static inline void inode_attach_wb(struct inode *inode,= struct folio *folio) static inline void inode_detach_wb(struct inode *inode) { if (inode->i_wb) { - WARN_ON_ONCE(!(inode->i_state & I_CLEAR)); + WARN_ON_ONCE(!(inode_state_read_once(inode) & I_CLEAR)); wb_put(inode->i_wb); inode->i_wb =3D NULL; } diff --git a/include/trace/events/writeback.h b/include/trace/events/writeb= ack.h index 1e23919c0da9..1f69499b5338 100644 --- a/include/trace/events/writeback.h +++ b/include/trace/events/writeback.h @@ -120,7 +120,7 @@ DECLARE_EVENT_CLASS(writeback_dirty_inode_template, /* may be called for files on pseudo FSes w/ unregistered bdi */ strscpy_pad(__entry->name, bdi_dev_name(bdi), 32); __entry->ino =3D inode->i_ino; - __entry->state =3D inode->i_state; + __entry->state =3D inode_state_read_once(inode); __entry->flags =3D flags; ), =20 @@ -719,7 +719,7 @@ TRACE_EVENT(writeback_sb_inodes_requeue, strscpy_pad(__entry->name, bdi_dev_name(inode_to_bdi(inode)), 32); __entry->ino =3D inode->i_ino; - __entry->state =3D inode->i_state; + __entry->state =3D inode_state_read_once(inode); __entry->dirtied_when =3D inode->dirtied_when; __entry->cgroup_ino =3D __trace_wb_assign_cgroup(inode_to_wb(inode)); ), @@ -758,7 +758,7 @@ DECLARE_EVENT_CLASS(writeback_single_inode_template, strscpy_pad(__entry->name, bdi_dev_name(inode_to_bdi(inode)), 32); __entry->ino =3D inode->i_ino; - __entry->state =3D inode->i_state; + __entry->state =3D inode_state_read_once(inode); __entry->dirtied_when =3D inode->dirtied_when; __entry->writeback_index =3D inode->i_mapping->writeback_index; __entry->nr_to_write =3D nr_to_write; @@ -810,7 +810,7 @@ DECLARE_EVENT_CLASS(writeback_inode_template, TP_fast_assign( __entry->dev =3D inode->i_sb->s_dev; __entry->ino =3D inode->i_ino; - __entry->state =3D inode->i_state; + __entry->state =3D inode_state_read_once(inode); __entry->mode =3D inode->i_mode; __entry->dirtied_when =3D inode->dirtied_when; ), diff --git a/mm/backing-dev.c b/mm/backing-dev.c index 783904d8c5ef..7fd826f708f1 100644 --- a/mm/backing-dev.c +++ b/mm/backing-dev.c @@ -72,7 +72,7 @@ static void collect_wb_stats(struct wb_stats *stats, list_for_each_entry(inode, &wb->b_more_io, i_io_list) stats->nr_more_io++; list_for_each_entry(inode, &wb->b_dirty_time, i_io_list) - if (inode->i_state & I_DIRTY_TIME) + if (inode_state_read_once(inode) & I_DIRTY_TIME) stats->nr_dirty_time++; spin_unlock(&wb->list_lock); =20 diff --git a/security/landlock/fs.c b/security/landlock/fs.c index 0bade2c5aa1d..d4d72f406d58 100644 --- a/security/landlock/fs.c +++ b/security/landlock/fs.c @@ -1296,7 +1296,7 @@ static void hook_sb_delete(struct super_block *const = sb) * second call to iput() for the same Landlock object. Also * checks I_NEW because such inode cannot be tied to an object. */ - if (inode->i_state & (I_FREEING | I_WILL_FREE | I_NEW)) { + if (inode_state_read(inode) & (I_FREEING | I_WILL_FREE | I_NEW)) { spin_unlock(&inode->i_lock); continue; } --=20 2.43.0 From nobody Thu Oct 2 13:01:34 2025 Received: from mail-wm1-f48.google.com (mail-wm1-f48.google.com [209.85.128.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5B306321456 for ; Tue, 16 Sep 2025 13:59:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758031187; cv=none; b=rVlMsoG1qAsczzYJ5epiTMA6keinlANWOraTXwxlI/jj+MWpI4SOi35ruW2ESo2BjZ6qawHvEYDLMn9u6mucsyRSRGEyt2x/Rl6zWX1hhltcousdeL9Sd7Z8e8KYuf8aUbIEgwxSYZGj8YmrMllexTsu5fEfj3bvWGNpXWLkqwc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758031187; c=relaxed/simple; bh=qt/YFUMkKt8IA45+qE2taOxYKW10Ub+uwNHV94/ZlR4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=LBkNmQzj1EUiZnlfjdK8rrQNpABYtTki6i8gs5BHfKqHdLqw3o8R2A6659XusZgcFqAM6LquYn7BDD5i+ICr7hjEzkCMSyz9sJppegV4mp9JMdmEQggJ8BIvHC1ZhWigUNW2l54sD+qqi0Ues4lgCDDBjQAqs1H8u5uTkAaW+Xk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Dec1Bfed; arc=none smtp.client-ip=209.85.128.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Dec1Bfed" Received: by mail-wm1-f48.google.com with SMTP id 5b1f17b1804b1-460e01ee031so614475e9.2 for ; Tue, 16 Sep 2025 06:59:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1758031178; x=1758635978; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=LdH6hYb9zcGIjyPlmmt41hP/wfdaqw8hE+DlLYlc4Lc=; b=Dec1BfedZ7duES8P8UN3ol+rCuoTJ+Judx2NMwgLpyigROxjNd4iheQaDyUnbFhl8j sgERUZHx3b4arHs1DqoHbtjw+HONnzf8HpFBRWDpiC9j/GA/clsfgruN5K/u/GEAhRp+ szW0Y7vRa22iT/dx+G5vesE8VRYb9lwIv3TYTXLOBqEubXIDmw9Vk6APGCTxKWXbRd3J zmS/Et+QDtbgqRLZ88WTPK3aFXJ8Ha4MaTsjHoq+MmgL98XkZTLxhQsX5CKkCSzUQ8Ou 74YlLFhxjmH0C0g0ggTEaDJh4nUkJm8fVbIh5vycHyYDKazBLGCvPPoTclz+egZsC+Yt ryHA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758031178; x=1758635978; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=LdH6hYb9zcGIjyPlmmt41hP/wfdaqw8hE+DlLYlc4Lc=; b=bEbnkowRoZezkrgx/zjr10110U65JZW2RoGRyIBMcd4BvyKYQwetnk79N2g8+HIGP5 zsD9U6u4732REyy0ez9xKuT54x802Eed0PtqcHYZ3weDjfbheKes4bSWvc3+e3A7ocnx fxJNqKHn7oBLTp7PW/EupA5TsW3XDd8aE6Vd1d1eukSUvdFtdPPTZt94yvMNMQhsIr0t 6ZnE8Opm5CpBQ6Uru33Kh9aKverrjQ1uzWECYq+gJUseSoWP/G5B/eY5OMRJ7Vuq3ctw vhXGJeuDVQZPRxNceIsuAUtcTJ/pJfwJnDo3OWccdf+ulLQqFXcAtlTn9g8Ua7RVrRkd Sl5Q== X-Forwarded-Encrypted: i=1; AJvYcCUL2hpIMRotLmB0pAk7Su9cNXjoSX/UnVgVlWDovcdtn89Q6E6ncBgf03I9e/qkNvw/aWErf34vNy5I3UQ=@vger.kernel.org X-Gm-Message-State: AOJu0Yw61mwuA1fzcK23ASv15kmPmAv1mPdihH05dKfOLe6rNQ801TRI +mF5CUQUcdGy+3pH1Oz0EBctD0uZD3h/yKYXbcV3rvGL5QtL25pEKqOb X-Gm-Gg: ASbGnctirOe1xZAaU7mBzFGg9X0divJbUM348KcxuT+BMd8Ka43w38kb/PqxBRWqY/M 6li4mCiFPp65yrlQFLrHOEcDG+8DJGJfPwXJyhHADXHOuOewE5vEFC/WWwyUIw9pFeaPf8ms7mo GbGWrLIGd59vgS9ZinSRsksRm0p7FPAWiFTi2gFp36paxp0HbYjrN8YQPcGZfGfR8VbafoPFKs+ a+9pIRx+V5P+BCxmN6XTsdUYSDzCnyR+SXRE4U0thqgTJYF4XZL/fFLHhtrPmous/+MoEmzdmbv t300HbjwBkVE02/xvf/ra6IqAVJxcpEdjFyll1a1xyBmzYnEuEzXaJBvgZYi4/KH57dcwQkPI9m /czr3KmQqIcvmoZ89ylmlR1T7qsHnIAiTtV4McHXfMPJQ+f70hr8QYLx+C6cx2E+bgrGb5PNN X-Google-Smtp-Source: AGHT+IFjSe0p9uGvCdqarbYDqX67a8jlLsyS6XVRIE5LQEMQR8Zjxl6EiH+L2syMsSzuRb+I8kSsjQ== X-Received: by 2002:a05:6000:144c:b0:3eb:f90a:f6cd with SMTP id ffacd0b85a97d-3ebf90af732mr4593567f8f.60.1758031178093; Tue, 16 Sep 2025 06:59:38 -0700 (PDT) Received: from f.. (cst-prg-88-146.cust.vodafone.cz. [46.135.88.146]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3e7cde81491sm16557991f8f.42.2025.09.16.06.59.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 16 Sep 2025 06:59:37 -0700 (PDT) From: Mateusz Guzik To: brauner@kernel.org Cc: viro@zeniv.linux.org.uk, jack@suse.cz, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, josef@toxicpanda.com, kernel-team@fb.com, amir73il@gmail.com, linux-btrfs@vger.kernel.org, linux-ext4@vger.kernel.org, linux-xfs@vger.kernel.org, ceph-devel@vger.kernel.org, linux-unionfs@vger.kernel.org, Mateusz Guzik Subject: [PATCH v4 03/12] fs: mechanically convert most filesystems to use ->i_state accessors Date: Tue, 16 Sep 2025 15:58:51 +0200 Message-ID: <20250916135900.2170346-4-mjguzik@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250916135900.2170346-1-mjguzik@gmail.com> References: <20250916135900.2170346-1-mjguzik@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Change generated with coccinelle and fixed up by hand as appropriate. Signed-off-by: Mateusz Guzik --- cheat sheet: Suppose flags I_A and I_B are to be handled, then if ->i_lock is held: state =3D inode->i_state =3D> state =3D inode_state_read(inode) inode->i_state |=3D (I_A | I_B) =3D> inode_state_add(inode, I_A | I_B) inode->i_state &=3D ~(I_A | I_B) =3D> inode_state_del(inode, I_A | I_B) inode->i_state =3D I_A | I_B =3D> inode_state_set(inode, I_A | I_B) If ->i_lock is not held or only held conditionally, add "_once" suffix for the read routine or "_raw" for the rest: state =3D inode->i_state =3D> state =3D inode_state_read_once(inod= e) inode->i_state |=3D (I_A | I_B) =3D> inode_state_add_raw(inode, I_A | I_B) inode->i_state &=3D ~(I_A | I_B) =3D> inode_state_del_raw(inode, I_A | I_B) inode->i_state =3D I_A | I_B =3D> inode_state_set_raw(inode, I_A | I_B) fs/9p/vfs_inode.c | 2 +- fs/9p/vfs_inode_dotl.c | 2 +- fs/affs/inode.c | 2 +- fs/afs/dynroot.c | 6 +++--- fs/afs/inode.c | 8 ++++---- fs/bcachefs/fs.c | 7 +++---- fs/befs/linuxvfs.c | 2 +- fs/bfs/inode.c | 2 +- fs/coda/cnode.c | 4 ++-- fs/cramfs/inode.c | 2 +- fs/ecryptfs/inode.c | 6 +++--- fs/efs/inode.c | 2 +- fs/erofs/inode.c | 2 +- fs/ext2/inode.c | 2 +- fs/freevxfs/vxfs_inode.c | 2 +- fs/fuse/inode.c | 4 ++-- fs/gfs2/file.c | 2 +- fs/gfs2/glops.c | 2 +- fs/gfs2/inode.c | 4 ++-- fs/gfs2/ops_fstype.c | 2 +- fs/hfs/btree.c | 2 +- fs/hfs/inode.c | 2 +- fs/hfsplus/super.c | 2 +- fs/hostfs/hostfs_kern.c | 2 +- fs/hpfs/dir.c | 2 +- fs/hpfs/inode.c | 2 +- fs/isofs/inode.c | 2 +- fs/jffs2/fs.c | 4 ++-- fs/jfs/file.c | 4 ++-- fs/jfs/inode.c | 2 +- fs/jfs/jfs_txnmgr.c | 2 +- fs/kernfs/inode.c | 2 +- fs/minix/inode.c | 2 +- fs/nfs/inode.c | 2 +- fs/nfs/pnfs.c | 2 +- fs/nfsd/vfs.c | 2 +- fs/ntfs3/inode.c | 2 +- fs/ocfs2/dlmglue.c | 2 +- fs/ocfs2/inode.c | 10 +++++----- fs/omfs/inode.c | 2 +- fs/openpromfs/inode.c | 2 +- fs/orangefs/inode.c | 2 +- fs/orangefs/orangefs-utils.c | 6 +++--- fs/qnx4/inode.c | 2 +- fs/qnx6/inode.c | 2 +- fs/romfs/super.c | 2 +- fs/smb/client/cifsfs.c | 2 +- fs/smb/client/inode.c | 14 +++++++------- fs/squashfs/inode.c | 2 +- fs/ubifs/file.c | 2 +- fs/ubifs/super.c | 2 +- fs/udf/inode.c | 2 +- fs/ufs/inode.c | 2 +- fs/zonefs/super.c | 4 ++-- 54 files changed, 81 insertions(+), 82 deletions(-) diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c index 399d455d50d6..a257833d4d15 100644 --- a/fs/9p/vfs_inode.c +++ b/fs/9p/vfs_inode.c @@ -422,7 +422,7 @@ static struct inode *v9fs_qid_iget(struct super_block *= sb, inode =3D iget5_locked(sb, QID2INO(qid), test, v9fs_set_inode, st); if (!inode) return ERR_PTR(-ENOMEM); - if (!(inode->i_state & I_NEW)) + if (!(inode_state_read_once(inode) & I_NEW)) return inode; /* * initialize the inode with the stat info diff --git a/fs/9p/vfs_inode_dotl.c b/fs/9p/vfs_inode_dotl.c index 5b5fda617b80..f99ecf002d34 100644 --- a/fs/9p/vfs_inode_dotl.c +++ b/fs/9p/vfs_inode_dotl.c @@ -112,7 +112,7 @@ static struct inode *v9fs_qid_iget_dotl(struct super_bl= ock *sb, inode =3D iget5_locked(sb, QID2INO(qid), test, v9fs_set_inode_dotl, st); if (!inode) return ERR_PTR(-ENOMEM); - if (!(inode->i_state & I_NEW)) + if (!(inode_state_read_once(inode) & I_NEW)) return inode; /* * initialize the inode with the stat info diff --git a/fs/affs/inode.c b/fs/affs/inode.c index 0210df8d3500..0bfc7d151dcd 100644 --- a/fs/affs/inode.c +++ b/fs/affs/inode.c @@ -29,7 +29,7 @@ struct inode *affs_iget(struct super_block *sb, unsigned = long ino) inode =3D iget_locked(sb, ino); if (!inode) return ERR_PTR(-ENOMEM); - if (!(inode->i_state & I_NEW)) + if (!(inode_state_read_once(inode) & I_NEW)) return inode; =20 pr_debug("affs_iget(%lu)\n", inode->i_ino); diff --git a/fs/afs/dynroot.c b/fs/afs/dynroot.c index 8c6130789fde..475012555100 100644 --- a/fs/afs/dynroot.c +++ b/fs/afs/dynroot.c @@ -64,7 +64,7 @@ static struct inode *afs_iget_pseudo_dir(struct super_blo= ck *sb, ino_t ino) =20 vnode =3D AFS_FS_I(inode); =20 - if (inode->i_state & I_NEW) { + if (inode_state_read_once(inode) & I_NEW) { netfs_inode_init(&vnode->netfs, NULL, false); simple_inode_init_ts(inode); set_nlink(inode, 2); @@ -258,7 +258,7 @@ static struct dentry *afs_lookup_atcell(struct inode *d= ir, struct dentry *dentry =20 vnode =3D AFS_FS_I(inode); =20 - if (inode->i_state & I_NEW) { + if (inode_state_read_once(inode) & I_NEW) { netfs_inode_init(&vnode->netfs, NULL, false); simple_inode_init_ts(inode); set_nlink(inode, 1); @@ -383,7 +383,7 @@ struct inode *afs_dynroot_iget_root(struct super_block = *sb) vnode =3D AFS_FS_I(inode); =20 /* there shouldn't be an existing inode */ - if (inode->i_state & I_NEW) { + if (inode_state_read_once(inode) & I_NEW) { netfs_inode_init(&vnode->netfs, NULL, false); simple_inode_init_ts(inode); set_nlink(inode, 2); diff --git a/fs/afs/inode.c b/fs/afs/inode.c index e9538e91f848..92becefc3bbf 100644 --- a/fs/afs/inode.c +++ b/fs/afs/inode.c @@ -427,7 +427,7 @@ static void afs_fetch_status_success(struct afs_operati= on *op) struct afs_vnode *vnode =3D vp->vnode; int ret; =20 - if (vnode->netfs.inode.i_state & I_NEW) { + if (inode_state_read_once(&vnode->netfs.inode) & I_NEW) { ret =3D afs_inode_init_from_status(op, vp, vnode); afs_op_set_error(op, ret); if (ret =3D=3D 0) @@ -579,7 +579,7 @@ struct inode *afs_iget(struct afs_operation *op, struct= afs_vnode_param *vp) inode, vnode->fid.vid, vnode->fid.vnode, vnode->fid.unique); =20 /* deal with an existing inode */ - if (!(inode->i_state & I_NEW)) { + if (!(inode_state_read_once(inode) & I_NEW)) { _leave(" =3D %p", inode); return inode; } @@ -639,7 +639,7 @@ struct inode *afs_root_iget(struct super_block *sb, str= uct key *key) =20 _debug("GOT ROOT INODE %p { vl=3D%llx }", inode, as->volume->vid); =20 - BUG_ON(!(inode->i_state & I_NEW)); + BUG_ON(!(inode_state_read_once(inode) & I_NEW)); =20 vnode =3D AFS_FS_I(inode); vnode->cb_v_check =3D atomic_read(&as->volume->cb_v_break); @@ -748,7 +748,7 @@ void afs_evict_inode(struct inode *inode) =20 if ((S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode)) && - (inode->i_state & I_DIRTY) && + (inode_state_read_once(inode) & I_DIRTY) && !sbi->dyn_root) { struct writeback_control wbc =3D { .sync_mode =3D WB_SYNC_ALL, diff --git a/fs/bcachefs/fs.c b/fs/bcachefs/fs.c index 687af0eea0c2..f03b02ff3e76 100644 --- a/fs/bcachefs/fs.c +++ b/fs/bcachefs/fs.c @@ -347,7 +347,7 @@ static struct bch_inode_info *bch2_inode_hash_find(stru= ct bch_fs *c, struct btre spin_unlock(&inode->v.i_lock); return NULL; } - if ((inode->v.i_state & (I_FREEING|I_WILL_FREE))) { + if ((inode_state_read(&inode->v) & (I_FREEING|I_WILL_FREE))) { if (!trans) { __wait_on_freeing_inode(c, inode, inum); } else { @@ -411,7 +411,7 @@ static struct bch_inode_info *bch2_inode_hash_insert(st= ruct bch_fs *c, * only insert fully created inodes in the inode hash table. But * discard_new_inode() expects it to be set... */ - inode->v.i_state |=3D I_NEW; + inode_state_add_raw(&inode->v, I_NEW); /* * We don't want bch2_evict_inode() to delete the inode on disk, * we just raced and had another inode in cache. Normally new @@ -2224,8 +2224,7 @@ void bch2_evict_subvolume_inodes(struct bch_fs *c, sn= apshot_id_list *s) if (!snapshot_list_has_id(s, inode->ei_inum.subvol)) continue; =20 - if (!(inode->v.i_state & I_DONTCACHE) && - !(inode->v.i_state & I_FREEING) && + if (!(inode_state_read_once(&inode->v) & (I_DONTCACHE | I_FREEING)) && igrab(&inode->v)) { this_pass_clean =3D false; =20 diff --git a/fs/befs/linuxvfs.c b/fs/befs/linuxvfs.c index 8f430ff8e445..9fcfdd6b8189 100644 --- a/fs/befs/linuxvfs.c +++ b/fs/befs/linuxvfs.c @@ -307,7 +307,7 @@ static struct inode *befs_iget(struct super_block *sb, = unsigned long ino) inode =3D iget_locked(sb, ino); if (!inode) return ERR_PTR(-ENOMEM); - if (!(inode->i_state & I_NEW)) + if (!(inode_state_read_once(inode) & I_NEW)) return inode; =20 befs_ino =3D BEFS_I(inode); diff --git a/fs/bfs/inode.c b/fs/bfs/inode.c index 1d41ce477df5..cb406a6ee811 100644 --- a/fs/bfs/inode.c +++ b/fs/bfs/inode.c @@ -42,7 +42,7 @@ struct inode *bfs_iget(struct super_block *sb, unsigned l= ong ino) inode =3D iget_locked(sb, ino); if (!inode) return ERR_PTR(-ENOMEM); - if (!(inode->i_state & I_NEW)) + if (!(inode_state_read_once(inode) & I_NEW)) return inode; =20 if ((ino < BFS_ROOT_INO) || (ino > BFS_SB(inode->i_sb)->si_lasti)) { diff --git a/fs/coda/cnode.c b/fs/coda/cnode.c index 62a3d2565c26..70bb0579b40c 100644 --- a/fs/coda/cnode.c +++ b/fs/coda/cnode.c @@ -70,7 +70,7 @@ struct inode * coda_iget(struct super_block * sb, struct = CodaFid * fid, if (!inode) return ERR_PTR(-ENOMEM); =20 - if (inode->i_state & I_NEW) { + if (inode_state_read_once(inode) & I_NEW) { cii =3D ITOC(inode); /* we still need to set i_ino for things like stat(2) */ inode->i_ino =3D hash; @@ -148,7 +148,7 @@ struct inode *coda_fid_to_inode(struct CodaFid *fid, st= ruct super_block *sb) =20 /* we should never see newly created inodes because we intentionally * fail in the initialization callback */ - BUG_ON(inode->i_state & I_NEW); + BUG_ON(inode_state_read_once(inode) & I_NEW); =20 return inode; } diff --git a/fs/cramfs/inode.c b/fs/cramfs/inode.c index b002e9b734f9..b11e92a7406d 100644 --- a/fs/cramfs/inode.c +++ b/fs/cramfs/inode.c @@ -95,7 +95,7 @@ static struct inode *get_cramfs_inode(struct super_block = *sb, inode =3D iget_locked(sb, cramino(cramfs_inode, offset)); if (!inode) return ERR_PTR(-ENOMEM); - if (!(inode->i_state & I_NEW)) + if (!(inode_state_read_once(inode) & I_NEW)) return inode; =20 switch (cramfs_inode->mode & S_IFMT) { diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c index 72fbe1316ab8..cd75f5d85258 100644 --- a/fs/ecryptfs/inode.c +++ b/fs/ecryptfs/inode.c @@ -95,7 +95,7 @@ static struct inode *__ecryptfs_get_inode(struct inode *l= ower_inode, iput(lower_inode); return ERR_PTR(-EACCES); } - if (!(inode->i_state & I_NEW)) + if (!(inode_state_read_once(inode) & I_NEW)) iput(lower_inode); =20 return inode; @@ -106,7 +106,7 @@ struct inode *ecryptfs_get_inode(struct inode *lower_in= ode, { struct inode *inode =3D __ecryptfs_get_inode(lower_inode, sb); =20 - if (!IS_ERR(inode) && (inode->i_state & I_NEW)) + if (!IS_ERR(inode) && (inode_state_read_once(inode) & I_NEW)) unlock_new_inode(inode); =20 return inode; @@ -373,7 +373,7 @@ static struct dentry *ecryptfs_lookup_interpose(struct = dentry *dentry, } } =20 - if (inode->i_state & I_NEW) + if (inode_state_read_once(inode) & I_NEW) unlock_new_inode(inode); return d_splice_alias(inode, dentry); } diff --git a/fs/efs/inode.c b/fs/efs/inode.c index 462619e59766..28407578f83a 100644 --- a/fs/efs/inode.c +++ b/fs/efs/inode.c @@ -62,7 +62,7 @@ struct inode *efs_iget(struct super_block *super, unsigne= d long ino) inode =3D iget_locked(super, ino); if (!inode) return ERR_PTR(-ENOMEM); - if (!(inode->i_state & I_NEW)) + if (!(inode_state_read_once(inode) & I_NEW)) return inode; =20 in =3D INODE_INFO(inode); diff --git a/fs/erofs/inode.c b/fs/erofs/inode.c index 9a2f59721522..d06286191c90 100644 --- a/fs/erofs/inode.c +++ b/fs/erofs/inode.c @@ -297,7 +297,7 @@ struct inode *erofs_iget(struct super_block *sb, erofs_= nid_t nid) if (!inode) return ERR_PTR(-ENOMEM); =20 - if (inode->i_state & I_NEW) { + if (inode_state_read_once(inode) & I_NEW) { int err =3D erofs_fill_inode(inode); =20 if (err) { diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c index e10c376843d7..dbfe9098a124 100644 --- a/fs/ext2/inode.c +++ b/fs/ext2/inode.c @@ -1398,7 +1398,7 @@ struct inode *ext2_iget (struct super_block *sb, unsi= gned long ino) inode =3D iget_locked(sb, ino); if (!inode) return ERR_PTR(-ENOMEM); - if (!(inode->i_state & I_NEW)) + if (!(inode_state_read_once(inode) & I_NEW)) return inode; =20 ei =3D EXT2_I(inode); diff --git a/fs/freevxfs/vxfs_inode.c b/fs/freevxfs/vxfs_inode.c index 20600e9ea202..21fc94b98209 100644 --- a/fs/freevxfs/vxfs_inode.c +++ b/fs/freevxfs/vxfs_inode.c @@ -258,7 +258,7 @@ vxfs_iget(struct super_block *sbp, ino_t ino) ip =3D iget_locked(sbp, ino); if (!ip) return ERR_PTR(-ENOMEM); - if (!(ip->i_state & I_NEW)) + if (!(inode_state_read_once(ip) & I_NEW)) return ip; =20 vip =3D VXFS_INO(ip); diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c index ecb869e895ab..1bf3ddebf860 100644 --- a/fs/fuse/inode.c +++ b/fs/fuse/inode.c @@ -161,7 +161,7 @@ static void fuse_evict_inode(struct inode *inode) struct fuse_inode *fi =3D get_fuse_inode(inode); =20 /* Will write inode on close/munmap and in all other dirtiers */ - WARN_ON(inode->i_state & I_DIRTY_INODE); + WARN_ON(inode_state_read_once(inode) & I_DIRTY_INODE); =20 if (FUSE_IS_DAX(inode)) dax_break_layout_final(inode); @@ -506,7 +506,7 @@ struct inode *fuse_iget(struct super_block *sb, u64 nod= eid, if (!inode) return NULL; =20 - if ((inode->i_state & I_NEW)) { + if ((inode_state_read_once(inode) & I_NEW)) { inode->i_flags |=3D S_NOATIME; if (!fc->writeback_cache || !S_ISREG(attr->mode)) inode->i_flags |=3D S_NOCMTIME; diff --git a/fs/gfs2/file.c b/fs/gfs2/file.c index 72d95185a39f..49c456f966cc 100644 --- a/fs/gfs2/file.c +++ b/fs/gfs2/file.c @@ -744,7 +744,7 @@ static int gfs2_fsync(struct file *file, loff_t start, = loff_t end, { struct address_space *mapping =3D file->f_mapping; struct inode *inode =3D mapping->host; - int sync_state =3D inode->i_state & I_DIRTY; + int sync_state =3D inode_state_read_once(inode) & I_DIRTY; struct gfs2_inode *ip =3D GFS2_I(inode); int ret =3D 0, ret1 =3D 0; =20 diff --git a/fs/gfs2/glops.c b/fs/gfs2/glops.c index fe0faad4892f..984bae7c1460 100644 --- a/fs/gfs2/glops.c +++ b/fs/gfs2/glops.c @@ -394,7 +394,7 @@ static int gfs2_dinode_in(struct gfs2_inode *ip, const = void *buf) u16 height, depth; umode_t mode =3D be32_to_cpu(str->di_mode); struct inode *inode =3D &ip->i_inode; - bool is_new =3D inode->i_state & I_NEW; + bool is_new =3D inode_state_read_once(inode) & I_NEW; =20 if (unlikely(ip->i_no_addr !=3D be64_to_cpu(str->di_num.no_addr))) { gfs2_consist_inode(ip); diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c index 8760e7e20c9d..7e0ceccf2691 100644 --- a/fs/gfs2/inode.c +++ b/fs/gfs2/inode.c @@ -127,7 +127,7 @@ struct inode *gfs2_inode_lookup(struct super_block *sb,= unsigned int type, =20 ip =3D GFS2_I(inode); =20 - if (inode->i_state & I_NEW) { + if (inode_state_read_once(inode) & I_NEW) { struct gfs2_sbd *sdp =3D GFS2_SB(inode); struct gfs2_glock *io_gl; int extra_flags =3D 0; @@ -924,7 +924,7 @@ static int gfs2_create_inode(struct inode *dir, struct = dentry *dentry, gfs2_dir_no_add(&da); gfs2_glock_dq_uninit(&d_gh); if (!IS_ERR_OR_NULL(inode)) { - if (inode->i_state & I_NEW) + if (inode_state_read_once(inode) & I_NEW) iget_failed(inode); else iput(inode); diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c index c770006f8889..2572ff9753b8 100644 --- a/fs/gfs2/ops_fstype.c +++ b/fs/gfs2/ops_fstype.c @@ -1749,7 +1749,7 @@ static void gfs2_evict_inodes(struct super_block *sb) spin_lock(&sb->s_inode_list_lock); list_for_each_entry(inode, &sb->s_inodes, i_sb_list) { spin_lock(&inode->i_lock); - if ((inode->i_state & (I_FREEING|I_WILL_FREE|I_NEW)) && + if ((inode_state_read(inode) & (I_FREEING | I_WILL_FREE | I_NEW)) && !need_resched()) { spin_unlock(&inode->i_lock); continue; diff --git a/fs/hfs/btree.c b/fs/hfs/btree.c index e86e1e235658..4076904ac1cd 100644 --- a/fs/hfs/btree.c +++ b/fs/hfs/btree.c @@ -42,7 +42,7 @@ struct hfs_btree *hfs_btree_open(struct super_block *sb, = u32 id, btree_keycmp ke tree->inode =3D iget_locked(sb, id); if (!tree->inode) goto free_tree; - BUG_ON(!(tree->inode->i_state & I_NEW)); + BUG_ON(!(inode_state_read_once(tree->inode) & I_NEW)); { struct hfs_mdb *mdb =3D HFS_SB(sb)->mdb; HFS_I(tree->inode)->flags =3D 0; diff --git a/fs/hfs/inode.c b/fs/hfs/inode.c index bf4cb7e78396..5fda94e20a93 100644 --- a/fs/hfs/inode.c +++ b/fs/hfs/inode.c @@ -401,7 +401,7 @@ struct inode *hfs_iget(struct super_block *sb, struct h= fs_cat_key *key, hfs_cat_ return NULL; } inode =3D iget5_locked(sb, cnid, hfs_test_inode, hfs_read_inode, &data); - if (inode && (inode->i_state & I_NEW)) + if (inode && (inode_state_read_once(inode) & I_NEW)) unlock_new_inode(inode); return inode; } diff --git a/fs/hfsplus/super.c b/fs/hfsplus/super.c index 86351bdc8985..b63406d4be2b 100644 --- a/fs/hfsplus/super.c +++ b/fs/hfsplus/super.c @@ -65,7 +65,7 @@ struct inode *hfsplus_iget(struct super_block *sb, unsign= ed long ino) inode =3D iget_locked(sb, ino); if (!inode) return ERR_PTR(-ENOMEM); - if (!(inode->i_state & I_NEW)) + if (!(inode_state_read_once(inode) & I_NEW)) return inode; =20 INIT_LIST_HEAD(&HFSPLUS_I(inode)->open_dir_list); diff --git a/fs/hostfs/hostfs_kern.c b/fs/hostfs/hostfs_kern.c index 01e516175bcd..1ff5b9d1b1a5 100644 --- a/fs/hostfs/hostfs_kern.c +++ b/fs/hostfs/hostfs_kern.c @@ -581,7 +581,7 @@ static struct inode *hostfs_iget(struct super_block *sb= , char *name) if (!inode) return ERR_PTR(-ENOMEM); =20 - if (inode->i_state & I_NEW) { + if (inode_state_read_once(inode) & I_NEW) { unlock_new_inode(inode); } else { spin_lock(&inode->i_lock); diff --git a/fs/hpfs/dir.c b/fs/hpfs/dir.c index 49dd585c2b17..ceb50b2dc91a 100644 --- a/fs/hpfs/dir.c +++ b/fs/hpfs/dir.c @@ -247,7 +247,7 @@ struct dentry *hpfs_lookup(struct inode *dir, struct de= ntry *dentry, unsigned in result =3D ERR_PTR(-ENOMEM); goto bail1; } - if (result->i_state & I_NEW) { + if (inode_state_read_once(result) & I_NEW) { hpfs_init_inode(result); if (de->directory) hpfs_read_inode(result); diff --git a/fs/hpfs/inode.c b/fs/hpfs/inode.c index 34008442ee26..93d528f4f4f2 100644 --- a/fs/hpfs/inode.c +++ b/fs/hpfs/inode.c @@ -196,7 +196,7 @@ void hpfs_write_inode(struct inode *i) parent =3D iget_locked(i->i_sb, hpfs_inode->i_parent_dir); if (parent) { hpfs_inode->i_dirty =3D 0; - if (parent->i_state & I_NEW) { + if (inode_state_read_once(parent) & I_NEW) { hpfs_init_inode(parent); hpfs_read_inode(parent); unlock_new_inode(parent); diff --git a/fs/isofs/inode.c b/fs/isofs/inode.c index 6f0e6b19383c..0d51f57f7ad7 100644 --- a/fs/isofs/inode.c +++ b/fs/isofs/inode.c @@ -1515,7 +1515,7 @@ struct inode *__isofs_iget(struct super_block *sb, if (!inode) return ERR_PTR(-ENOMEM); =20 - if (inode->i_state & I_NEW) { + if (inode_state_read_once(inode) & I_NEW) { ret =3D isofs_read_inode(inode, relocated); if (ret < 0) { iget_failed(inode); diff --git a/fs/jffs2/fs.c b/fs/jffs2/fs.c index d175cccb7c55..764bba8ba999 100644 --- a/fs/jffs2/fs.c +++ b/fs/jffs2/fs.c @@ -265,7 +265,7 @@ struct inode *jffs2_iget(struct super_block *sb, unsign= ed long ino) inode =3D iget_locked(sb, ino); if (!inode) return ERR_PTR(-ENOMEM); - if (!(inode->i_state & I_NEW)) + if (!(inode_state_read_once(inode) & I_NEW)) return inode; =20 f =3D JFFS2_INODE_INFO(inode); @@ -373,7 +373,7 @@ void jffs2_dirty_inode(struct inode *inode, int flags) { struct iattr iattr; =20 - if (!(inode->i_state & I_DIRTY_DATASYNC)) { + if (!(inode_state_read_once(inode) & I_DIRTY_DATASYNC)) { jffs2_dbg(2, "%s(): not calling setattr() for ino #%lu\n", __func__, inode->i_ino); return; diff --git a/fs/jfs/file.c b/fs/jfs/file.c index 2a4a288b821c..87ad042221e7 100644 --- a/fs/jfs/file.c +++ b/fs/jfs/file.c @@ -26,8 +26,8 @@ int jfs_fsync(struct file *file, loff_t start, loff_t end= , int datasync) return rc; =20 inode_lock(inode); - if (!(inode->i_state & I_DIRTY_ALL) || - (datasync && !(inode->i_state & I_DIRTY_DATASYNC))) { + if (!(inode_state_read_once(inode) & I_DIRTY_ALL) || + (datasync && !(inode_state_read_once(inode) & I_DIRTY_DATASYNC))) { /* Make sure committed changes hit the disk */ jfs_flush_journal(JFS_SBI(inode->i_sb)->log, 1); inode_unlock(inode); diff --git a/fs/jfs/inode.c b/fs/jfs/inode.c index fcedeb514e14..15fb2ee7f799 100644 --- a/fs/jfs/inode.c +++ b/fs/jfs/inode.c @@ -29,7 +29,7 @@ struct inode *jfs_iget(struct super_block *sb, unsigned l= ong ino) inode =3D iget_locked(sb, ino); if (!inode) return ERR_PTR(-ENOMEM); - if (!(inode->i_state & I_NEW)) + if (!(inode_state_read_once(inode) & I_NEW)) return inode; =20 ret =3D diRead(inode); diff --git a/fs/jfs/jfs_txnmgr.c b/fs/jfs/jfs_txnmgr.c index be17e3c43582..a3dd2d6b0805 100644 --- a/fs/jfs/jfs_txnmgr.c +++ b/fs/jfs/jfs_txnmgr.c @@ -1286,7 +1286,7 @@ int txCommit(tid_t tid, /* transaction identifier */ * to verify this, only a trivial s/I_LOCK/I_SYNC/ was done. * Joern */ - if (tblk->u.ip->i_state & I_SYNC) + if (inode_state_read_once(tblk->u.ip) & I_SYNC) tblk->xflag &=3D ~COMMIT_LAZY; } =20 diff --git a/fs/kernfs/inode.c b/fs/kernfs/inode.c index 3c293a5a21b1..7abd305facdb 100644 --- a/fs/kernfs/inode.c +++ b/fs/kernfs/inode.c @@ -251,7 +251,7 @@ struct inode *kernfs_get_inode(struct super_block *sb, = struct kernfs_node *kn) struct inode *inode; =20 inode =3D iget_locked(sb, kernfs_ino(kn)); - if (inode && (inode->i_state & I_NEW)) + if (inode && (inode_state_read_once(inode) & I_NEW)) kernfs_init_inode(kn, inode); =20 return inode; diff --git a/fs/minix/inode.c b/fs/minix/inode.c index df9d11479caf..e0d857489044 100644 --- a/fs/minix/inode.c +++ b/fs/minix/inode.c @@ -583,7 +583,7 @@ struct inode *minix_iget(struct super_block *sb, unsign= ed long ino) inode =3D iget_locked(sb, ino); if (!inode) return ERR_PTR(-ENOMEM); - if (!(inode->i_state & I_NEW)) + if (!(inode_state_read_once(inode) & I_NEW)) return inode; =20 if (INODE_VERSION(inode) =3D=3D MINIX_V1) diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index b52805951856..c54981ed88fc 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c @@ -475,7 +475,7 @@ nfs_fhget(struct super_block *sb, struct nfs_fh *fh, st= ruct nfs_fattr *fattr) goto out_no_inode; } =20 - if (inode->i_state & I_NEW) { + if (inode_state_read_once(inode) & I_NEW) { struct nfs_inode *nfsi =3D NFS_I(inode); unsigned long now =3D jiffies; =20 diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c index a3135b5af7ee..f157d43d1312 100644 --- a/fs/nfs/pnfs.c +++ b/fs/nfs/pnfs.c @@ -317,7 +317,7 @@ pnfs_put_layout_hdr(struct pnfs_layout_hdr *lo) WARN_ONCE(1, "NFS: BUG unfreed layout segments.\n"); pnfs_detach_layout_hdr(lo); /* Notify pnfs_destroy_layout_final() that we're done */ - if (inode->i_state & (I_FREEING | I_CLEAR)) + if (inode_state_read(inode) & (I_FREEING | I_CLEAR)) wake_up_var_locked(lo, &inode->i_lock); spin_unlock(&inode->i_lock); pnfs_free_layout_hdr(lo); diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index 98ab55ba3ced..e03acfd14787 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c @@ -1139,7 +1139,7 @@ static int wait_for_concurrent_writes(struct file *fi= le) dprintk("nfsd: write resume %d\n", task_pid_nr(current)); } =20 - if (inode->i_state & I_DIRTY) { + if (inode_state_read_once(inode) & I_DIRTY) { dprintk("nfsd: write sync %d\n", task_pid_nr(current)); err =3D vfs_fsync(file, 0); } diff --git a/fs/ntfs3/inode.c b/fs/ntfs3/inode.c index 37cbbee7fa58..c72b1b443bfa 100644 --- a/fs/ntfs3/inode.c +++ b/fs/ntfs3/inode.c @@ -536,7 +536,7 @@ struct inode *ntfs_iget5(struct super_block *sb, const = struct MFT_REF *ref, return ERR_PTR(-ENOMEM); =20 /* If this is a freshly allocated inode, need to read it now. */ - if (inode->i_state & I_NEW) + if (inode_state_read_once(inode) & I_NEW) inode =3D ntfs_read_mft(inode, name, ref); else if (ref->seq !=3D ntfs_i(inode)->mi.mrec->seq) { /* diff --git a/fs/ocfs2/dlmglue.c b/fs/ocfs2/dlmglue.c index 92a6149da9c1..619ff03b15d6 100644 --- a/fs/ocfs2/dlmglue.c +++ b/fs/ocfs2/dlmglue.c @@ -2487,7 +2487,7 @@ int ocfs2_inode_lock_full_nested(struct inode *inode, * which hasn't been populated yet, so clear the refresh flag * and let the caller handle it. */ - if (inode->i_state & I_NEW) { + if (inode_state_read_once(inode) & I_NEW) { status =3D 0; if (lockres) ocfs2_complete_lock_res_refresh(lockres, 0); diff --git a/fs/ocfs2/inode.c b/fs/ocfs2/inode.c index 14bf440ea4df..c0a1bb74e4a7 100644 --- a/fs/ocfs2/inode.c +++ b/fs/ocfs2/inode.c @@ -152,8 +152,8 @@ struct inode *ocfs2_iget(struct ocfs2_super *osb, u64 b= lkno, unsigned flags, mlog_errno(PTR_ERR(inode)); goto bail; } - trace_ocfs2_iget5_locked(inode->i_state); - if (inode->i_state & I_NEW) { + trace_ocfs2_iget5_locked(inode_state_read_once(inode)); + if (inode_state_read_once(inode) & I_NEW) { rc =3D ocfs2_read_locked_inode(inode, &args); unlock_new_inode(inode); } @@ -1307,12 +1307,12 @@ int ocfs2_drop_inode(struct inode *inode) inode->i_nlink, oi->ip_flags); =20 assert_spin_locked(&inode->i_lock); - inode->i_state |=3D I_WILL_FREE; + inode_state_add(inode, I_WILL_FREE); spin_unlock(&inode->i_lock); write_inode_now(inode, 1); spin_lock(&inode->i_lock); - WARN_ON(inode->i_state & I_NEW); - inode->i_state &=3D ~I_WILL_FREE; + WARN_ON(inode_state_read(inode) & I_NEW); + inode_state_del(inode, I_WILL_FREE); =20 return 1; } diff --git a/fs/omfs/inode.c b/fs/omfs/inode.c index 135c49c5d848..db80af312678 100644 --- a/fs/omfs/inode.c +++ b/fs/omfs/inode.c @@ -212,7 +212,7 @@ struct inode *omfs_iget(struct super_block *sb, ino_t i= no) inode =3D iget_locked(sb, ino); if (!inode) return ERR_PTR(-ENOMEM); - if (!(inode->i_state & I_NEW)) + if (!(inode_state_read_once(inode) & I_NEW)) return inode; =20 bh =3D omfs_bread(inode->i_sb, ino); diff --git a/fs/openpromfs/inode.c b/fs/openpromfs/inode.c index 26ecda0e4d19..fb8d84bdedfb 100644 --- a/fs/openpromfs/inode.c +++ b/fs/openpromfs/inode.c @@ -236,7 +236,7 @@ static struct dentry *openpromfs_lookup(struct inode *d= ir, struct dentry *dentry mutex_unlock(&op_mutex); if (IS_ERR(inode)) return ERR_CAST(inode); - if (inode->i_state & I_NEW) { + if (inode_state_read_once(inode) & I_NEW) { simple_inode_init_ts(inode); ent_oi =3D OP_I(inode); ent_oi->type =3D ent_type; diff --git a/fs/orangefs/inode.c b/fs/orangefs/inode.c index a01400cd41fd..1eb4fbe35a46 100644 --- a/fs/orangefs/inode.c +++ b/fs/orangefs/inode.c @@ -1041,7 +1041,7 @@ struct inode *orangefs_iget(struct super_block *sb, if (!inode) return ERR_PTR(-ENOMEM); =20 - if (!(inode->i_state & I_NEW)) + if (!(inode_state_read_once(inode) & I_NEW)) return inode; =20 error =3D orangefs_inode_getattr(inode, ORANGEFS_GETATTR_NEW); diff --git a/fs/orangefs/orangefs-utils.c b/fs/orangefs/orangefs-utils.c index 0fdceb00ca07..9ab1119ebd28 100644 --- a/fs/orangefs/orangefs-utils.c +++ b/fs/orangefs/orangefs-utils.c @@ -247,7 +247,7 @@ int orangefs_inode_getattr(struct inode *inode, int fla= gs) spin_lock(&inode->i_lock); /* Must have all the attributes in the mask and be within cache time. */ if ((!flags && time_before(jiffies, orangefs_inode->getattr_time)) || - orangefs_inode->attr_valid || inode->i_state & I_DIRTY_PAGES) { + orangefs_inode->attr_valid || inode_state_read(inode) & I_DIRTY_PAGES= ) { if (orangefs_inode->attr_valid) { spin_unlock(&inode->i_lock); write_inode_now(inode, 1); @@ -281,13 +281,13 @@ int orangefs_inode_getattr(struct inode *inode, int f= lags) spin_lock(&inode->i_lock); /* Must have all the attributes in the mask and be within cache time. */ if ((!flags && time_before(jiffies, orangefs_inode->getattr_time)) || - orangefs_inode->attr_valid || inode->i_state & I_DIRTY_PAGES) { + orangefs_inode->attr_valid || inode_state_read(inode) & I_DIRTY_PAGES= ) { if (orangefs_inode->attr_valid) { spin_unlock(&inode->i_lock); write_inode_now(inode, 1); goto again2; } - if (inode->i_state & I_DIRTY_PAGES) { + if (inode_state_read(inode) & I_DIRTY_PAGES) { ret =3D 0; goto out_unlock; } diff --git a/fs/qnx4/inode.c b/fs/qnx4/inode.c index e399e2dd3a12..31d78da203ea 100644 --- a/fs/qnx4/inode.c +++ b/fs/qnx4/inode.c @@ -290,7 +290,7 @@ struct inode *qnx4_iget(struct super_block *sb, unsigne= d long ino) inode =3D iget_locked(sb, ino); if (!inode) return ERR_PTR(-ENOMEM); - if (!(inode->i_state & I_NEW)) + if (!(inode_state_read_once(inode) & I_NEW)) return inode; =20 qnx4_inode =3D qnx4_raw_inode(inode); diff --git a/fs/qnx6/inode.c b/fs/qnx6/inode.c index 3310d1ad4d0e..88d285005083 100644 --- a/fs/qnx6/inode.c +++ b/fs/qnx6/inode.c @@ -521,7 +521,7 @@ struct inode *qnx6_iget(struct super_block *sb, unsigne= d ino) inode =3D iget_locked(sb, ino); if (!inode) return ERR_PTR(-ENOMEM); - if (!(inode->i_state & I_NEW)) + if (!(inode_state_read_once(inode) & I_NEW)) return inode; =20 ei =3D QNX6_I(inode); diff --git a/fs/romfs/super.c b/fs/romfs/super.c index 0addcc849ff2..360b00854115 100644 --- a/fs/romfs/super.c +++ b/fs/romfs/super.c @@ -302,7 +302,7 @@ static struct inode *romfs_iget(struct super_block *sb,= unsigned long pos) if (!i) return ERR_PTR(-ENOMEM); =20 - if (!(i->i_state & I_NEW)) + if (!(inode_state_read_once(i) & I_NEW)) return i; =20 /* precalculate the data offset */ diff --git a/fs/smb/client/cifsfs.c b/fs/smb/client/cifsfs.c index 3bd85ab2deb1..3e6d0ddc707c 100644 --- a/fs/smb/client/cifsfs.c +++ b/fs/smb/client/cifsfs.c @@ -444,7 +444,7 @@ cifs_evict_inode(struct inode *inode) { netfs_wait_for_outstanding_io(inode); truncate_inode_pages_final(&inode->i_data); - if (inode->i_state & I_PINNING_NETFS_WB) + if (inode_state_read_once(inode) & I_PINNING_NETFS_WB) cifs_fscache_unuse_inode_cookie(inode, true); cifs_fscache_release_inode_cookie(inode); clear_inode(inode); diff --git a/fs/smb/client/inode.c b/fs/smb/client/inode.c index 211d5b8b42f4..3918c9820a35 100644 --- a/fs/smb/client/inode.c +++ b/fs/smb/client/inode.c @@ -101,7 +101,7 @@ cifs_revalidate_cache(struct inode *inode, struct cifs_= fattr *fattr) cifs_dbg(FYI, "%s: revalidating inode %llu\n", __func__, cifs_i->uniqueid); =20 - if (inode->i_state & I_NEW) { + if (inode_state_read_once(inode) & I_NEW) { cifs_dbg(FYI, "%s: inode %llu is new\n", __func__, cifs_i->uniqueid); return; @@ -146,7 +146,7 @@ cifs_nlink_fattr_to_inode(struct inode *inode, struct c= ifs_fattr *fattr) */ if (fattr->cf_flags & CIFS_FATTR_UNKNOWN_NLINK) { /* only provide fake values on a new inode */ - if (inode->i_state & I_NEW) { + if (inode_state_read_once(inode) & I_NEW) { if (fattr->cf_cifsattrs & ATTR_DIRECTORY) set_nlink(inode, 2); else @@ -167,12 +167,12 @@ cifs_fattr_to_inode(struct inode *inode, struct cifs_= fattr *fattr, struct cifsInodeInfo *cifs_i =3D CIFS_I(inode); struct cifs_sb_info *cifs_sb =3D CIFS_SB(inode->i_sb); =20 - if (!(inode->i_state & I_NEW) && + if (!(inode_state_read_once(inode) & I_NEW) && unlikely(inode_wrong_type(inode, fattr->cf_mode))) { CIFS_I(inode)->time =3D 0; /* force reval */ return -ESTALE; } - if (inode->i_state & I_NEW) + if (inode_state_read_once(inode) & I_NEW) CIFS_I(inode)->netfs.zero_point =3D fattr->cf_eof; =20 cifs_revalidate_cache(inode, fattr); @@ -194,7 +194,7 @@ cifs_fattr_to_inode(struct inode *inode, struct cifs_fa= ttr *fattr, inode->i_gid =3D fattr->cf_gid; =20 /* if dynperm is set, don't clobber existing mode */ - if (inode->i_state & I_NEW || + if (inode_state_read_once(inode) & I_NEW || !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM)) inode->i_mode =3D fattr->cf_mode; =20 @@ -236,7 +236,7 @@ cifs_fattr_to_inode(struct inode *inode, struct cifs_fa= ttr *fattr, =20 if (fattr->cf_flags & CIFS_FATTR_JUNCTION) inode->i_flags |=3D S_AUTOMOUNT; - if (inode->i_state & I_NEW) { + if (inode_state_read_once(inode) & I_NEW) { cifs_set_netfs_context(inode); cifs_set_ops(inode); } @@ -1638,7 +1638,7 @@ cifs_iget(struct super_block *sb, struct cifs_fattr *= fattr) cifs_fattr_to_inode(inode, fattr, false); if (sb->s_flags & SB_NOATIME) inode->i_flags |=3D S_NOATIME | S_NOCMTIME; - if (inode->i_state & I_NEW) { + if (inode_state_read_once(inode) & I_NEW) { inode->i_ino =3D hash; cifs_fscache_get_inode_cookie(inode); unlock_new_inode(inode); diff --git a/fs/squashfs/inode.c b/fs/squashfs/inode.c index d5918eba27e3..8fbcc361f9a2 100644 --- a/fs/squashfs/inode.c +++ b/fs/squashfs/inode.c @@ -82,7 +82,7 @@ struct inode *squashfs_iget(struct super_block *sb, long = long ino, =20 if (!inode) return ERR_PTR(-ENOMEM); - if (!(inode->i_state & I_NEW)) + if (!(inode_state_read_once(inode) & I_NEW)) return inode; =20 err =3D squashfs_read_inode(inode, ino); diff --git a/fs/ubifs/file.c b/fs/ubifs/file.c index e75a6cec67be..5f5de8de0268 100644 --- a/fs/ubifs/file.c +++ b/fs/ubifs/file.c @@ -1323,7 +1323,7 @@ int ubifs_fsync(struct file *file, loff_t start, loff= _t end, int datasync) inode_lock(inode); =20 /* Synchronize the inode unless this is a 'datasync()' call. */ - if (!datasync || (inode->i_state & I_DIRTY_DATASYNC)) { + if (!datasync || (inode_state_read_once(inode) & I_DIRTY_DATASYNC)) { err =3D inode->i_sb->s_op->write_inode(inode, NULL); if (err) goto out; diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c index a0269ba96e3d..4a7b16f5cb7d 100644 --- a/fs/ubifs/super.c +++ b/fs/ubifs/super.c @@ -114,7 +114,7 @@ struct inode *ubifs_iget(struct super_block *sb, unsign= ed long inum) inode =3D iget_locked(sb, inum); if (!inode) return ERR_PTR(-ENOMEM); - if (!(inode->i_state & I_NEW)) + if (!(inode_state_read_once(inode) & I_NEW)) return inode; ui =3D ubifs_inode(inode); =20 diff --git a/fs/udf/inode.c b/fs/udf/inode.c index f24aa98e6869..de232d400f6a 100644 --- a/fs/udf/inode.c +++ b/fs/udf/inode.c @@ -1962,7 +1962,7 @@ struct inode *__udf_iget(struct super_block *sb, stru= ct kernel_lb_addr *ino, if (!inode) return ERR_PTR(-ENOMEM); =20 - if (!(inode->i_state & I_NEW)) { + if (!(inode_state_read_once(inode) & I_NEW)) { if (UDF_I(inode)->i_hidden !=3D hidden_inode) { iput(inode); return ERR_PTR(-EFSCORRUPTED); diff --git a/fs/ufs/inode.c b/fs/ufs/inode.c index 8361c00e8fa6..e2b0a35de2a7 100644 --- a/fs/ufs/inode.c +++ b/fs/ufs/inode.c @@ -655,7 +655,7 @@ struct inode *ufs_iget(struct super_block *sb, unsigned= long ino) inode =3D iget_locked(sb, ino); if (!inode) return ERR_PTR(-ENOMEM); - if (!(inode->i_state & I_NEW)) + if (!(inode_state_read_once(inode) & I_NEW)) return inode; =20 ufsi =3D UFS_I(inode); diff --git a/fs/zonefs/super.c b/fs/zonefs/super.c index 4dc7f967c861..b3d46ce657d0 100644 --- a/fs/zonefs/super.c +++ b/fs/zonefs/super.c @@ -644,7 +644,7 @@ static struct inode *zonefs_get_file_inode(struct inode= *dir, inode =3D iget_locked(sb, ino); if (!inode) return ERR_PTR(-ENOMEM); - if (!(inode->i_state & I_NEW)) { + if (!(inode_state_read_once(inode) & I_NEW)) { WARN_ON_ONCE(inode->i_private !=3D z); return inode; } @@ -683,7 +683,7 @@ static struct inode *zonefs_get_zgroup_inode(struct sup= er_block *sb, inode =3D iget_locked(sb, ino); if (!inode) return ERR_PTR(-ENOMEM); - if (!(inode->i_state & I_NEW)) + if (!(inode_state_read_once(inode) & I_NEW)) return inode; =20 inode->i_ino =3D ino; --=20 2.43.0 From nobody Thu Oct 2 13:01:34 2025 Received: from mail-wm1-f54.google.com (mail-wm1-f54.google.com [209.85.128.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BD5AA33EB1C for ; Tue, 16 Sep 2025 13:59:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758031185; cv=none; b=sOcOkTfydkWq2jQSbplIaWHUZOdWxowf1x3gkqDk1tCsJ16UO/eUaBUylXYsYqYfQK5a7Zls3ne41Zy7HQS8YvGNjFP85xrukgPeCT+fQMn/YVmZ2tTLx24GO/FRNxa1AhFbkXdbZg8RNMq1mkN1952Snq1tafPRhAsgVKly4nI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758031185; c=relaxed/simple; bh=Nc3Gee0vrTnwJ6vndyB/379w2+GYqChkKGGXlbOU7TI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=MHGk9tZ3DnTC4FOAHqKkD1EBnPq2IX+czIGDHB1rL5/X+7Nz+EEp7Gyy/7F3mnwpHGTDLPIa+Z0+JMEpZqDZNZvwo2Nm9L2MXPb1IkGV5K8rFnYoqNTcqcpp6lD7NhFDDsg6QFMTuyHxVzIJ0GcNrPHPrEcWtgUFBdpPvnHaIMI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Bfy3Z2aZ; arc=none smtp.client-ip=209.85.128.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Bfy3Z2aZ" Received: by mail-wm1-f54.google.com with SMTP id 5b1f17b1804b1-45ed646b656so46878045e9.3 for ; Tue, 16 Sep 2025 06:59:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1758031180; x=1758635980; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ZMpr+bvOy5/2/12diBRSepmR81u8HtS5BLKXmxw+l6c=; b=Bfy3Z2aZLBnOB8OcwpmFwYOu2POPQiCG4qrDIkeZLAq85nJOPv1oMvqfVaKt9AsC3U 3Uktntb0t45qL8UPokum8BSzilCUJhZhCsH8jPMbp2A3URiWK/XkKMNL1aZ8ikktgwBC FBu5TXgeNYsuIf4oWRiw/mUKTgisVJIz65TMwWMF5XFrST7CGgysQOapTPSkeY8OB1Po bHsoKAuX/XJXtM9D3Q2LAeJGNG6408NFZoxD9aTf1YH3tTR3IOlipopr6kYaWogera6L CkZKsIFl49pl06CdVK62sd9Pg9v0yido6U6u3FZ6zBiGjqPfOhiqLQ+7oAV6VRsKGfyS Dsxg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758031180; x=1758635980; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ZMpr+bvOy5/2/12diBRSepmR81u8HtS5BLKXmxw+l6c=; b=LLEeBHw4MK3HogZl7yE8J23jKWb10/bu7zF2r5Cd6pD7EiAhzNyPS+KBVp+MVmRidf ueiVxSPmueYSW5unkz+uHmY6lyUswn0tgCn+UWxHq5izoBkx+/rMUabTlOtk9PX+KDt1 GiZHkKvHClPP94j/NP98eyxPZEyMoCuF8VdcEn5/UZECmh6pCIUWYvE8mwYm/SBW5NmC UdpWTVYOaU5+ip+ZKA6nSjZdYNK/8fuetyj0IcxHJp7bosKa8pVh+jvqjeGrILazUN60 +eidV80A7228DTmY6ieWgpDQphq2KbbMcO/8D+dCq9mUtCSaB8/xOUxNtjtuYt2qiVeA dA6w== X-Forwarded-Encrypted: i=1; AJvYcCWAsNQ0wi6UELONY9cqxI2Tl2LQxLXa7aEP6u4SgmufHj8om8Kfk3ID27Xylnqsz7IuhPqTG5zqzN1HCQQ=@vger.kernel.org X-Gm-Message-State: AOJu0Yw6Nl7pamszhgYfpTNF6OwhJvtsxmEV1BHMthUKY7HKmmRhTMP7 Ht+44AWixPbsGfAuHbPtaD6nN4SBrxaMoVvxfJehFpfd3cl7oZHAeQhI X-Gm-Gg: ASbGnctWEeKQpil8CZH0slnkQVDV6LC5YTt9z1XdeWKqaQTgFysQzuC3w3VoqM0TFqA +Z0OVqQWjHf3Wg7jveJN5CB1wdaRjelWywEnhLJz2M+5TafzUhmx7GEcZSofhE+70cpy7bPV1Ww F0you5eFvvgnqtv4ozv2dgwM730MbWICYqtjIx+rbPf22pFmEHQ3EkoVL40N+eCkB0F2ZvQ91Gp ko7KXZP0hq9rPIH52AF2YszO9w0K5BLIYO3/7KbNYCZokhnpABFGGPclTCnlxmPSA2yxL0S2DiF OYQIcAjW+846qJbOgStMzTmS7i2wF7ToGR8hjLvYotFEo2WEuob7QH3vc0FFtsb+mv7zcSM0LnK 8slMQ524H5xF8twFVM6siY43ARigYTxCm8QV3Bj+qzlJ6SXgzd6fqiYA6cVEBNi1KYVtEcMFWxn ob416OqCo= X-Google-Smtp-Source: AGHT+IFbHxr4sMvLl74+5elP/3RKStElte34B3ctaItgubMLw6jX0shTLa+rud5mii4r4ob7vh3LMg== X-Received: by 2002:a05:600c:1d20:b0:45f:2b47:b06e with SMTP id 5b1f17b1804b1-45f2db8764cmr67166895e9.18.1758031179775; Tue, 16 Sep 2025 06:59:39 -0700 (PDT) Received: from f.. (cst-prg-88-146.cust.vodafone.cz. [46.135.88.146]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3e7cde81491sm16557991f8f.42.2025.09.16.06.59.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 16 Sep 2025 06:59:39 -0700 (PDT) From: Mateusz Guzik To: brauner@kernel.org Cc: viro@zeniv.linux.org.uk, jack@suse.cz, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, josef@toxicpanda.com, kernel-team@fb.com, amir73il@gmail.com, linux-btrfs@vger.kernel.org, linux-ext4@vger.kernel.org, linux-xfs@vger.kernel.org, ceph-devel@vger.kernel.org, linux-unionfs@vger.kernel.org, Mateusz Guzik Subject: [PATCH v4 04/12] btrfs: use the new ->i_state accessors Date: Tue, 16 Sep 2025 15:58:52 +0200 Message-ID: <20250916135900.2170346-5-mjguzik@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250916135900.2170346-1-mjguzik@gmail.com> References: <20250916135900.2170346-1-mjguzik@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Change generated with coccinelle and fixed up by hand as appropriate. Signed-off-by: Mateusz Guzik --- cheat sheet: Suppose flags I_A and I_B are to be handled, then if ->i_lock is held: state =3D inode->i_state =3D> state =3D inode_state_read(inode) inode->i_state |=3D (I_A | I_B) =3D> inode_state_add(inode, I_A | I_B) inode->i_state &=3D ~(I_A | I_B) =3D> inode_state_del(inode, I_A | I_B) inode->i_state =3D I_A | I_B =3D> inode_state_set(inode, I_A | I_B) If ->i_lock is not held or only held conditionally, add "_once" suffix for the read routine or "_raw" for the rest: state =3D inode->i_state =3D> state =3D inode_state_read_once(inod= e) inode->i_state |=3D (I_A | I_B) =3D> inode_state_add_raw(inode, I_A | I_B) inode->i_state &=3D ~(I_A | I_B) =3D> inode_state_del_raw(inode, I_A | I_B) inode->i_state =3D I_A | I_B =3D> inode_state_set_raw(inode, I_A | I_B) fs/btrfs/inode.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 5bcd8e25fa78..eaf3c20e5b23 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -3856,7 +3856,7 @@ static int btrfs_add_inode_to_root(struct btrfs_inode= *inode, bool prealloc) ASSERT(ret !=3D -ENOMEM); return ret; } else if (existing) { - WARN_ON(!(existing->vfs_inode.i_state & (I_WILL_FREE | I_FREEING))); + WARN_ON(!(inode_state_read_once(&existing->vfs_inode) & (I_WILL_FREE | I= _FREEING))); } =20 return 0; @@ -5317,7 +5317,7 @@ static void evict_inode_truncate_pages(struct inode *= inode) struct extent_io_tree *io_tree =3D &BTRFS_I(inode)->io_tree; struct rb_node *node; =20 - ASSERT(inode->i_state & I_FREEING); + ASSERT(inode_state_read_once(inode) & I_FREEING); truncate_inode_pages_final(&inode->i_data); =20 btrfs_drop_extent_map_range(BTRFS_I(inode), 0, (u64)-1, false); @@ -5745,7 +5745,7 @@ struct btrfs_inode *btrfs_iget_path(u64 ino, struct b= trfs_root *root, if (!inode) return ERR_PTR(-ENOMEM); =20 - if (!(inode->vfs_inode.i_state & I_NEW)) + if (!(inode_state_read_once(&inode->vfs_inode) & I_NEW)) return inode; =20 ret =3D btrfs_read_locked_inode(inode, path); @@ -5769,7 +5769,7 @@ struct btrfs_inode *btrfs_iget(u64 ino, struct btrfs_= root *root) if (!inode) return ERR_PTR(-ENOMEM); =20 - if (!(inode->vfs_inode.i_state & I_NEW)) + if (!(inode_state_read_once(&inode->vfs_inode) & I_NEW)) return inode; =20 path =3D btrfs_alloc_path(); @@ -7435,7 +7435,7 @@ static void btrfs_invalidate_folio(struct folio *foli= o, size_t offset, u64 page_start =3D folio_pos(folio); u64 page_end =3D page_start + folio_size(folio) - 1; u64 cur; - int inode_evicting =3D inode->vfs_inode.i_state & I_FREEING; + int inode_evicting =3D inode_state_read_once(&inode->vfs_inode) & I_FREEI= NG; =20 /* * We have folio locked so no new ordered extent can be created on this --=20 2.43.0 From nobody Thu Oct 2 13:01:34 2025 Received: from mail-wr1-f47.google.com (mail-wr1-f47.google.com [209.85.221.47]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 04E5633EB10 for ; Tue, 16 Sep 2025 13:59:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758031188; cv=none; b=NW/u0Rf6cCYkzen1wsegl5re3H3TK4PpfTU9gOFqt55VQ/bSguh6oiibPHXkEvozoq4UnE397eS0GUFOc8Sd9GBOQR/QeC40rvjC/uvll0evV0LIpdrACDWASZ25mTBb3uaeCswlLB+PXuEzXkCbysrGyb53mKJw2qBfVikX1hY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758031188; c=relaxed/simple; bh=zBN9BldLXuQYafbepgbsRKYJCNw2ZdSE8TIiThiLfW4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ZVB0NU0bTTvhWKco3PhT+1pGR5/nGhcC8+wx+rSPgK4d5u4Vy3ZR7NF/PP0B9J/hOwWYeO1+DeLMuTSn/xN1FIiZ5shNDmns/BzkuH7XxEZUJbD8sR28Wf0JLAQMJiJ6yrl6/EzV2/29tJ/yWJm5fyYmq9Txz3fBTKD3I+jfRiY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=BLBo2LB5; arc=none smtp.client-ip=209.85.221.47 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="BLBo2LB5" Received: by mail-wr1-f47.google.com with SMTP id ffacd0b85a97d-3ecbcc16948so459628f8f.3 for ; Tue, 16 Sep 2025 06:59:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1758031182; x=1758635982; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=rbghKwI6RgQqtHuzp8YIKipmqQLga/vSj80h86fMMYM=; b=BLBo2LB5PHvFexWoLIYT5WrIPilki61efSEs5c0jKV5SbQmSndN00mauMoB88EsbHy EbW3RDHt6qEcAhbdRfU/nR0p3s4ponYl6Od3MsYa3toqlYwc4dPCmvXQinYcjsWKkpoY 1OgiiIhCNypynnEVbf6HaKtZAZIkbWWGkbYJOw9CwmaKGdEyGmqorR3wDJtsmNIg8YRE BKy9Gtsw/o9jXEw+WYSZBaiWgv7q56SpVfUBc0goRKHiTm6Drm8X62FsntD6u0YWyDak Ksngv81i03MZ/WRkd+u6vWvTeo51lmVGNs53sBwSK6FgmtujqQgh7j1VFNMk147g/McU 8Mhg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758031182; x=1758635982; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=rbghKwI6RgQqtHuzp8YIKipmqQLga/vSj80h86fMMYM=; b=OPW4zRq0DGzTKfUe/DzBlrHv3dTtT7Kdfd4+FTKv0K2tEiLItZkyceFUrfJlXxbmRI eAC/eDF3DFiR5eV1LVRjXe9hStG3fVA/AAhwMna/RpecuNQc4qN0ArUNXnk+Ar5QckQo AOhhWf9ClG7CRj89RVrAahrouAXIYjbeox5sVla2UEsO7ZQiVWM3ukTTy9GYkJUNns/7 nhlACBpR+AgRfPXrN+TP4rDOsjHLU8NRuUT0AEFN6ppc2Oj6W8E6fKUnWkL77RI7KFk0 Xe3/dUyD9UPgSrcgo5ePMS679/LPr5D9+EXXiya8Z6vZdkF/gAk50DCOqDf3PsgGozPb pXaA== X-Forwarded-Encrypted: i=1; AJvYcCUJ53xMRjse0DfyZZasmbaXHuUer25nGJAMeWPomMuaNEik0PWLYWrRsrLlptqHrGAc7UlwzZdiGHDMJdk=@vger.kernel.org X-Gm-Message-State: AOJu0YwfcpCbL0GUi+DVtYugUx1MPkbXlQAUVrjH5EASBqXv1MLZnY0m NB9ftf2Bww5dpao297VOoxo7D1ktY3pPVXeE0iK3J/5ZeZLV7B/4+w6U X-Gm-Gg: ASbGnctKYzCj/EoF17IB358kALW8zFiAG0oZEaR8PeB5BGcpfQ7hrE2F0FGHMMx5+Yu h6qqxmhtTcILz5kvaM47dx3SmIzMD2Cqm6W8OK/7BLP9cXSgMZk1sIZE2x1AbcJNALBDWnCasyl zgcVgnaBHSeGj1WxHETocKYIPNAaZi2eg9mwtthrrK9q2N+aNhLh9vyoAV+KbbbwqSp1Hft5NiO HscljMj5ateiLVYlzqcw8xJvJeXvOA4y8x4S7TZjQyXOa4QUOxZd9v4qRfpFEL1yvkREGXIEBVD grxwCWX17TGvjxpNJ5kGhYX/8TE0jrwb/osKRKu5lnZwD+oHFThEEMVW7tvgfT0ZMVA0HK5NZNm rh8wSXt4IRlVsE30CmH2OlLERPksfUYYCf20rzdNPwJFcKJ5jr/v6uhB9+z8ltPm7vfXfN/ac X-Google-Smtp-Source: AGHT+IE5shqQIUKbOw6hlw6cRTrcBtFVXG2OEPPmead9j/NTizmYAzcuhQc64qnxQ9XZRhrVFrM2rw== X-Received: by 2002:a05:6000:310f:b0:3ec:d7c4:25a5 with SMTP id ffacd0b85a97d-3ecd7c4282emr1856689f8f.42.1758031181954; Tue, 16 Sep 2025 06:59:41 -0700 (PDT) Received: from f.. (cst-prg-88-146.cust.vodafone.cz. [46.135.88.146]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3e7cde81491sm16557991f8f.42.2025.09.16.06.59.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 16 Sep 2025 06:59:41 -0700 (PDT) From: Mateusz Guzik To: brauner@kernel.org Cc: viro@zeniv.linux.org.uk, jack@suse.cz, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, josef@toxicpanda.com, kernel-team@fb.com, amir73il@gmail.com, linux-btrfs@vger.kernel.org, linux-ext4@vger.kernel.org, linux-xfs@vger.kernel.org, ceph-devel@vger.kernel.org, linux-unionfs@vger.kernel.org, Mateusz Guzik Subject: [PATCH v4 05/12] netfs: use the new ->i_state accessors Date: Tue, 16 Sep 2025 15:58:53 +0200 Message-ID: <20250916135900.2170346-6-mjguzik@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250916135900.2170346-1-mjguzik@gmail.com> References: <20250916135900.2170346-1-mjguzik@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Change generated with coccinelle and fixed up by hand as appropriate. Signed-off-by: Mateusz Guzik --- cheat sheet: Suppose flags I_A and I_B are to be handled, then if ->i_lock is held: state =3D inode->i_state =3D> state =3D inode_state_read(inode) inode->i_state |=3D (I_A | I_B) =3D> inode_state_add(inode, I_A | I_B) inode->i_state &=3D ~(I_A | I_B) =3D> inode_state_del(inode, I_A | I_B) inode->i_state =3D I_A | I_B =3D> inode_state_set(inode, I_A | I_B) If ->i_lock is not held or only held conditionally, add "_once" suffix for the read routine or "_raw" for the rest: state =3D inode->i_state =3D> state =3D inode_state_read_once(inod= e) inode->i_state |=3D (I_A | I_B) =3D> inode_state_add_raw(inode, I_A | I_B) inode->i_state &=3D ~(I_A | I_B) =3D> inode_state_del_raw(inode, I_A | I_B) inode->i_state =3D I_A | I_B =3D> inode_state_set_raw(inode, I_A | I_B) fs/netfs/misc.c | 8 ++++---- fs/netfs/read_single.c | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/fs/netfs/misc.c b/fs/netfs/misc.c index 20748bcfbf59..f0f23887d350 100644 --- a/fs/netfs/misc.c +++ b/fs/netfs/misc.c @@ -147,10 +147,10 @@ bool netfs_dirty_folio(struct address_space *mapping,= struct folio *folio) if (!fscache_cookie_valid(cookie)) return true; =20 - if (!(inode->i_state & I_PINNING_NETFS_WB)) { + if (!(inode_state_read_once(inode) & I_PINNING_NETFS_WB)) { spin_lock(&inode->i_lock); - if (!(inode->i_state & I_PINNING_NETFS_WB)) { - inode->i_state |=3D I_PINNING_NETFS_WB; + if (!(inode_state_read(inode) & I_PINNING_NETFS_WB)) { + inode_state_add(inode, I_PINNING_NETFS_WB); need_use =3D true; } spin_unlock(&inode->i_lock); @@ -192,7 +192,7 @@ void netfs_clear_inode_writeback(struct inode *inode, c= onst void *aux) { struct fscache_cookie *cookie =3D netfs_i_cookie(netfs_inode(inode)); =20 - if (inode->i_state & I_PINNING_NETFS_WB) { + if (inode_state_read_once(inode) & I_PINNING_NETFS_WB) { loff_t i_size =3D i_size_read(inode); fscache_unuse_cookie(cookie, aux, &i_size); } diff --git a/fs/netfs/read_single.c b/fs/netfs/read_single.c index fa622a6cd56d..f728aae9bde9 100644 --- a/fs/netfs/read_single.c +++ b/fs/netfs/read_single.c @@ -36,12 +36,12 @@ void netfs_single_mark_inode_dirty(struct inode *inode) =20 mark_inode_dirty(inode); =20 - if (caching && !(inode->i_state & I_PINNING_NETFS_WB)) { + if (caching && !(inode_state_read_once(inode) & I_PINNING_NETFS_WB)) { bool need_use =3D false; =20 spin_lock(&inode->i_lock); - if (!(inode->i_state & I_PINNING_NETFS_WB)) { - inode->i_state |=3D I_PINNING_NETFS_WB; + if (!(inode_state_read(inode) & I_PINNING_NETFS_WB)) { + inode_state_add(inode, I_PINNING_NETFS_WB); need_use =3D true; } spin_unlock(&inode->i_lock); --=20 2.43.0 From nobody Thu Oct 2 13:01:34 2025 Received: from mail-wm1-f41.google.com (mail-wm1-f41.google.com [209.85.128.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3FFF7343217 for ; Tue, 16 Sep 2025 13:59:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758031191; cv=none; b=YZgfSB8woX8DQCb+N4S1FObyTxaqBtK6GDwvmgZE4R6dBr7fD6hGsdTdx8w5T3EgHzr9d+a2UScwE94lP0kJohiQNbfiSgpWzvpEtH+30ulq9Om3lmBYjRUHwjoEpoeWySMRm7jVVwA/QV1Pvu5x9wlDWr033/Iu+LDsuxqcERs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758031191; c=relaxed/simple; bh=Yt34Z65QEVjBY3vs7drEeyweXMdM1iPHPiVqjl9uXys=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=RCyK3qz0DcyljSCWzRB6E8nQEjqjrJtzUmtgr8DIRoMo6GsBvHIGyKtmLbRM87ff+g/gXIKtMxcJ7CM8kL8V5kcForoDHoq0PV3qsnl3v3Ea91DzKRVDGpMMr8bde5D+IrsJV1+YcYqdyuiSoUIdNItLSwEP/eN1eTRkMmhynt4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=V7wk0/Ug; arc=none smtp.client-ip=209.85.128.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="V7wk0/Ug" Received: by mail-wm1-f41.google.com with SMTP id 5b1f17b1804b1-45f31adf368so10032165e9.3 for ; Tue, 16 Sep 2025 06:59:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1758031185; x=1758635985; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ObYBkDignaJBOFN/sAdt6zRe1zmiqWFfHHsl18X4Hr4=; b=V7wk0/UgOUBi3ueEEU+LXUqtB/Weg76XmS9vT2711ZjVaqkH3GWkv1kxx3dXkouPsy qcbsm25Fy9QNhmA8kg8dpDlVItHBg0DI/JgOCRsrY2Osl1ZZD7dlunq/8dXS1q3sL5eU FUnmBdSjow3L/WC6mAc64Nr+Vnae5k8KThZj1Mvr16Q6ie+0+1dSTYF+4PmlbP3p049G KN+gJwPKm45md4B4UEN+2a8zBamvAGQwYQnS74R+FN3IJ2r1jDRzxtFgcgHJJS2vI1oT zbZkXY8pHfJmVy7GJMz6tyTHzIM6sbM+ZHLE+v42zdBIldr3bBKT1fjZJcIS7kQ0QPNH m72A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758031185; x=1758635985; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ObYBkDignaJBOFN/sAdt6zRe1zmiqWFfHHsl18X4Hr4=; b=LkX+je2bbQNcYrsHlOSDJEwURKjs/4D1iMbwBgxnKjrnFTpnKPBFtMRl7Z5To34PIF mnnzqDW05l9uNESLCHE14mA8u8jzXvSjK6jWVrvmAL2tzhdxAZ2lVKwNSonNGZcQ9q1Z zrfo9IXPxHOCdyLI8KrqSe4bnudUj7TzXj688B58SuXVWeFXjlYzxnFJ+INhbl0XXX79 BItHzRJQTVG8CbIWdqxupbcpBllH3re8THYbLTGqVmz7mVVUfBJ/sX5rmIrHaAGrAQG0 7stGqC885eOljkuCiiDBdhuGljf67L4416QNORPEsdiwNyQaftWe9v57IjxvdnQdZ5Yc Chmw== X-Forwarded-Encrypted: i=1; AJvYcCXDbzMo71+p7nT1e32oEtjT/GToaJrmh+l7UfeUQdyaKOm5mFDgZcRjYhpfN6SL3BCqtzIiy/0NmiIlE8o=@vger.kernel.org X-Gm-Message-State: AOJu0YyTZ0c8JX9XaX0nkEd65eDrkFlNTOQW1sHQqlJbcC3wuNYmpEvD 0MPbLzFVG/8Fy9d4aZ6FklzHKZtWNt3LfLeT1JLSY1Jf/QkfcLLYvkCR83o4C/Uh X-Gm-Gg: ASbGncvNqGQxxebw0jkfWcbRVaQNwjn+OCSzjC6FwZ6/t8tsCVcpPMZNHRJI4J9/VHF AJL4duLe7zqN9N5pYmLPDwtazq6lo8c+dFdp3Tyo1C0ToXxcmrZY6+4r3raX3FEokl/IV8i4ceS XClo8CzPREpzc9+R5f3W/b+0laFzMLiL3gkCmaJe3CDOOa0OI3V2KB6XOzCwW2S85QhGiAcbFtP IQF9YbC0+qnUjmKGZliHKux89bW50FV0Va9+mZL4+sD/UAtOKNXU/BR0RicDKn8GZxeOMKutk9C aMGfrn684xuF/zmaUZBpDlNFaQe22N9SpuU7qKWz4ZCOQJl78kWYHHPVZprapIUVwBTNbuW9kmI bQN0BESziq+7c/7F2vxOQVwLlv2jRegzTu3KmHcL8zl2sBm+Lx3Ut5mPwNFUyrvgSD1xZGgog7U 4VPtmYFGs= X-Google-Smtp-Source: AGHT+IGgH2HnoMas7BAKGXCBN0be+CTcvCaVE6b26oEMoWsrV0RJv59JPtcah/8oOhuanNH0DCd/AQ== X-Received: by 2002:a05:6000:4021:b0:3ce:f0a5:d594 with SMTP id ffacd0b85a97d-3e76578f304mr16479215f8f.13.1758031185077; Tue, 16 Sep 2025 06:59:45 -0700 (PDT) Received: from f.. (cst-prg-88-146.cust.vodafone.cz. [46.135.88.146]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3e7cde81491sm16557991f8f.42.2025.09.16.06.59.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 16 Sep 2025 06:59:44 -0700 (PDT) From: Mateusz Guzik To: brauner@kernel.org Cc: viro@zeniv.linux.org.uk, jack@suse.cz, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, josef@toxicpanda.com, kernel-team@fb.com, amir73il@gmail.com, linux-btrfs@vger.kernel.org, linux-ext4@vger.kernel.org, linux-xfs@vger.kernel.org, ceph-devel@vger.kernel.org, linux-unionfs@vger.kernel.org, Mateusz Guzik Subject: [PATCH v4 06/12] nilfs2: use the new ->i_state accessors Date: Tue, 16 Sep 2025 15:58:54 +0200 Message-ID: <20250916135900.2170346-7-mjguzik@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250916135900.2170346-1-mjguzik@gmail.com> References: <20250916135900.2170346-1-mjguzik@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Change generated with coccinelle and fixed up by hand as appropriate. Signed-off-by: Mateusz Guzik --- cheat sheet: Suppose flags I_A and I_B are to be handled, then if ->i_lock is held: state =3D inode->i_state =3D> state =3D inode_state_read(inode) inode->i_state |=3D (I_A | I_B) =3D> inode_state_add(inode, I_A | I_B) inode->i_state &=3D ~(I_A | I_B) =3D> inode_state_del(inode, I_A | I_B) inode->i_state =3D I_A | I_B =3D> inode_state_set(inode, I_A | I_B) If ->i_lock is not held or only held conditionally, add "_once" suffix for the read routine or "_raw" for the rest: state =3D inode->i_state =3D> state =3D inode_state_read_once(inod= e) inode->i_state |=3D (I_A | I_B) =3D> inode_state_add_raw(inode, I_A | I_B) inode->i_state &=3D ~(I_A | I_B) =3D> inode_state_del_raw(inode, I_A | I_B) inode->i_state =3D I_A | I_B =3D> inode_state_set_raw(inode, I_A | I_B) fs/nilfs2/cpfile.c | 2 +- fs/nilfs2/dat.c | 2 +- fs/nilfs2/ifile.c | 2 +- fs/nilfs2/inode.c | 10 +++++----- fs/nilfs2/sufile.c | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/fs/nilfs2/cpfile.c b/fs/nilfs2/cpfile.c index bcc7d76269ac..4bbdc832d7f2 100644 --- a/fs/nilfs2/cpfile.c +++ b/fs/nilfs2/cpfile.c @@ -1148,7 +1148,7 @@ int nilfs_cpfile_read(struct super_block *sb, size_t = cpsize, cpfile =3D nilfs_iget_locked(sb, NULL, NILFS_CPFILE_INO); if (unlikely(!cpfile)) return -ENOMEM; - if (!(cpfile->i_state & I_NEW)) + if (!(inode_state_read_once(cpfile) & I_NEW)) goto out; =20 err =3D nilfs_mdt_init(cpfile, NILFS_MDT_GFP, 0); diff --git a/fs/nilfs2/dat.c b/fs/nilfs2/dat.c index c664daba56ae..674380837ab9 100644 --- a/fs/nilfs2/dat.c +++ b/fs/nilfs2/dat.c @@ -506,7 +506,7 @@ int nilfs_dat_read(struct super_block *sb, size_t entry= _size, dat =3D nilfs_iget_locked(sb, NULL, NILFS_DAT_INO); if (unlikely(!dat)) return -ENOMEM; - if (!(dat->i_state & I_NEW)) + if (!(inode_state_read_once(dat) & I_NEW)) goto out; =20 err =3D nilfs_mdt_init(dat, NILFS_MDT_GFP, sizeof(*di)); diff --git a/fs/nilfs2/ifile.c b/fs/nilfs2/ifile.c index c4cd4a4dedd0..99eb8a59009e 100644 --- a/fs/nilfs2/ifile.c +++ b/fs/nilfs2/ifile.c @@ -188,7 +188,7 @@ int nilfs_ifile_read(struct super_block *sb, struct nil= fs_root *root, ifile =3D nilfs_iget_locked(sb, root, NILFS_IFILE_INO); if (unlikely(!ifile)) return -ENOMEM; - if (!(ifile->i_state & I_NEW)) + if (!(inode_state_read_once(ifile) & I_NEW)) goto out; =20 err =3D nilfs_mdt_init(ifile, NILFS_MDT_GFP, diff --git a/fs/nilfs2/inode.c b/fs/nilfs2/inode.c index 87ddde159f0c..51bde45d5865 100644 --- a/fs/nilfs2/inode.c +++ b/fs/nilfs2/inode.c @@ -365,7 +365,7 @@ struct inode *nilfs_new_inode(struct inode *dir, umode_= t mode) =20 failed_after_creation: clear_nlink(inode); - if (inode->i_state & I_NEW) + if (inode_state_read_once(inode) & I_NEW) unlock_new_inode(inode); iput(inode); /* * raw_inode will be deleted through @@ -562,7 +562,7 @@ struct inode *nilfs_iget(struct super_block *sb, struct= nilfs_root *root, if (unlikely(!inode)) return ERR_PTR(-ENOMEM); =20 - if (!(inode->i_state & I_NEW)) { + if (!(inode_state_read_once(inode) & I_NEW)) { if (!inode->i_nlink) { iput(inode); return ERR_PTR(-ESTALE); @@ -591,7 +591,7 @@ struct inode *nilfs_iget_for_gc(struct super_block *sb,= unsigned long ino, inode =3D iget5_locked(sb, ino, nilfs_iget_test, nilfs_iget_set, &args); if (unlikely(!inode)) return ERR_PTR(-ENOMEM); - if (!(inode->i_state & I_NEW)) + if (!(inode_state_read_once(inode) & I_NEW)) return inode; =20 err =3D nilfs_init_gcinode(inode); @@ -631,7 +631,7 @@ int nilfs_attach_btree_node_cache(struct inode *inode) nilfs_iget_set, &args); if (unlikely(!btnc_inode)) return -ENOMEM; - if (btnc_inode->i_state & I_NEW) { + if (inode_state_read_once(btnc_inode) & I_NEW) { nilfs_init_btnc_inode(btnc_inode); unlock_new_inode(btnc_inode); } @@ -686,7 +686,7 @@ struct inode *nilfs_iget_for_shadow(struct inode *inode) nilfs_iget_set, &args); if (unlikely(!s_inode)) return ERR_PTR(-ENOMEM); - if (!(s_inode->i_state & I_NEW)) + if (!(inode_state_read_once(s_inode) & I_NEW)) return inode; =20 NILFS_I(s_inode)->i_flags =3D 0; diff --git a/fs/nilfs2/sufile.c b/fs/nilfs2/sufile.c index 330f269abedf..83f93337c01b 100644 --- a/fs/nilfs2/sufile.c +++ b/fs/nilfs2/sufile.c @@ -1226,7 +1226,7 @@ int nilfs_sufile_read(struct super_block *sb, size_t = susize, sufile =3D nilfs_iget_locked(sb, NULL, NILFS_SUFILE_INO); if (unlikely(!sufile)) return -ENOMEM; - if (!(sufile->i_state & I_NEW)) + if (!(inode_state_read_once(sufile) & I_NEW)) goto out; =20 err =3D nilfs_mdt_init(sufile, NILFS_MDT_GFP, sizeof(*sui)); --=20 2.43.0 From nobody Thu Oct 2 13:01:34 2025 Received: from mail-wm1-f49.google.com (mail-wm1-f49.google.com [209.85.128.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E89CC34AB04 for ; Tue, 16 Sep 2025 13:59:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758031193; cv=none; b=qsZO5dwZOejVeldcKd1QDEHgNNInp661zZKwIwcUoZB4MI7l+JM/9K3JLg2j5MVU70JdxFwmY+MTPBsJHl6BZYiUZlEcQTFKahDMqvBe32CX4Tg5DT6WNq3jy+qdiQZVv9xG18YWGEljIDGgmwmRM65zqlapgF0dA6jtiRCwKcM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758031193; c=relaxed/simple; bh=67CCxoskkGrnlUlHhCX2YKbkGpmxVzicQpN51RR/ZoA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Mv2y40YWC2ooUVqYkyUidiBI8ofQYSUwEFt48WVQpO3HmIElMEcHbnkfiUIVcVpo4phCmh8x2kgON08Y5nUGSrEAT/n0TWQz5YIg82U1lcnvH2NRjMOchGlwWEfj/kRM0bg/P/ANFAac8H8IbNHMRYiLicFqYkZuj6aYD9TIg6I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=GWGzCbAD; arc=none smtp.client-ip=209.85.128.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="GWGzCbAD" Received: by mail-wm1-f49.google.com with SMTP id 5b1f17b1804b1-45b9814efbcso41361485e9.0 for ; Tue, 16 Sep 2025 06:59:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1758031189; x=1758635989; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=29JSURtnbb1RZIccpZPbCOQkUUAEjI4J83C/88taCJc=; b=GWGzCbADEW3VzjUgNqLj4SAOxmXYChxKAq25VCNCe2AJuoXDONt8UqftEbl9+WmgPd y3MPTYzAH1TNoPNuK5R5+sWMewJwRpxU+Rq6V2rwY+AQINbE1dgMVkdS/rNi8GEZl/i3 EnQoWClY1USpxmh+7xKrheqXmx/LI5sgh4FECMhQcXt201ANOGKBdeZUr+MjBFnziHd6 V8hZ3q0rm4zkX4fnNDSkn07jVElHgfFRz0O9zhNZqtzYnpioDsnI+FHOILrUZUAxRjOJ hy4OT14lx+bu7nGGW8Y5uibHiAaAbHUhvW6WKVzORQkflkY/wWI4IC96w/pyXUSAEDy9 cQUA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758031189; x=1758635989; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=29JSURtnbb1RZIccpZPbCOQkUUAEjI4J83C/88taCJc=; b=hWuHN0CHfwFBYxhktJVgMKxAxS5BIktvpnsUtFt2xWZ0wOgoFiV4jW9J/Qbjn0Hpp+ CgR3ZbiNp2xBFV97jey5lyiPbCGnwrQXjVF1XbKYmp07h6z7CHk/5LlS7pcnZBi6QQRG MajofFpBwek70w1c853pa+FeJN1P1ww6IlU1GB9Mw4HF1fwjRvMyF7jU3xOyRjvZ1wxs a4Jx4iRacYduXryapKPS8+dHM1C6/K0KpxAWv80wzDPRbtPyt7F1w2raAPoSYcxJumSn 1FW9KDOeFdIphvWoc3bpmR7cfWuw8kZLrYz6864Eo8T7q1WMx/WGRDJw8KCDg7c4pDxb bM3w== X-Forwarded-Encrypted: i=1; AJvYcCVjNJf1csaf/vEjQEmSlDGbZ0A2ovlHOJ6C2aQTCNRDOQWFSOC2vZbEToYIc6SkP0psNVtKSgnhEkAWiyU=@vger.kernel.org X-Gm-Message-State: AOJu0Ywpl08Kd98T8pRS07JR5vPJ98Zf3GalrtJWZ5mcHUqSKEuYqzu6 v+5I4T9+tsWvlQ3QOsUqHUA6HqGt0nGtRXFcRTdJEQTOc4JVUlDp4uL8 X-Gm-Gg: ASbGnctZVuFzRqDyEywv94u133VT7qxNhv/Kruf4LwmnKWkZU2S5ZK92xgMbND2VXb2 Q3uKfbUdSW2X1tN2QMpMfiU5oxPEgt61cn4HKWwfaD25zgqhjOLCNl3K0zkSj7rUGvkLKd2F/lO U37/UpKd3rcxgqOvkN6NZH1TQBtuDLncHJAsGfQpf7JFM3HPNCSJMu1dVFdKQfleJ/R375rjAiK F11JWRaceaT5qzycIbPtMb4ypWwl3TwX03lXqq1s6tw1log+5AVxhmFkbwGtE9Z1d/+TmbaKvGB CpR9wO2b6m3QTcEK/bCCwfZyibxw7131nqvo2g7Aye4stkKHzdrg8MKE5RNe3Tbgz7fVfx9ywXx V1PAnYvCA9zjXg3TEFSfzcnaZH5MuCodnFLZaFMdWNhkleUPOPtXyrluDuWPZmIvowWM57CveUA 5/KvK8rEU= X-Google-Smtp-Source: AGHT+IHcXAIc1sXbMc5v7hDSGRfrit2oYOb7A0GAgCY3ykOcZbinoBfJfezyLCAk8DhCdfrCgCQQPw== X-Received: by 2002:a05:6000:2510:b0:3ec:db87:ff53 with SMTP id ffacd0b85a97d-3ecdb8813b6mr1168621f8f.12.1758031188900; Tue, 16 Sep 2025 06:59:48 -0700 (PDT) Received: from f.. (cst-prg-88-146.cust.vodafone.cz. [46.135.88.146]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3e7cde81491sm16557991f8f.42.2025.09.16.06.59.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 16 Sep 2025 06:59:48 -0700 (PDT) From: Mateusz Guzik To: brauner@kernel.org Cc: viro@zeniv.linux.org.uk, jack@suse.cz, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, josef@toxicpanda.com, kernel-team@fb.com, amir73il@gmail.com, linux-btrfs@vger.kernel.org, linux-ext4@vger.kernel.org, linux-xfs@vger.kernel.org, ceph-devel@vger.kernel.org, linux-unionfs@vger.kernel.org, Mateusz Guzik Subject: [PATCH v4 07/12] xfs: use the new ->i_state accessors Date: Tue, 16 Sep 2025 15:58:55 +0200 Message-ID: <20250916135900.2170346-8-mjguzik@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250916135900.2170346-1-mjguzik@gmail.com> References: <20250916135900.2170346-1-mjguzik@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Change generated with coccinelle and fixed up by hand as appropriate. Signed-off-by: Mateusz Guzik --- cheat sheet: Suppose flags I_A and I_B are to be handled, then if ->i_lock is held: state =3D inode->i_state =3D> state =3D inode_state_read(inode) inode->i_state |=3D (I_A | I_B) =3D> inode_state_add(inode, I_A | I_B) inode->i_state &=3D ~(I_A | I_B) =3D> inode_state_del(inode, I_A | I_B) inode->i_state =3D I_A | I_B =3D> inode_state_set(inode, I_A | I_B) If ->i_lock is not held or only held conditionally, add "_once" suffix for the read routine or "_raw" for the rest: state =3D inode->i_state =3D> state =3D inode_state_read_once(inod= e) inode->i_state |=3D (I_A | I_B) =3D> inode_state_add_raw(inode, I_A | I_B) inode->i_state &=3D ~(I_A | I_B) =3D> inode_state_del_raw(inode, I_A | I_B) inode->i_state =3D I_A | I_B =3D> inode_state_set_raw(inode, I_A | I_B) fs/xfs/scrub/common.c | 2 +- fs/xfs/scrub/inode_repair.c | 2 +- fs/xfs/scrub/parent.c | 2 +- fs/xfs/xfs_bmap_util.c | 2 +- fs/xfs/xfs_health.c | 4 ++-- fs/xfs/xfs_icache.c | 6 +++--- fs/xfs/xfs_inode.c | 6 +++--- fs/xfs/xfs_inode_item.c | 4 ++-- fs/xfs/xfs_iops.c | 2 +- fs/xfs/xfs_reflink.h | 2 +- 10 files changed, 16 insertions(+), 16 deletions(-) diff --git a/fs/xfs/scrub/common.c b/fs/xfs/scrub/common.c index 2ef7742be7d3..e27cfbcfc5c9 100644 --- a/fs/xfs/scrub/common.c +++ b/fs/xfs/scrub/common.c @@ -1249,7 +1249,7 @@ xchk_irele( * hits do not clear DONTCACHE, so we must do it here. */ spin_lock(&VFS_I(ip)->i_lock); - VFS_I(ip)->i_state &=3D ~I_DONTCACHE; + inode_state_del(VFS_I(ip), I_DONTCACHE); spin_unlock(&VFS_I(ip)->i_lock); } =20 diff --git a/fs/xfs/scrub/inode_repair.c b/fs/xfs/scrub/inode_repair.c index a90a011c7e5f..4f7040c9ddf0 100644 --- a/fs/xfs/scrub/inode_repair.c +++ b/fs/xfs/scrub/inode_repair.c @@ -1933,7 +1933,7 @@ xrep_inode_pptr( * Unlinked inodes that cannot be added to the directory tree will not * have a parent pointer. */ - if (inode->i_nlink =3D=3D 0 && !(inode->i_state & I_LINKABLE)) + if (inode->i_nlink =3D=3D 0 && !(inode_state_read_once(inode) & I_LINKABL= E)) return 0; =20 /* Children of the superblock do not have parent pointers. */ diff --git a/fs/xfs/scrub/parent.c b/fs/xfs/scrub/parent.c index 3b692c4acc1e..11d5de10fd56 100644 --- a/fs/xfs/scrub/parent.c +++ b/fs/xfs/scrub/parent.c @@ -915,7 +915,7 @@ xchk_pptr_looks_zapped( * Temporary files that cannot be linked into the directory tree do not * have attr forks because they cannot ever have parents. */ - if (inode->i_nlink =3D=3D 0 && !(inode->i_state & I_LINKABLE)) + if (inode->i_nlink =3D=3D 0 && !(inode_state_read_once(inode) & I_LINKABL= E)) return false; =20 /* diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 06ca11731e43..2208a720ec3f 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -514,7 +514,7 @@ xfs_can_free_eofblocks( * Caller must either hold the exclusive io lock; or be inactivating * the inode, which guarantees there are no other users of the inode. */ - if (!(VFS_I(ip)->i_state & I_FREEING)) + if (!(inode_state_read_once(VFS_I(ip)) & I_FREEING)) xfs_assert_ilocked(ip, XFS_IOLOCK_EXCL); =20 /* prealloc/delalloc exists only on regular files */ diff --git a/fs/xfs/xfs_health.c b/fs/xfs/xfs_health.c index 7c541fb373d5..c765a28b4556 100644 --- a/fs/xfs/xfs_health.c +++ b/fs/xfs/xfs_health.c @@ -285,7 +285,7 @@ xfs_inode_mark_sick( * is not the case here. */ spin_lock(&VFS_I(ip)->i_lock); - VFS_I(ip)->i_state &=3D ~I_DONTCACHE; + inode_state_del(VFS_I(ip), I_DONTCACHE); spin_unlock(&VFS_I(ip)->i_lock); } =20 @@ -309,7 +309,7 @@ xfs_inode_mark_corrupt( * is not the case here. */ spin_lock(&VFS_I(ip)->i_lock); - VFS_I(ip)->i_state &=3D ~I_DONTCACHE; + inode_state_del(VFS_I(ip), I_DONTCACHE); spin_unlock(&VFS_I(ip)->i_lock); } =20 diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c index 4cf7abe50143..0023bd449573 100644 --- a/fs/xfs/xfs_icache.c +++ b/fs/xfs/xfs_icache.c @@ -334,7 +334,7 @@ xfs_reinit_inode( dev_t dev =3D inode->i_rdev; kuid_t uid =3D inode->i_uid; kgid_t gid =3D inode->i_gid; - unsigned long state =3D inode->i_state; + unsigned long state =3D inode_state_read_once(inode); =20 error =3D inode_init_always(mp->m_super, inode); =20 @@ -345,7 +345,7 @@ xfs_reinit_inode( inode->i_rdev =3D dev; inode->i_uid =3D uid; inode->i_gid =3D gid; - inode->i_state =3D state; + inode_state_set_raw(inode, state); mapping_set_folio_min_order(inode->i_mapping, M_IGEO(mp)->min_folio_order); return error; @@ -411,7 +411,7 @@ xfs_iget_recycle( ip->i_flags |=3D XFS_INEW; xfs_perag_clear_inode_tag(pag, XFS_INO_TO_AGINO(mp, ip->i_ino), XFS_ICI_RECLAIM_TAG); - inode->i_state =3D I_NEW; + inode_state_set_raw(inode, I_NEW); spin_unlock(&ip->i_flags_lock); spin_unlock(&pag->pag_ici_lock); =20 diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index df8eab11dc48..ed141f818e8d 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -1569,7 +1569,7 @@ xfs_iunlink_reload_next( next_ip->i_prev_unlinked =3D prev_agino; trace_xfs_iunlink_reload_next(next_ip); rele: - ASSERT(!(VFS_I(next_ip)->i_state & I_DONTCACHE)); + ASSERT(!(inode_state_read_once(VFS_I(next_ip)) & I_DONTCACHE)); if (xfs_is_quotacheck_running(mp) && next_ip) xfs_iflags_set(next_ip, XFS_IQUOTAUNCHECKED); xfs_irele(next_ip); @@ -2093,7 +2093,7 @@ xfs_rename_alloc_whiteout( */ xfs_setup_iops(tmpfile); xfs_finish_inode_setup(tmpfile); - VFS_I(tmpfile)->i_state |=3D I_LINKABLE; + inode_state_add_raw(VFS_I(tmpfile), I_LINKABLE); =20 *wip =3D tmpfile; return 0; @@ -2319,7 +2319,7 @@ xfs_rename( * flag from the inode so it doesn't accidentally get misused in * future. */ - VFS_I(du_wip.ip)->i_state &=3D ~I_LINKABLE; + inode_state_del_raw(VFS_I(du_wip.ip), I_LINKABLE); } =20 out_commit: diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c index 829675700fcd..a98fb2696d08 100644 --- a/fs/xfs/xfs_inode_item.c +++ b/fs/xfs/xfs_inode_item.c @@ -113,9 +113,9 @@ xfs_inode_item_precommit( * to log the timestamps, or will clear already cleared fields in the * worst case. */ - if (inode->i_state & I_DIRTY_TIME) { + if (inode_state_read_once(inode) & I_DIRTY_TIME) { spin_lock(&inode->i_lock); - inode->i_state &=3D ~I_DIRTY_TIME; + inode_state_del(inode, I_DIRTY_TIME); spin_unlock(&inode->i_lock); } =20 diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index 149b5460fbfd..7a05d0ac7ed8 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -1419,7 +1419,7 @@ xfs_setup_inode( bool is_meta =3D xfs_is_internal_inode(ip); =20 inode->i_ino =3D ip->i_ino; - inode->i_state |=3D I_NEW; + inode_state_add_raw(inode, I_NEW); =20 inode_sb_list_add(inode); /* make the inode look hashed for the writeback code */ diff --git a/fs/xfs/xfs_reflink.h b/fs/xfs/xfs_reflink.h index 36cda724da89..9d1ed9bb0bee 100644 --- a/fs/xfs/xfs_reflink.h +++ b/fs/xfs/xfs_reflink.h @@ -17,7 +17,7 @@ xfs_can_free_cowblocks(struct xfs_inode *ip) { struct inode *inode =3D VFS_I(ip); =20 - if ((inode->i_state & I_DIRTY_PAGES) || + if ((inode_state_read_once(inode) & I_DIRTY_PAGES) || mapping_tagged(inode->i_mapping, PAGECACHE_TAG_DIRTY) || mapping_tagged(inode->i_mapping, PAGECACHE_TAG_WRITEBACK) || atomic_read(&inode->i_dio_count)) --=20 2.43.0 From nobody Thu Oct 2 13:01:34 2025 Received: from mail-wm1-f50.google.com (mail-wm1-f50.google.com [209.85.128.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C11A6350D62 for ; Tue, 16 Sep 2025 13:59:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758031198; cv=none; b=g9CDP4b91QA1NP/wwozHFbIYVEEFgAuExSQr7nylQ5t/4IhWUjui4RsQfL4gE2dieV3Ajpwwkg+oNKHz9Q/uNDYrOTbGbu8sj5tckNS/FQ1Mv+dop2ZaSg9cUuWbeGCFlR2lU7Dv/UrdzlaXIv6JCdRSwxIGD2ZGP/QiDJzAY2U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758031198; c=relaxed/simple; bh=zZiNEsc0ou9dLfivP9Aqc6NzCGoV3keb+6tsUnteUdU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=CwTeUjk/PX6OGVob6YnArsBgCwD1p0bX8dbm56xMo/vJiEcivMhxQbEXL9Nr8erc29njDEZQ1mLb2Jjt0AiXx+aD80Iup+qmHJePOjx4/ma6HxFXA9OyChb+I8UjGxo/x1xaYPgVkALOhjJ6lJbXmZ+vdM8eAnOghfN+cKqBE98= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=RHs4mrtt; arc=none smtp.client-ip=209.85.128.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="RHs4mrtt" Received: by mail-wm1-f50.google.com with SMTP id 5b1f17b1804b1-45f2a69d876so16788425e9.0 for ; Tue, 16 Sep 2025 06:59:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1758031193; x=1758635993; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=BH7uZiHjx4atLUKz523xg3qFPyZEu5cyZb0AVULMuO0=; b=RHs4mrttSYB9GRGRbp9KqwYnMiUEDNugTDAhLFQoZojDS0ZgoU0Va7b9gY3Cc6pZ5b O3vJ1KheImXyWj+71MZD2sM8nrtiHieuI7KAcKS+ocl/x1fgN72+vwL1gpGT3q7S0xUj kihoI5B07V5J9Jv920/X4pxFRd3zyvaFMV1k2nejn9ujA6hCbYP3rzyKP+UScJ3SsA08 62/eowIVfhzLFP90sKACmqejcwZKcgViHQKCLqXMu9ZQkEjN9VvDOySElFYfZqqBuwXT +Cw2ILPMdQe4+tCLLSzTQ+VIZxbC+TvQxRp9meBAcR3quDq8MTBlcazdBJuOZcJoPJ/i lkLg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758031193; x=1758635993; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=BH7uZiHjx4atLUKz523xg3qFPyZEu5cyZb0AVULMuO0=; b=SZvWZIKNQbsFbwmmD/Z/ml2kCe2K0/T3Ugk0Bfx3Q0iitJIqzCQkPG3gcx45EcChk6 zlhIk48V2eMcep3ibphr+Q7VgF8GLOnWzq3zpOkKLCaKVE8kzSl29yulW8uSq0Qsn8bo I/RssCYom/VG3l75J4vPA5Jnj4P+FP44ZMr3hSG0dHoYRkDdRWsvwopMHiJOWaVxHW5M 7vRbVB5Obusr3/Je4xuAvNGu8cj5R1Sne9gJ3IGBJ8J0dcP2EKwsVgiXtHb2Qcf7ZZc3 Jc6CX5Ix/nBMd2BYNgE6UP+w/E/FzoZ0ArCaGr4CbUjFC46W2utCQEfYyMeZ5Np9YF9M FVtw== X-Forwarded-Encrypted: i=1; AJvYcCWDa0WvO8d4f+ih54XADHVDf6Cv/srxhtYvH+oScT85tk7QOaPwCIpWHn0eKKZivG8Y6qUZLQybtJvUtdw=@vger.kernel.org X-Gm-Message-State: AOJu0YzpwVTIkqaRNcZRRBWxWX5v2SWODqcI1AG/XRFdmWyGh8DLjfxZ Q3DME6wvlFUEATR16VpZ4g6ujzwQKSWb5L0PlwaLSkGnYWa6jdCUNXos X-Gm-Gg: ASbGncvNzHtXR+6650DWp1MQHcZFXol5qNABAAEDgcD/wls4BbhWA0HrhpzweeN9yrf iIs8zEcGS99MgAthzJGxekug5f3+HlXhADPTwz36/zEkd3XYtr9aDO/pCdAz88kJQg2GHfrg9CR oQTM3Tg5XItoJ6RAhx2WzClqkyiUmTgAKQcGfYCTecTMmhFod9YXV1C5/8xQny95ATcFpNQt1Tq pbqARfFvinWhmxyne3b34DPWhJ7i8nMQPJ23//BN0huDBfJ6nF1Qc4yb7knUA7G31/1n6N0/Lem JFtg2y6UHVpqPVSKBVN0gmXzmsBNr4W8qrveMFwMGr5/ButNVElfbpqAUDt6FbHbUXCJDa/O3ZY 35ej+Toxp06/eDbXGW0uOPpQble2AQhk4g9fxVv54Uh5EuVUUzLx7D+vUj/F4UuRKwWZmh/E1 X-Google-Smtp-Source: AGHT+IHChUM15w8rTVndIAcblUfNQKZjE5Ckd1Ezw+ggkuImQMYHH2MYJMg1j8qo3nE46VliCumLGA== X-Received: by 2002:a05:600c:584d:b0:45d:e110:e690 with SMTP id 5b1f17b1804b1-45f211d55aamr122328095e9.14.1758031192933; Tue, 16 Sep 2025 06:59:52 -0700 (PDT) Received: from f.. (cst-prg-88-146.cust.vodafone.cz. [46.135.88.146]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3e7cde81491sm16557991f8f.42.2025.09.16.06.59.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 16 Sep 2025 06:59:52 -0700 (PDT) From: Mateusz Guzik To: brauner@kernel.org Cc: viro@zeniv.linux.org.uk, jack@suse.cz, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, josef@toxicpanda.com, kernel-team@fb.com, amir73il@gmail.com, linux-btrfs@vger.kernel.org, linux-ext4@vger.kernel.org, linux-xfs@vger.kernel.org, ceph-devel@vger.kernel.org, linux-unionfs@vger.kernel.org, Mateusz Guzik Subject: [PATCH v4 08/12] ext4: use the new ->i_state accessors Date: Tue, 16 Sep 2025 15:58:56 +0200 Message-ID: <20250916135900.2170346-9-mjguzik@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250916135900.2170346-1-mjguzik@gmail.com> References: <20250916135900.2170346-1-mjguzik@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Change generated with coccinelle and fixed up by hand as appropriate. Signed-off-by: Mateusz Guzik --- cheat sheet: Suppose flags I_A and I_B are to be handled, then if ->i_lock is held: state =3D inode->i_state =3D> state =3D inode_state_read(inode) inode->i_state |=3D (I_A | I_B) =3D> inode_state_add(inode, I_A | I_B) inode->i_state &=3D ~(I_A | I_B) =3D> inode_state_del(inode, I_A | I_B) inode->i_state =3D I_A | I_B =3D> inode_state_set(inode, I_A | I_B) If ->i_lock is not held or only held conditionally, add "_once" suffix for the read routine or "_raw" for the rest: state =3D inode->i_state =3D> state =3D inode_state_read_once(inod= e) inode->i_state |=3D (I_A | I_B) =3D> inode_state_add_raw(inode, I_A | I_B) inode->i_state &=3D ~(I_A | I_B) =3D> inode_state_del_raw(inode, I_A | I_B) inode->i_state =3D I_A | I_B =3D> inode_state_set_raw(inode, I_A | I_B) fs/ext4/inode.c | 10 +++++----- fs/ext4/orphan.c | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index ed54c4d0f2f9..f5b652613f2e 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -425,7 +425,7 @@ void ext4_check_map_extents_env(struct inode *inode) if (!S_ISREG(inode->i_mode) || IS_NOQUOTA(inode) || IS_VERITY(inode) || is_special_ino(inode->i_sb, inode->i_ino) || - (inode->i_state & (I_FREEING | I_WILL_FREE | I_NEW)) || + (inode_state_read_once(inode) & (I_FREEING | I_WILL_FREE | I_NEW)) || ext4_test_inode_flag(inode, EXT4_INODE_EA_INODE) || ext4_verity_in_progress(inode)) return; @@ -3473,7 +3473,7 @@ static bool ext4_inode_datasync_dirty(struct inode *i= node) /* Any metadata buffers to write? */ if (!list_empty(&inode->i_mapping->i_private_list)) return true; - return inode->i_state & I_DIRTY_DATASYNC; + return inode_state_read_once(inode) & I_DIRTY_DATASYNC; } =20 static void ext4_set_iomap(struct inode *inode, struct iomap *iomap, @@ -4581,7 +4581,7 @@ int ext4_truncate(struct inode *inode) * or it's a completely new inode. In those cases we might not * have i_rwsem locked because it's not necessary. */ - if (!(inode->i_state & (I_NEW|I_FREEING))) + if (!(inode_state_read_once(inode) & (I_NEW | I_FREEING))) WARN_ON(!inode_is_locked(inode)); trace_ext4_truncate_enter(inode); =20 @@ -5239,7 +5239,7 @@ struct inode *__ext4_iget(struct super_block *sb, uns= igned long ino, inode =3D iget_locked(sb, ino); if (!inode) return ERR_PTR(-ENOMEM); - if (!(inode->i_state & I_NEW)) { + if (!(inode_state_read_once(inode) & I_NEW)) { ret =3D check_igot_inode(inode, flags, function, line); if (ret) { iput(inode); @@ -5570,7 +5570,7 @@ static void __ext4_update_other_inode_time(struct sup= er_block *sb, if (inode_is_dirtytime_only(inode)) { struct ext4_inode_info *ei =3D EXT4_I(inode); =20 - inode->i_state &=3D ~I_DIRTY_TIME; + inode_state_del(inode, I_DIRTY_TIME); spin_unlock(&inode->i_lock); =20 spin_lock(&ei->i_raw_lock); diff --git a/fs/ext4/orphan.c b/fs/ext4/orphan.c index 7c7f792ad6ab..10eeb025380f 100644 --- a/fs/ext4/orphan.c +++ b/fs/ext4/orphan.c @@ -107,7 +107,7 @@ int ext4_orphan_add(handle_t *handle, struct inode *ino= de) if (!sbi->s_journal || is_bad_inode(inode)) return 0; =20 - WARN_ON_ONCE(!(inode->i_state & (I_NEW | I_FREEING)) && + WARN_ON_ONCE(!(inode_state_read_once(inode) & (I_NEW | I_FREEING)) && !inode_is_locked(inode)); /* * Inode orphaned in orphan file or in orphan list? @@ -236,7 +236,7 @@ int ext4_orphan_del(handle_t *handle, struct inode *ino= de) if (!sbi->s_journal && !(sbi->s_mount_state & EXT4_ORPHAN_FS)) return 0; =20 - WARN_ON_ONCE(!(inode->i_state & (I_NEW | I_FREEING)) && + WARN_ON_ONCE(!(inode_state_read_once(inode) & (I_NEW | I_FREEING)) && !inode_is_locked(inode)); if (ext4_test_inode_state(inode, EXT4_STATE_ORPHAN_FILE)) return ext4_orphan_file_del(handle, inode); --=20 2.43.0 From nobody Thu Oct 2 13:01:34 2025 Received: from mail-wm1-f44.google.com (mail-wm1-f44.google.com [209.85.128.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B38D7353348 for ; Tue, 16 Sep 2025 13:59:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758031202; cv=none; b=s0tObz6QAvuEZVYcI+6ShOIuQOR7ZCFN3wc9tfl5nIEw8HVXdLaWD+6GTyLFcP9UDdjGRIrmFLjw5kz2xPAN48zBCCN2lKsOT69Jko2bjQqVEUt2VJVy/cPpgHDNuN5aDdfbKGITop7WKWb/e58qeUOJsmTwSO2AxYvJryQYSOs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758031202; c=relaxed/simple; bh=c+jscvVcjHEiu8psO35s6FUxxWLk6N1H5PVjaYHBuTk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=KPRA8VdHUZkeDzLG0hqSO+ymkfUhvmWUKDKmhiZ4OQPk/495ziTX4UEZcipea2bYoYz9qvdJ3oaLO8sqVJJa8ACCKqWoL60SlefPMb83gcGJ6Akqxv2AN5yRsceusWZhw/56zJus4sZNuoxdOTlPNBKelWg5HtHAYM3Kl5f5Gd8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=C21u3d19; arc=none smtp.client-ip=209.85.128.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="C21u3d19" Received: by mail-wm1-f44.google.com with SMTP id 5b1f17b1804b1-45de56a042dso36881105e9.3 for ; Tue, 16 Sep 2025 06:59:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1758031197; x=1758635997; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=vENfTvsqrFJ9tJyBfgLNz2mb8wc8do/WZvddYLx/2MM=; b=C21u3d19x1DjsYLGY77AgVuGFJpc7Ig4fo4Ohm8jKWcl7iOvflvcwoJ48taJ4+fHLm tIdGWj1Za+IZGy/XPSuZty/tFmcdO9gKYqRvPzDG4iT2AAFWgiYbCa6zQVL1QjjdchTX /dAhqFk775dJjUo5Dobt1zHOXXoUVZkJ6hLgIjZTBWg4ztB+8AewMjOpnzltJlilhwHl 0gfsMylQ001Vy1z2qGg6/HapEPCjePhuPj9OUpeXne4xp/jB1hdJ5OPPtc1GkVR/1UT0 tvLara7/TZ0N5t5aa12RyY3LEr0f/nlndfwk7+cSe1jJmoGd4KvUQAVdffshf5o07KGd CYpA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758031197; x=1758635997; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=vENfTvsqrFJ9tJyBfgLNz2mb8wc8do/WZvddYLx/2MM=; b=NG38S7WRwU3oKCNx16Mwr1oLtkTBVASGc0K1bpA8juD9FPCOjtEXIcKvelwxtjguFj KJZcgiakzFXOrmcEnFHPXwvcEvInnxu2dI9R3WCBjbf2ew/B+HGWT/6nVr6/VmWT4+hW bJWZ8xKatgR5H1YhlALuQN3Sw/rQ8KDYijqy3Nm+9v2dME+M0OazjlgmTJ6etJM9LZbL eT4I3dlSYVwpFAWFirFQ71hKSz/9xQ+H6Cyh6qvktF5xP/vkc+qsaIntyLPd8vwv62b1 J0/GEqHfI4GZs3B6v6QqAEhwxhtJkPQbRRGDLmACyhfymk9ACp5OK/dQr08ZfUCUd6up v/rA== X-Forwarded-Encrypted: i=1; AJvYcCVkmrRUt9zIyR98hv15V1qMsWhw/9VOXtFnD4QD3c/9qM8EYQdBS7Xl0YyKRqOYexcXVjCJ7sfRFpRdn4A=@vger.kernel.org X-Gm-Message-State: AOJu0Yyl4ha4Ywxv4T/YD4ctG2KFtMuVwJ92URsky+aFweLlsUXdPbdO KKPbYWzMlBpckwnHwq9FMsjjYAaT/xVjx4HEYIr/KsRbIJXQI2O9X6Vy X-Gm-Gg: ASbGncsUU1vjNaXY0QKSlv6mJCv6cWocPAbbkowx7UiGmInXKnyrXVqJH00yjBjhafl e7FHthGphOKUTKTYdLWehkjx9E7Elg+rWeQPBBPN//3RXd82GnTrr2gZHs03VWdCkoVhiILVFKK jsMvCegJG90MAqklEaDHrq/tE/UfRocEBsFAVXGP4roNvm52hMwPoFKv2GmE85CKfk5KNUMbG/W YphG0NUEtvTz4RVZYVryzKfTYDQ3t+rBcF/kMZPlfjdyExmbXf6lj99gvSbm69fzMLhEwTERQhm Xanp3x43+8DIvq/7oFy6kNihMm1Z5hp2l+nZCSnUy3UmMW1wIjexq2kUKVu4Yt+VRZ00d5xbBz0 LsRU8IZm7VVQVF5j6oepe36lUGZA5fHgh0SARC2oJr2k49BhpivDP7lAMsCtJ5kiWFPXXjhOq X-Google-Smtp-Source: AGHT+IGywKOeZnJ30E7Ud2DvguwBt7x+jM+ZimZarnO2UYCjYh4k81VYRu4VVnkSvPh9Eqb3iEJtqg== X-Received: by 2002:a05:600c:5254:b0:45f:284b:1d89 with SMTP id 5b1f17b1804b1-45f2a4f8bafmr97604315e9.25.1758031196860; Tue, 16 Sep 2025 06:59:56 -0700 (PDT) Received: from f.. (cst-prg-88-146.cust.vodafone.cz. [46.135.88.146]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3e7cde81491sm16557991f8f.42.2025.09.16.06.59.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 16 Sep 2025 06:59:56 -0700 (PDT) From: Mateusz Guzik To: brauner@kernel.org Cc: viro@zeniv.linux.org.uk, jack@suse.cz, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, josef@toxicpanda.com, kernel-team@fb.com, amir73il@gmail.com, linux-btrfs@vger.kernel.org, linux-ext4@vger.kernel.org, linux-xfs@vger.kernel.org, ceph-devel@vger.kernel.org, linux-unionfs@vger.kernel.org, Mateusz Guzik Subject: [PATCH v4 09/12] f2fs: use the new ->i_state accessors Date: Tue, 16 Sep 2025 15:58:57 +0200 Message-ID: <20250916135900.2170346-10-mjguzik@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250916135900.2170346-1-mjguzik@gmail.com> References: <20250916135900.2170346-1-mjguzik@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Change generated with coccinelle and fixed up by hand as appropriate. Signed-off-by: Mateusz Guzik --- fs/f2fs/data.c | 2 +- fs/f2fs/inode.c | 2 +- fs/f2fs/namei.c | 4 ++-- fs/f2fs/super.c | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index 7961e0ddfca3..9cc22322ce7f 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c @@ -4241,7 +4241,7 @@ static int f2fs_iomap_begin(struct inode *inode, loff= _t offset, loff_t length, =20 if (map.m_flags & F2FS_MAP_NEW) iomap->flags |=3D IOMAP_F_NEW; - if ((inode->i_state & I_DIRTY_DATASYNC) || + if ((inode_state_read_once(inode) & I_DIRTY_DATASYNC) || offset + length > i_size_read(inode)) iomap->flags |=3D IOMAP_F_DIRTY; =20 diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c index 8c4eafe9ffac..f1cda1900658 100644 --- a/fs/f2fs/inode.c +++ b/fs/f2fs/inode.c @@ -569,7 +569,7 @@ struct inode *f2fs_iget(struct super_block *sb, unsigne= d long ino) if (!inode) return ERR_PTR(-ENOMEM); =20 - if (!(inode->i_state & I_NEW)) { + if (!(inode_state_read_once(inode) & I_NEW)) { if (is_meta_ino(sbi, ino)) { f2fs_err(sbi, "inaccessible inode: %lu, run fsck to repair", ino); set_sbi_flag(sbi, SBI_NEED_FSCK); diff --git a/fs/f2fs/namei.c b/fs/f2fs/namei.c index b882771e4699..7d977b80bae5 100644 --- a/fs/f2fs/namei.c +++ b/fs/f2fs/namei.c @@ -844,7 +844,7 @@ static int __f2fs_tmpfile(struct mnt_idmap *idmap, stru= ct inode *dir, f2fs_i_links_write(inode, false); =20 spin_lock(&inode->i_lock); - inode->i_state |=3D I_LINKABLE; + inode_state_add(inode, I_LINKABLE); spin_unlock(&inode->i_lock); } else { if (file) @@ -1057,7 +1057,7 @@ static int f2fs_rename(struct mnt_idmap *idmap, struc= t inode *old_dir, goto put_out_dir; =20 spin_lock(&whiteout->i_lock); - whiteout->i_state &=3D ~I_LINKABLE; + inode_state_del(whiteout, I_LINKABLE); spin_unlock(&whiteout->i_lock); =20 iput(whiteout); diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index 2045642cfe3b..d8db9a4084fa 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c @@ -1747,7 +1747,7 @@ static int f2fs_drop_inode(struct inode *inode) * - f2fs_gc -> iput -> evict * - inode_wait_for_writeback(inode) */ - if ((!inode_unhashed(inode) && inode->i_state & I_SYNC)) { + if ((!inode_unhashed(inode) && inode_state_read(inode) & I_SYNC)) { if (!inode->i_nlink && !is_bad_inode(inode)) { /* to avoid evict_inode call simultaneously */ __iget(inode); --=20 2.43.0 From nobody Thu Oct 2 13:01:34 2025 Received: from mail-wm1-f43.google.com (mail-wm1-f43.google.com [209.85.128.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BF62F3570C3 for ; Tue, 16 Sep 2025 14:00:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758031204; cv=none; b=YYMEDPu6s0s+r5bqw5oPfE8SNS62QEAcfB8vpa7ukcCR/gtRyaYCRPjZ5/VJm0gm7MogRRJ89VF3pWhIcVFuhr6ROEOQoASSihzispn+WQVijrxaXRFaMF4zivcKWk4UaTdcSztvWWyc0DSgPAdd3VxFwNUpCt6XmJQxdVt+KUQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758031204; c=relaxed/simple; bh=onJPCe9YqJgqvuYwKD4fnxdCGXT93MaxVU0lwENDDkI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=f8Bs3oLKlteX2GHhzg32kZIs3nP5iVGHrcaj+uk05PH7MBxwuTqzlv0UdDMqahv+o/MXBWJo20r2nSc7vpCap+6W/oMI+8jGxSv3a9mM4Kl79F7gXdJaq4XrWepNaSx1yBinLsuq35trGBNvNR5B3SsN/BiJNxnzpOk4t1Hd4Lc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=RtUt9nFp; arc=none smtp.client-ip=209.85.128.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="RtUt9nFp" Received: by mail-wm1-f43.google.com with SMTP id 5b1f17b1804b1-45dd5e24d16so52702335e9.3 for ; Tue, 16 Sep 2025 07:00:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1758031201; x=1758636001; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=9LJ4r8TF2Lv0as7EYdqZVHam471k9lVFSDN/DCiOydU=; b=RtUt9nFpd50H7wmzr0gHC58QRsJODnR+/tCPl1yNDa0OdGz8TZwvuZRtbSOYz+iZW+ DRZCQlpIZQqsRh1TqDFUvf8A899jysaa1AIkBL39A9YUUipAZgQ/yQDhj+h9Hd32NOKz VQkmEnQiDn4DOlZveL4LIkl7SHK/bFDiB5cySMs57DOXhJP5sT51HrhMkavke8tZjR/n r7GADARKaNnMQAu3ZiUCnjRubbNc3hV1pgLEosREt8hzec0AYg5f/Acjw8fivI6+3Dr+ AEFdfCHbTnv0+NKXHtM/soOzMeeqvYtV+QAalJqAgBKLJ9DnImHL1odT6uVFWuMJ5+gS gfbg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758031201; x=1758636001; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=9LJ4r8TF2Lv0as7EYdqZVHam471k9lVFSDN/DCiOydU=; b=hSTUD0fL2eW3BZLMeqMWxclar0wTUW7X1FI5fpf3m0iBo7xzvrRqCcw+S8Bl5vI/BY ny1mWV+4KezK4P+QdtGtrOuRojvk5DHtOJHSjKOstGqK/rd4qWbvglF7lPIspmwE37Kn diXVMS9u98XQA4E4bzmXkM1Spv2dey70PC/NbU6wdNC+62bEsR4/N19nbKc74U6EUVoT vrOht23mMvym84y5jBhrjM9S0yLq5ODJYZ//aUjG1Xv6Tl3S5rDu2J9Wefj+BKoS9h12 oLd2maZq42fueZPwHb8KMjld/IRpukzge86Z/rk01GGjMBPBWYunczaZPvtfuzn64Eb2 vVFA== X-Forwarded-Encrypted: i=1; AJvYcCVfZh9Jcjp8cxZWt2QJIZjanK/mRoYoj9WQNxR8Yk3TeE1CEnY6CrAag6LZFLiES+EuF1PzSQYtVc6Yd/8=@vger.kernel.org X-Gm-Message-State: AOJu0YweRyU5LOI6AKP1F5VMoor6hkvWBBZoyflxcXFTWA+VFyPIwU3g St6DeD4Hx7tb5mxE5TutBQ+1UU3Si4qkaCaew5EMyt3NBuFjCj1ANA4M X-Gm-Gg: ASbGncvEgWQaSIL6i9yTD/3yQhW0SZpw2UfT0YRZo/4G7/OF6LNvINSJAYPyzKZHxAr gGR//fEixDLM5baaG7Y1GigzC4gzdFozYlQmuHjuFPdNQ5H5ohx1I7OjOpsElyqT6TJTGtMbiYK Arf78AE5HVhD9BQQo7JQjeDmSg/zhzd2/Nms3Trz1+uEhjFjfXjYU5ayQiY3/lTZujaXbBfSEq9 pfqzpeVzuqJ45vrE8ut3ye0F13+pLOTTGFhgqjb3Nom0USze99rJc1v6e3KKD94FcP2EQYFCk9m 57W48XXTjXWfW0Xf6vmM8IOdRlSC5dx++hPvs4jjsFnckfkGnUgjthLsXtDTgNqyeMQ7Qw0YxD1 oRgx0NRqXFd67/+DumcMN0Frh/2CpVhSRJEbtPKe7p3EnhLYFJvZZkCv7tYiM9fBAc+kqxnxD X-Google-Smtp-Source: AGHT+IHYJqSjXtRyu8AlavSqqYLYRl8QcSweA/3ngpN0GUZA3qROSZnetWUBJ5Se7JCe/tV8GyTMYw== X-Received: by 2002:a05:600c:1387:b0:45b:88d6:8ddb with SMTP id 5b1f17b1804b1-45f211fc2dbmr154100195e9.37.1758031200730; Tue, 16 Sep 2025 07:00:00 -0700 (PDT) Received: from f.. (cst-prg-88-146.cust.vodafone.cz. [46.135.88.146]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3e7cde81491sm16557991f8f.42.2025.09.16.06.59.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 16 Sep 2025 07:00:00 -0700 (PDT) From: Mateusz Guzik To: brauner@kernel.org Cc: viro@zeniv.linux.org.uk, jack@suse.cz, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, josef@toxicpanda.com, kernel-team@fb.com, amir73il@gmail.com, linux-btrfs@vger.kernel.org, linux-ext4@vger.kernel.org, linux-xfs@vger.kernel.org, ceph-devel@vger.kernel.org, linux-unionfs@vger.kernel.org, Mateusz Guzik Subject: [PATCH v4 10/12] ceph: use the new ->i_state accessors Date: Tue, 16 Sep 2025 15:58:58 +0200 Message-ID: <20250916135900.2170346-11-mjguzik@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250916135900.2170346-1-mjguzik@gmail.com> References: <20250916135900.2170346-1-mjguzik@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Change generated with coccinelle and fixed up by hand as appropriate. Signed-off-by: Mateusz Guzik Reviewed-by: Viacheslav Dubeyko --- fs/ceph/cache.c | 2 +- fs/ceph/crypto.c | 4 ++-- fs/ceph/file.c | 4 ++-- fs/ceph/inode.c | 28 ++++++++++++++-------------- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/fs/ceph/cache.c b/fs/ceph/cache.c index 930fbd54d2c8..f678bab189d8 100644 --- a/fs/ceph/cache.c +++ b/fs/ceph/cache.c @@ -26,7 +26,7 @@ void ceph_fscache_register_inode_cookie(struct inode *ino= de) return; =20 /* Only new inodes! */ - if (!(inode->i_state & I_NEW)) + if (!(inode_state_read_once(inode) & I_NEW)) return; =20 WARN_ON_ONCE(ci->netfs.cache); diff --git a/fs/ceph/crypto.c b/fs/ceph/crypto.c index 7026e794813c..928746b92512 100644 --- a/fs/ceph/crypto.c +++ b/fs/ceph/crypto.c @@ -329,7 +329,7 @@ int ceph_encode_encrypted_dname(struct inode *parent, c= har *buf, int elen) out: kfree(cryptbuf); if (dir !=3D parent) { - if ((dir->i_state & I_NEW)) + if ((inode_state_read_once(dir) & I_NEW)) discard_new_inode(dir); else iput(dir); @@ -438,7 +438,7 @@ int ceph_fname_to_usr(const struct ceph_fname *fname, s= truct fscrypt_str *tname, fscrypt_fname_free_buffer(&_tname); out_inode: if (dir !=3D fname->dir) { - if ((dir->i_state & I_NEW)) + if ((inode_state_read_once(dir) & I_NEW)) discard_new_inode(dir); else iput(dir); diff --git a/fs/ceph/file.c b/fs/ceph/file.c index c02f100f8552..59f2be41c9aa 100644 --- a/fs/ceph/file.c +++ b/fs/ceph/file.c @@ -744,7 +744,7 @@ static int ceph_finish_async_create(struct inode *dir, = struct inode *inode, vino.ino, ceph_ino(dir), dentry->d_name.name); ceph_dir_clear_ordered(dir); ceph_init_inode_acls(inode, as_ctx); - if (inode->i_state & I_NEW) { + if (inode_state_read_once(inode) & I_NEW) { /* * If it's not I_NEW, then someone created this before * we got here. Assume the server is aware of it at @@ -907,7 +907,7 @@ int ceph_atomic_open(struct inode *dir, struct dentry *= dentry, new_inode =3D NULL; goto out_req; } - WARN_ON_ONCE(!(new_inode->i_state & I_NEW)); + WARN_ON_ONCE(!(inode_state_read_once(new_inode) & I_NEW)); =20 spin_lock(&dentry->d_lock); di->flags |=3D CEPH_DENTRY_ASYNC_CREATE; diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c index 480cb3a1d639..6786ec955a87 100644 --- a/fs/ceph/inode.c +++ b/fs/ceph/inode.c @@ -86,7 +86,7 @@ struct inode *ceph_new_inode(struct inode *dir, struct de= ntry *dentry, goto out_err; } =20 - inode->i_state =3D 0; + inode_state_set_raw(inode, 0); inode->i_mode =3D *mode; =20 err =3D ceph_security_init_secctx(dentry, *mode, as_ctx); @@ -155,7 +155,7 @@ struct inode *ceph_get_inode(struct super_block *sb, st= ruct ceph_vino vino, =20 doutc(cl, "on %llx=3D%llx.%llx got %p new %d\n", ceph_present_inode(inode), ceph_vinop(inode), inode, - !!(inode->i_state & I_NEW)); + !!(inode_state_read_once(inode) & I_NEW)); return inode; } =20 @@ -182,7 +182,7 @@ struct inode *ceph_get_snapdir(struct inode *parent) goto err; } =20 - if (!(inode->i_state & I_NEW) && !S_ISDIR(inode->i_mode)) { + if (!(inode_state_read_once(inode) & I_NEW) && !S_ISDIR(inode->i_mode)) { pr_warn_once_client(cl, "bad snapdir inode type (mode=3D0%o)\n", inode->i_mode); goto err; @@ -215,7 +215,7 @@ struct inode *ceph_get_snapdir(struct inode *parent) } } #endif - if (inode->i_state & I_NEW) { + if (inode_state_read_once(inode) & I_NEW) { inode->i_op =3D &ceph_snapdir_iops; inode->i_fop =3D &ceph_snapdir_fops; ci->i_snap_caps =3D CEPH_CAP_PIN; /* so we can open */ @@ -224,7 +224,7 @@ struct inode *ceph_get_snapdir(struct inode *parent) =20 return inode; err: - if ((inode->i_state & I_NEW)) + if ((inode_state_read_once(inode) & I_NEW)) discard_new_inode(inode); else iput(inode); @@ -698,7 +698,7 @@ void ceph_evict_inode(struct inode *inode) =20 netfs_wait_for_outstanding_io(inode); truncate_inode_pages_final(&inode->i_data); - if (inode->i_state & I_PINNING_NETFS_WB) + if (inode_state_read_once(inode) & I_PINNING_NETFS_WB) ceph_fscache_unuse_cookie(inode, true); clear_inode(inode); =20 @@ -967,7 +967,7 @@ int ceph_fill_inode(struct inode *inode, struct page *l= ocked_page, le64_to_cpu(info->version), ci->i_version); =20 /* Once I_NEW is cleared, we can't change type or dev numbers */ - if (inode->i_state & I_NEW) { + if (inode_state_read_once(inode) & I_NEW) { inode->i_mode =3D mode; } else { if (inode_wrong_type(inode, mode)) { @@ -1044,7 +1044,7 @@ int ceph_fill_inode(struct inode *inode, struct page = *locked_page, =20 #ifdef CONFIG_FS_ENCRYPTION if (iinfo->fscrypt_auth_len && - ((inode->i_state & I_NEW) || (ci->fscrypt_auth_len =3D=3D 0))) { + ((inode_state_read_once(inode) & I_NEW) || (ci->fscrypt_auth_len =3D= =3D 0))) { kfree(ci->fscrypt_auth); ci->fscrypt_auth_len =3D iinfo->fscrypt_auth_len; ci->fscrypt_auth =3D iinfo->fscrypt_auth; @@ -1638,13 +1638,13 @@ int ceph_fill_trace(struct super_block *sb, struct = ceph_mds_request *req) pr_err_client(cl, "badness %p %llx.%llx\n", in, ceph_vinop(in)); req->r_target_inode =3D NULL; - if (in->i_state & I_NEW) + if (inode_state_read_once(in) & I_NEW) discard_new_inode(in); else iput(in); goto done; } - if (in->i_state & I_NEW) + if (inode_state_read_once(in) & I_NEW) unlock_new_inode(in); } =20 @@ -1830,11 +1830,11 @@ static int readdir_prepopulate_inodes_only(struct c= eph_mds_request *req, pr_err_client(cl, "inode badness on %p got %d\n", in, rc); err =3D rc; - if (in->i_state & I_NEW) { + if (inode_state_read_once(in) & I_NEW) { ihold(in); discard_new_inode(in); } - } else if (in->i_state & I_NEW) { + } else if (inode_state_read_once(in) & I_NEW) { unlock_new_inode(in); } =20 @@ -2046,7 +2046,7 @@ int ceph_readdir_prepopulate(struct ceph_mds_request = *req, pr_err_client(cl, "badness on %p %llx.%llx\n", in, ceph_vinop(in)); if (d_really_is_negative(dn)) { - if (in->i_state & I_NEW) { + if (inode_state_read_once(in) & I_NEW) { ihold(in); discard_new_inode(in); } @@ -2056,7 +2056,7 @@ int ceph_readdir_prepopulate(struct ceph_mds_request = *req, err =3D ret; goto next_item; } - if (in->i_state & I_NEW) + if (inode_state_read_once(in) & I_NEW) unlock_new_inode(in); =20 if (d_really_is_negative(dn)) { --=20 2.43.0 From nobody Thu Oct 2 13:01:34 2025 Received: from mail-wm1-f41.google.com (mail-wm1-f41.google.com [209.85.128.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3F69F35FC0C for ; Tue, 16 Sep 2025 14:00:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758031209; cv=none; b=Z+3mFHnUi4jbXfrdWDVyQGiyqXcYP/vjI2A557hU56xDT2hMWzBUUC5X7Fr5wM6Mcm+BhBLmFrvgFO5mVxcC0u+ljZv6EOrLwitvyd/Mx3ZrRcThk0nModufLAw0qfoNzG2cjE/8iEBe32gIrmnWKHNw6J53dsAGeHXsKACWjB8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758031209; c=relaxed/simple; bh=9uB5tIoSu0Ihqwy/dzzpF33dCVQXqPEjiR4jiBdlE6Y=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=CUQUyeOr7oRxDO2aBnK1+WdYiBekb7ZhbXEDkYrCoV/7ndUP1d1bmQ9N/yihRu1A11QUuYeHwv4i5YAL6A49WEKr/JWXXIv6Qh7yfQSbL/9cXQu0C9rJEzMsnILIfzF7hJtPL2za7FEePQAdlhufXKdcRfhMP2+xj4nvnxaIBJI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=lxR8ybYu; arc=none smtp.client-ip=209.85.128.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="lxR8ybYu" Received: by mail-wm1-f41.google.com with SMTP id 5b1f17b1804b1-45b9a856dc2so34723715e9.0 for ; Tue, 16 Sep 2025 07:00:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1758031204; x=1758636004; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=0jXBWCescUObzsT6Su0exTy7Btg138NHvbE5HLT4Jeo=; b=lxR8ybYuXYa9qNaTZ+hqKLsxR/u6BY6zzV/gtp4yDl4JzRW+ztA7qdJaNySrU8LmcZ +FSmJWBbnjLDWgyo81qjnG8LLkp49YRNdYlJqvcNLp1+zhsno83coVbLSowVmYzeurvP XsYd6YlG2dkp1qWYP1If5nmE0BPIBxlP6+3WVOfS6fWAMuJASV8e6HHvYe6qc7kxCtMz 5HAaBdC8JUnGb9Wy/Tj8Fc6l2KcFMwegRHdlBFMG2gPhJIngXhaUXjdOvXzJA8ybaSYe J3/HVLwK1FojmIoSbCzAg99/Fl9poOSdGL8rtQSt6SG5a0ebPl6+1AKIxIWjjcXLmRom jeCA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758031204; x=1758636004; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=0jXBWCescUObzsT6Su0exTy7Btg138NHvbE5HLT4Jeo=; b=KbUnCSdQgW6OMLdYSjEUtil3GzZCiF+qM8wstAxqijoIZaPsODWeeNurNx3UuMQjVi VSONEWpAL0zjaCNW+GX1c4WHbHZY1BNChYQ7+0wZqHi8qLgo2wLt3HfLdLRlX4l7eEH0 FvGJndKBibnX9EwrsSsS16x1zYI5FUYZrS3pNKKojXJMAwKgXgyEVVkHYXmPHZOYSnou IucMnlE9iGf/L7I6iiVBDJivJhAwM+tE1Eqaw1FX94pww7hqC7iikx6R3bDXlNuSe24k YksksTzOlOGefDPXZoyIr5iPTiotcFosIEJXNX1taAo9Im1faH7d0bXWW8/9DsFhMR1W l/KQ== X-Forwarded-Encrypted: i=1; AJvYcCWYOmO0v0m/KfywVdtsYn2Gp6KKGDzT1omh0vDpwU/o2ltuoSjo2M5HgP+SBu8VPSqa07QbDOHbsPmA13A=@vger.kernel.org X-Gm-Message-State: AOJu0YyRmrgfnKBjVIniZgS+YQQGgSkXsb1tWIi9aEriY87QpGyIRwFR ektYha9ufaG1DY//P1foo0CHYpv8asyHggIcPr+J9S3+H2dHBeU+sxNa X-Gm-Gg: ASbGncuIUXBAVACMa3pdm3PCYV/GAIyKANtdzVsQMjLmxFHohBsUCgrJTwTHpc6Z0iw TuQqdBTMXb4hdHNocR7K5CRFVaq+uag3hlDqIZRqTMZUvKHcWOEDEQsP1akgQws2Ose9BM/73yj ffDOlPm4WaRGtLrwNdPwzXzGEyIqpj7SDGCmd7Hc4hUthYnpboNEHVRtHMTwMmsmAiqjcMaGY2n iLmKFf3U4ih+PvlK8rWDiRtvPnced7saHhL+0HVPMyCI1Xw0Bd8hbwnnTuGNvr2EtJISbgUWAEq ZriksDB7oIOAGC6dyUFvtflcmQsDfqRMg46rUiH9/Hfc4Zz7bh5NU5f0N7IUipAHLVCAtxVHSes Md6RcXqg5XCyuiZe4JT4XLEPHIthHJFbLVRXosUs2DLKM729UcMv2UDx37ZPfEZKdcVq8KOuE X-Google-Smtp-Source: AGHT+IHwPsVwzVQ+3BwThlohyBuVsh7mtJyWbIwjAmCzyS+IiOJcg7GYx0sFvI9t/faLf/pLubt0LQ== X-Received: by 2002:a05:600c:190f:b0:45b:4282:7b60 with SMTP id 5b1f17b1804b1-460614f9f91mr11287815e9.34.1758031204161; Tue, 16 Sep 2025 07:00:04 -0700 (PDT) Received: from f.. (cst-prg-88-146.cust.vodafone.cz. [46.135.88.146]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3e7cde81491sm16557991f8f.42.2025.09.16.07.00.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 16 Sep 2025 07:00:03 -0700 (PDT) From: Mateusz Guzik To: brauner@kernel.org Cc: viro@zeniv.linux.org.uk, jack@suse.cz, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, josef@toxicpanda.com, kernel-team@fb.com, amir73il@gmail.com, linux-btrfs@vger.kernel.org, linux-ext4@vger.kernel.org, linux-xfs@vger.kernel.org, ceph-devel@vger.kernel.org, linux-unionfs@vger.kernel.org, Mateusz Guzik Subject: [PATCH v4 11/12] overlayfs: use the new ->i_state accessors Date: Tue, 16 Sep 2025 15:58:59 +0200 Message-ID: <20250916135900.2170346-12-mjguzik@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250916135900.2170346-1-mjguzik@gmail.com> References: <20250916135900.2170346-1-mjguzik@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Change generated with coccinelle and fixed up by hand as appropriate. Signed-off-by: Mateusz Guzik --- fs/overlayfs/dir.c | 2 +- fs/overlayfs/inode.c | 6 +++--- fs/overlayfs/util.c | 10 +++++----- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/fs/overlayfs/dir.c b/fs/overlayfs/dir.c index 70b8687dc45e..eb3419c25dfc 100644 --- a/fs/overlayfs/dir.c +++ b/fs/overlayfs/dir.c @@ -659,7 +659,7 @@ static int ovl_create_object(struct dentry *dentry, int= mode, dev_t rdev, goto out_drop_write; =20 spin_lock(&inode->i_lock); - inode->i_state |=3D I_CREATING; + inode_state_add(inode, I_CREATING); spin_unlock(&inode->i_lock); =20 inode_init_owner(&nop_mnt_idmap, inode, dentry->d_parent->d_inode, mode); diff --git a/fs/overlayfs/inode.c b/fs/overlayfs/inode.c index ecb9f2019395..3f7ef3dae5e5 100644 --- a/fs/overlayfs/inode.c +++ b/fs/overlayfs/inode.c @@ -1149,7 +1149,7 @@ struct inode *ovl_get_trap_inode(struct super_block *= sb, struct dentry *dir) if (!trap) return ERR_PTR(-ENOMEM); =20 - if (!(trap->i_state & I_NEW)) { + if (!(inode_state_read_once(trap) & I_NEW)) { /* Conflicting layer roots? */ iput(trap); return ERR_PTR(-ELOOP); @@ -1240,7 +1240,7 @@ struct inode *ovl_get_inode(struct super_block *sb, inode =3D ovl_iget5(sb, oip->newinode, key); if (!inode) goto out_err; - if (!(inode->i_state & I_NEW)) { + if (!(inode_state_read_once(inode) & I_NEW)) { /* * Verify that the underlying files stored in the inode * match those in the dentry. @@ -1299,7 +1299,7 @@ struct inode *ovl_get_inode(struct super_block *sb, if (upperdentry) ovl_check_protattr(inode, upperdentry); =20 - if (inode->i_state & I_NEW) + if (inode_state_read_once(inode) & I_NEW) unlock_new_inode(inode); out: return inode; diff --git a/fs/overlayfs/util.c b/fs/overlayfs/util.c index a33115e7384c..cfc7a7b00fba 100644 --- a/fs/overlayfs/util.c +++ b/fs/overlayfs/util.c @@ -1019,8 +1019,8 @@ bool ovl_inuse_trylock(struct dentry *dentry) bool locked =3D false; =20 spin_lock(&inode->i_lock); - if (!(inode->i_state & I_OVL_INUSE)) { - inode->i_state |=3D I_OVL_INUSE; + if (!(inode_state_read(inode) & I_OVL_INUSE)) { + inode_state_add(inode, I_OVL_INUSE); locked =3D true; } spin_unlock(&inode->i_lock); @@ -1034,8 +1034,8 @@ void ovl_inuse_unlock(struct dentry *dentry) struct inode *inode =3D d_inode(dentry); =20 spin_lock(&inode->i_lock); - WARN_ON(!(inode->i_state & I_OVL_INUSE)); - inode->i_state &=3D ~I_OVL_INUSE; + WARN_ON(!(inode_state_read(inode) & I_OVL_INUSE)); + inode_state_del(inode, I_OVL_INUSE); spin_unlock(&inode->i_lock); } } @@ -1046,7 +1046,7 @@ bool ovl_is_inuse(struct dentry *dentry) bool inuse; =20 spin_lock(&inode->i_lock); - inuse =3D (inode->i_state & I_OVL_INUSE); + inuse =3D (inode_state_read(inode) & I_OVL_INUSE); spin_unlock(&inode->i_lock); =20 return inuse; --=20 2.43.0 From nobody Thu Oct 2 13:01:34 2025 Received: from mail-wm1-f50.google.com (mail-wm1-f50.google.com [209.85.128.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 26429368090 for ; Tue, 16 Sep 2025 14:00:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758031211; cv=none; b=b6xcrC1HMCWdrOI1TvK1cdNaA501HxmRmQ/npLsXp2E0X26NunHyWLzgek1KOtIiBEN499IgBcSFxLLWzSQlvM0ipB2+v7Zw5gREO/QSMdgDuDg6iG3R8o+1xZZH/mPINNs4uAi9CtveoGr2Z8ttuE595+4EpL+bBFCM8PTbP1w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758031211; c=relaxed/simple; bh=QCGFM/cnMeWMX3htX5p6eryZx4ChTW6raUZie6Xkq4o=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bN3EnUVimo/B1BDp8NEepm9o7Piv7bF87AVIHXEMhIKFIZtl5dIMay1YnkE4g+iE55JMPDgtsSdthxtXQltBwUPmDkHNY51YJY+pAgqcNdiVqQgqjGgtEjfv6nj8YCW68+/n6zC4n0spY5LKEAMsrKFIOYnQDSn5Ozk9y4cXzMI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=L3nhuz8Z; arc=none smtp.client-ip=209.85.128.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="L3nhuz8Z" Received: by mail-wm1-f50.google.com with SMTP id 5b1f17b1804b1-45dd5e24d16so52703705e9.3 for ; Tue, 16 Sep 2025 07:00:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1758031208; x=1758636008; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=F3p/HZf12MlzeyzMfr2O5f/PDaT3y6+eiNIS1WtKNH8=; b=L3nhuz8Z9oR2kJSqns3xH/4NNgB63DxIRTaNe5oIxa1VLEVdkRdB/o3wev4JT9FNev eYpTXmtMWdeLljSdxJ79OLMkhJkiqrc6h7LHAZW+X5s3QVxcasSgLD7hAUeJrGRLubrB rulGsgIDFkzQK+2p9g4U8tVgIq95EgJGWBcjRk5IWOXboTPeJq5Wl8CIcLDDTCttURg+ Z/kpRYpJML9Zm7dCljBFAix9m7eNOll6G7VSP+j67BxEW1aC/WZ7ZjSMe8UMq+FpcsCJ Gpseb7IWms7Lemr8sJ3X2y84OXx4aqfDuLL8yMdr7v3hdlC3zgsgY4glFyVdW2zXXK2M b5dA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758031208; x=1758636008; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=F3p/HZf12MlzeyzMfr2O5f/PDaT3y6+eiNIS1WtKNH8=; b=G4N5NAPnEUvjIgOCwbQNgmMrUpLV20EA1Z2KM2RByvJqQEvzgPx83kVfTkOZsfe36Z 2nm9FUpHRmrKxqbCS3oBxN7jbPHnfhxJgT9aJ+RONi+RW9vJNua5Ma+5mjy7btfz5BPz A4E62p2E6Si3SHAqmUWIArSTF6GvgdfaW1ZYc5BEUlcXV9Gc7dvvYSwbYcRsPsbffvi0 CKr5KopzcL/geBzGYb7rSXKzIJljADoXO/FFOtbvxsusT7mJMxD5tn6PEYRQawagvM9R WZWH797niacVW7BTH+kKP0Z1k1pn9gpmja2xHWMEEqWt4PpPeEeSYNEghRQ1Kjevvf4a tqgQ== X-Forwarded-Encrypted: i=1; AJvYcCWj1HfEzHXUMjOb7qBvI5SwobB0E3snpwP0V5k27/il7XpGXuP6OIqvBuGUWHsCoR1q1yE5ncigYj2GHU8=@vger.kernel.org X-Gm-Message-State: AOJu0YzhLYpOT3A+XPMxoMqo8dRC4yvgwERnbMH/4255m2qnuD+RNaXH fpNVQi41dANv4LYXZReI2MCRFjJXkEHbzelN46dHTazypNXmNLelohB5gACRzzpa X-Gm-Gg: ASbGncuFtbbXZqddBYaCVoGrW28xBQ7rBg3Z15EPmVFTXJAWraTvzdmGzR6EJ8UQrOz 5vfnO9mP+2taPHthTyCYCodCaUs7O8CZpRJE9i8q3m/6364hbu5PCux62HOwFG23c2Heq6GR3x2 DeUUiHdI/UUx7r+YX4+WEmMzB1eNd54aNakwqknlLIm9NC2B3PkxDOA6rSxORJM5SBgi5ZTGpwh OimjxDGUEjckZFZBXD8O1h6gZ03ozoHiK/xFD8kw/MvD8HSW6S8xy31dP6o4zMRz3mtzkqRRvZP jOB8IfwkS9+hwejkclOSUlViMaEPSrf/13iWPWY7DuijepgvJs53dcVCfBMcs45nprjHnI3FAsR Ltz5bEvltrMYv4Vew2s74UkFn5ziXi0p3nFtlXOlFD+BTyA9vUnec0fZx0jlXbDaIbZjNJa8/ X-Google-Smtp-Source: AGHT+IG3ojTnTVy1hdNr03FmdV6E3sTeXWaDybJz1f1E1nvEGmI8CA+2Pel84ZsC9/O7zHxZywZmtw== X-Received: by 2002:a05:600c:5246:b0:459:e025:8c40 with SMTP id 5b1f17b1804b1-45f211c8aa9mr181401305e9.10.1758031208380; Tue, 16 Sep 2025 07:00:08 -0700 (PDT) Received: from f.. (cst-prg-88-146.cust.vodafone.cz. [46.135.88.146]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3e7cde81491sm16557991f8f.42.2025.09.16.07.00.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 16 Sep 2025 07:00:07 -0700 (PDT) From: Mateusz Guzik To: brauner@kernel.org Cc: viro@zeniv.linux.org.uk, jack@suse.cz, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, josef@toxicpanda.com, kernel-team@fb.com, amir73il@gmail.com, linux-btrfs@vger.kernel.org, linux-ext4@vger.kernel.org, linux-xfs@vger.kernel.org, ceph-devel@vger.kernel.org, linux-unionfs@vger.kernel.org, Mateusz Guzik Subject: [PATCH v4 12/12] fs: make plain ->i_state access fail to compile Date: Tue, 16 Sep 2025 15:59:00 +0200 Message-ID: <20250916135900.2170346-13-mjguzik@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250916135900.2170346-1-mjguzik@gmail.com> References: <20250916135900.2170346-1-mjguzik@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" ... to make sure all accesses are properly validated. Merely renaming the var to __i_state still lets the compiler make the following suggestion: error: 'struct inode' has no member named 'i_state'; did you mean '__i_stat= e'? Unfortunately some people will add the __'s and call it a day. In order to make it harder to mess up in this way, hide it behind a struct. The resulting error message should be convincing in terms of checking what to do: error: invalid operands to binary & (have 'struct inode_state_flags' and 'i= nt') Of course people determined to do a plain access can still do it, but nothing can be done for that case. Signed-off-by: Mateusz Guzik --- include/linux/fs.h | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/include/linux/fs.h b/include/linux/fs.h index 11eef4ef5ace..80c53af7bc5a 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -782,6 +782,13 @@ enum inode_state_flags_enum { #define I_DIRTY (I_DIRTY_INODE | I_DIRTY_PAGES) #define I_DIRTY_ALL (I_DIRTY | I_DIRTY_TIME) =20 +/* + * Use inode_state_read() & friends to access. + */ +struct inode_state_flags { + enum inode_state_flags_enum __state; +}; + /* * Keep mostly read-only and often accessed (especially for * the RCU path lookup and 'stat' data) fields at the beginning @@ -840,7 +847,7 @@ struct inode { #endif =20 /* Misc */ - enum inode_state_flags_enum i_state; + struct inode_state_flags i_state; /* 32-bit hole */ struct rw_semaphore i_rwsem; =20 @@ -906,19 +913,19 @@ struct inode { */ static inline enum inode_state_flags_enum inode_state_read_once(struct ino= de *inode) { - return READ_ONCE(inode->i_state); + return READ_ONCE(inode->i_state.__state); } =20 static inline enum inode_state_flags_enum inode_state_read(struct inode *i= node) { lockdep_assert_held(&inode->i_lock); - return inode->i_state; + return inode->i_state.__state; } =20 static inline void inode_state_add_raw(struct inode *inode, enum inode_state_flags_enum addflags) { - WRITE_ONCE(inode->i_state, inode->i_state | addflags); + WRITE_ONCE(inode->i_state.__state, inode->i_state.__state | addflags); } =20 static inline void inode_state_add(struct inode *inode, @@ -931,7 +938,7 @@ static inline void inode_state_add(struct inode *inode, static inline void inode_state_del_raw(struct inode *inode, enum inode_state_flags_enum delflags) { - WRITE_ONCE(inode->i_state, inode->i_state & ~delflags); + WRITE_ONCE(inode->i_state.__state, inode->i_state.__state & ~delflags); } =20 static inline void inode_state_del(struct inode *inode, @@ -944,7 +951,7 @@ static inline void inode_state_del(struct inode *inode, static inline void inode_state_set_raw(struct inode *inode, enum inode_state_flags_enum setflags) { - WRITE_ONCE(inode->i_state, setflags); + WRITE_ONCE(inode->i_state.__state, setflags); } =20 static inline void inode_state_set(struct inode *inode, --=20 2.43.0