Re: [PATCH v7 11/14] overlayfs: use the new ->i_state accessors

Jan Kara
2025-10-10T14:18:21Z

On Thu 09-10-25 09:59:25, Mateusz Guzik wrote:
> Change generated with coccinelle and fixed up by hand as appropriate.
>
> Signed-off-by: Mateusz Guzik <mjguzik@gmail.com>

Looks good. Feel free to add:

Reviewed-by: Jan Kara <jack@suse.cz>

Honza

> ---
>
> cheat sheet:
>
> If ->i_lock is held, then:
>
> state = inode->i_state => state = inode_state_read(inode)
> inode->i_state |= (I_A | I_B) => inode_state_set(inode, I_A | I_B)
> inode->i_state &= ~(I_A | I_B) => inode_state_clear(inode, I_A | I_B)
> inode->i_state = I_A | I_B => inode_state_assign(inode, I_A | I_B)
>
> If ->i_lock is not held or only held conditionally:
>
> state = inode->i_state => state = inode_state_read_once(inode)
> inode->i_state |= (I_A | I_B) => inode_state_set_raw(inode, I_A | I_B)
> inode->i_state &= ~(I_A | I_B) => inode_state_clear_raw(inode, I_A | I_B)
> inode->i_state = I_A | I_B => inode_state_assign_raw(inode, I_A | I_B)
>
> 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 a5e9ddf3023b..83b955a1d55c 100644
> --- a/fs/overlayfs/dir.c
> +++ b/fs/overlayfs/dir.c
> @@ -686,7 +686,7 @@ static int ovl_create_object(struct dentry *dentry, int mode, dev_t rdev,
> goto out_drop_write;
>
> spin_lock(&inode->i_lock);
> - inode->i_state |= I_CREATING;
> + inode_state_set(inode, I_CREATING);
> spin_unlock(&inode->i_lock);
>
> 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 aaa4cf579561..b7938dd43b95 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);
>
> - 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 = 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.
> @@ -1300,7 +1300,7 @@ struct inode *ovl_get_inode(struct super_block *sb,
> if (upperdentry)
> ovl_check_protattr(inode, upperdentry);
>
> - 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 f76672f2e686..2da1c035f716 100644
> --- a/fs/overlayfs/util.c
> +++ b/fs/overlayfs/util.c
> @@ -1019,8 +1019,8 @@ bool ovl_inuse_trylock(struct dentry *dentry)
> bool locked = false;
>
> spin_lock(&inode->i_lock);
> - if (!(inode->i_state & I_OVL_INUSE)) {
> - inode->i_state |= I_OVL_INUSE;
> + if (!(inode_state_read(inode) & I_OVL_INUSE)) {
> + inode_state_set(inode, I_OVL_INUSE);
> locked = true;
> }
> spin_unlock(&inode->i_lock);
> @@ -1034,8 +1034,8 @@ void ovl_inuse_unlock(struct dentry *dentry)
> struct inode *inode = d_inode(dentry);
>
> spin_lock(&inode->i_lock);
> - WARN_ON(!(inode->i_state & I_OVL_INUSE));
> - inode->i_state &= ~I_OVL_INUSE;
> + WARN_ON(!(inode_state_read(inode) & I_OVL_INUSE));
> + inode_state_clear(inode, I_OVL_INUSE);
> spin_unlock(&inode->i_lock);
> }
> }
> @@ -1046,7 +1046,7 @@ bool ovl_is_inuse(struct dentry *dentry)
> bool inuse;
>
> spin_lock(&inode->i_lock);
> - inuse = (inode->i_state & I_OVL_INUSE);
> + inuse = (inode_state_read(inode) & I_OVL_INUSE);
> spin_unlock(&inode->i_lock);
>
> return inuse;
> --
> 2.34.1
>
--
Jan Kara <jack@suse.com>
SUSE Labs, CR