Hi Greg,

On Mon, 2020-05-25 at 13:47 +0800, Ian Kent wrote:
> @@ -189,9 +189,9 @@ int kernfs_iop_getattr(const struct path *path,
> struct kstat *stat,
>       struct inode *inode = d_inode(path->dentry);
>       struct kernfs_node *kn = inode->i_private;
>  
> -     mutex_lock(&kernfs_mutex);
> +     down_read(&kernfs_rwsem);
>       kernfs_refresh_inode(kn, inode);
> -     mutex_unlock(&kernfs_mutex);
> +     up_read(&kernfs_rwsem);
>  
>       generic_fillattr(inode, stat);
>       return 0;
> @@ -281,9 +281,9 @@ int kernfs_iop_permission(struct inode *inode,
> int mask)
>  
>       kn = inode->i_private;
>  
> -     mutex_lock(&kernfs_mutex);
> +     down_read(&kernfs_rwsem);
>       kernfs_refresh_inode(kn, inode);
> -     mutex_unlock(&kernfs_mutex);
> +     up_read(&kernfs_rwsem);
>  
>       return generic_permission(inode, mask);
>  }

I changed these from a write lock to a read lock late in the
development.

But kernfs_refresh_inode() modifies the inode so I think I should
have taken the inode lock as well as taking the read lock.

I'll look again but a second opinion (anyone) would be welcome.

Ian

Reply via email to