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