Commit aa1d058d authored by Ian Kent's avatar Ian Kent Committed by Greg Kroah-Hartman
Browse files

kernfs: dont take i_lock on inode attr read



The kernfs write lock is held when the kernfs node inode attributes
are updated. Therefore, when either kernfs_iop_getattr() or
kernfs_iop_permission() are called the kernfs node inode attributes
won't change.

Consequently concurrent kernfs_refresh_inode() calls always copy the
same values from the kernfs node.

So there's no need to take the inode i_lock to get consistent values
for generic_fillattr() and generic_permission(), the kernfs read lock
is sufficient.

Cc: Tejun Heo <tj@kernel.org>
Signed-off-by: default avatarIan Kent <raven@themaw.net>
Link: https://lore.kernel.org/r/166606036215.13363.1288735296954908554.stgit@donald.themaw.net


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 5033ac5c
Loading
Loading
Loading
Loading
+0 −4
Original line number Diff line number Diff line
@@ -190,10 +190,8 @@ int kernfs_iop_getattr(struct user_namespace *mnt_userns,
	struct kernfs_root *root = kernfs_root(kn);

	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(&root->kernfs_rwsem);

	return 0;
@@ -288,10 +286,8 @@ int kernfs_iop_permission(struct user_namespace *mnt_userns,
	root = kernfs_root(kn);

	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(&root->kernfs_rwsem);

	return ret;