From: Eric W. Biederman <ebiederm@xxxxxxxxxxxxxxxxxx> The way the vfs is structured only calls to the filesystem methods actually update the vfs inode. We add to the normal number of places where the vfs inode is updated by also updating the vfs inode in sysfs_refresh_inode. Grabbing the inode mutex in sysfs_permission and sysfs_getattr causes deadlocks, because somtimes those operations are called with the inode mutex held, but not always. Therefore we can not depend upon the inode mutex to serialize all updates to the vfs inode. We take the sysfs_mutex in all of those places so we can also use it to protect the vfs inode. To accomplish that we simply requires extending the vfs inode in sysfs_setattr over inode_change_ok (so we have an unchanging inode when we perform the check), and inode_setattr. Signed-off-by: Eric W. Biederman <ebiederm@xxxxxxxxxxxxxxxxxx> --- fs/sysfs/inode.c | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) diff --git a/fs/sysfs/inode.c b/fs/sysfs/inode.c index 220b758..104cbc1 100644 --- a/fs/sysfs/inode.c +++ b/fs/sysfs/inode.c @@ -112,20 +112,20 @@ int sysfs_setattr(struct dentry *dentry, struct iattr *iattr) if (!sd) return -EINVAL; + mutex_lock(&sysfs_mutex); error = inode_change_ok(inode, iattr); if (error) - return error; + goto out; iattr->ia_valid &= ~ATTR_SIZE; /* ignore size changes */ error = inode_setattr(inode, iattr); if (error) - return error; + goto out; - mutex_lock(&sysfs_mutex); error = sysfs_sd_setattr(sd, iattr); +out: mutex_unlock(&sysfs_mutex); - return error; } -- 1.6.5.2.143.g8cc62 -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html