Re: [PATCH v11 1/5] fs: add iput_if_not_last() helper

From: Zhou, Yun

Date: Thu Jul 02 2026 - 09:38:25 EST


Hi Honza,

On 6/30/2026 7:34 PM, Jan Kara wrote:
On Tue 30-06-26 11:05:50, Mateusz Guzik wrote:
On Mon, Jun 29, 2026 at 07:08:44PM +0800, Yun Zhou wrote:
Unlike iput_not_last() which BUG_ON's if called with the last ref,
this variant is designed to be called speculatively.

Signed-off-by: Yun Zhou <yun.zhou@xxxxxxxxxxxxx>
Suggested-by: Jan Kara <jack@xxxxxxx>
Reviewed-by: Jan Kara <jack@xxxxxxx>
---
include/linux/fs.h | 13 +++++++++++++
1 file changed, 13 insertions(+)

diff --git a/include/linux/fs.h b/include/linux/fs.h
index d10897b3a1e3..04f0de78fa7a 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -2413,6 +2413,19 @@ static inline void super_set_sysfs_name_generic(struct super_block *sb, const ch
extern void ihold(struct inode * inode);
extern void iput(struct inode *);
void iput_not_last(struct inode *);
+
+/**
+ * iput_if_not_last - drop an inode reference only if it is not the last one
+ * @inode: inode to put
+ *
+ * Returns true if the reference was dropped, false if this was the last
+ * reference and the caller must arrange for final iput() in a safe context.
+ */
+static inline bool __must_check iput_if_not_last(struct inode *inode)
+{
+ return atomic_add_unless(&inode->i_count, -1, 1);
+}
+

This still could assert on the count, for example:
VFS_BUG_ON_INODE(inode_state_read_once(inode) & (I_FREEING | I_CLEAR), inode);
VFS_BUG_ON_INODE(atomic_read(&inode->i_count) < 1, inode);

Yes, it makes sense to be consistent with other helpers. Thanks for the
idea.

Should I wait for now, or go ahead and include the two macros mentioned
above in v13 as Mateusz suggested? As you know, the v12 series has been fully reviewed [1] , and I'm wondering if making this change now might cause any inconvenience to everyone.

[1] https://lore.kernel.org/linux-ext4/20260630100829.1257618-1-yun.zhou@xxxxxxxxxxxxx/T/#t