struct inode *inode = d_inode(path->dentry);
        struct kernfs_node *kn = inode->i_private;
 
-       down_write(&kernfs_rwsem);
+       down_read(&kernfs_rwsem);
+       spin_lock(&inode->i_lock);
        kernfs_refresh_inode(kn, inode);
-       up_write(&kernfs_rwsem);
-
        generic_fillattr(&init_user_ns, inode, stat);
+       spin_unlock(&inode->i_lock);
+       up_read(&kernfs_rwsem);
+
        return 0;
 }
 
                          struct inode *inode, int mask)
 {
        struct kernfs_node *kn;
+       int ret;
 
        if (mask & MAY_NOT_BLOCK)
                return -ECHILD;
 
        kn = inode->i_private;
 
-       down_write(&kernfs_rwsem);
+       down_read(&kernfs_rwsem);
+       spin_lock(&inode->i_lock);
        kernfs_refresh_inode(kn, inode);
-       up_write(&kernfs_rwsem);
+       ret = generic_permission(&init_user_ns, inode, mask);
+       spin_unlock(&inode->i_lock);
+       up_read(&kernfs_rwsem);
 
-       return generic_permission(&init_user_ns, inode, mask);
+       return ret;
 }
 
 int kernfs_xattr_get(struct kernfs_node *kn, const char *name,
 
        sb->s_shrink.seeks = 0;
 
        /* get root inode, initialize and unlock it */
-       down_write(&kernfs_rwsem);
+       down_read(&kernfs_rwsem);
        inode = kernfs_get_inode(sb, info->root->kn);
-       up_write(&kernfs_rwsem);
+       up_read(&kernfs_rwsem);
        if (!inode) {
                pr_debug("kernfs: could not get root inode\n");
                return -ENOMEM;