diff options
Diffstat (limited to 'fs/kernfs/inode.c')
| -rw-r--r-- | fs/kernfs/inode.c | 22 | 
1 files changed, 14 insertions, 8 deletions
| diff --git a/fs/kernfs/inode.c b/fs/kernfs/inode.c index c0eae1725435..3d783d80f5da 100644 --- a/fs/kernfs/inode.c +++ b/fs/kernfs/inode.c @@ -99,10 +99,11 @@ int __kernfs_setattr(struct kernfs_node *kn, const struct iattr *iattr)  int kernfs_setattr(struct kernfs_node *kn, const struct iattr *iattr)  {  	int ret; +	struct kernfs_root *root = kernfs_root(kn); -	down_write(&kernfs_rwsem); +	down_write(&root->kernfs_rwsem);  	ret = __kernfs_setattr(kn, iattr); -	up_write(&kernfs_rwsem); +	up_write(&root->kernfs_rwsem);  	return ret;  } @@ -111,12 +112,14 @@ int kernfs_iop_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,  {  	struct inode *inode = d_inode(dentry);  	struct kernfs_node *kn = inode->i_private; +	struct kernfs_root *root;  	int error;  	if (!kn)  		return -EINVAL; -	down_write(&kernfs_rwsem); +	root = kernfs_root(kn); +	down_write(&root->kernfs_rwsem);  	error = setattr_prepare(&init_user_ns, dentry, iattr);  	if (error)  		goto out; @@ -129,7 +132,7 @@ int kernfs_iop_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,  	setattr_copy(&init_user_ns, inode, iattr);  out: -	up_write(&kernfs_rwsem); +	up_write(&root->kernfs_rwsem);  	return error;  } @@ -184,13 +187,14 @@ int kernfs_iop_getattr(struct user_namespace *mnt_userns,  {  	struct inode *inode = d_inode(path->dentry);  	struct kernfs_node *kn = inode->i_private; +	struct kernfs_root *root = kernfs_root(kn); -	down_read(&kernfs_rwsem); +	down_read(&root->kernfs_rwsem);  	spin_lock(&inode->i_lock);  	kernfs_refresh_inode(kn, inode);  	generic_fillattr(&init_user_ns, inode, stat);  	spin_unlock(&inode->i_lock); -	up_read(&kernfs_rwsem); +	up_read(&root->kernfs_rwsem);  	return 0;  } @@ -274,19 +278,21 @@ int kernfs_iop_permission(struct user_namespace *mnt_userns,  			  struct inode *inode, int mask)  {  	struct kernfs_node *kn; +	struct kernfs_root *root;  	int ret;  	if (mask & MAY_NOT_BLOCK)  		return -ECHILD;  	kn = inode->i_private; +	root = kernfs_root(kn); -	down_read(&kernfs_rwsem); +	down_read(&root->kernfs_rwsem);  	spin_lock(&inode->i_lock);  	kernfs_refresh_inode(kn, inode);  	ret = generic_permission(&init_user_ns, inode, mask);  	spin_unlock(&inode->i_lock); -	up_read(&kernfs_rwsem); +	up_read(&root->kernfs_rwsem);  	return ret;  } |