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

Mateusz Guzik posted 14 patches 2 months, 1 week ago
[PATCH v7 11/14] overlayfs: use the new ->i_state accessors
Posted by Mateusz Guzik 2 months, 1 week ago
Change generated with coccinelle and fixed up by hand as appropriate.

Signed-off-by: Mateusz Guzik <mjguzik@gmail.com>
---

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
Re: [PATCH v7 11/14] overlayfs: use the new ->i_state accessors
Posted by Jan Kara 2 months, 1 week ago
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