From: NeilBrown The ->getxattr op doesn't take the i_sem (see Documentation/filesystems/Locking) Signed-off-by: J. Bruce Fields Signed-off-by: Neil Brown Signed-off-by: Andrew Morton --- 25-akpm/fs/nfsd/vfs.c | 14 +++++--------- 1 files changed, 5 insertions(+), 9 deletions(-) diff -puN fs/nfsd/vfs.c~nfsd4-dont-take-i_sem-around-call-to-getxattr fs/nfsd/vfs.c --- 25/fs/nfsd/vfs.c~nfsd4-dont-take-i_sem-around-call-to-getxattr 2004-09-23 22:06:17.870371912 -0700 +++ 25-akpm/fs/nfsd/vfs.c 2004-09-23 22:06:17.876371000 -0700 @@ -448,39 +448,35 @@ _get_posix_acl(struct dentry *dentry, ch int buflen, error = 0; struct posix_acl *pacl = NULL; - down(&inode->i_sem); - buflen = inode->i_op->getxattr(dentry, key, NULL, 0); if (buflen <= 0) { error = buflen < 0 ? buflen : -ENODATA; - goto out_sem; + goto out_err; } buf = kmalloc(buflen, GFP_KERNEL); if (buf == NULL) { error = -ENOMEM; - goto out_sem; + goto out_err; } error = -EOPNOTSUPP; if (inode->i_op && inode->i_op->getxattr) { error = security_inode_getxattr(dentry, key); if (error) - goto out_sem; + goto out_err; error = inode->i_op->getxattr(dentry, key, buf, buflen); } if (error < 0) - goto out_sem; + goto out_err; error = 0; - up(&inode->i_sem); pacl = posix_acl_from_xattr(buf, buflen); out: kfree(buf); return pacl; - out_sem: - up(&inode->i_sem); + out_err: pacl = ERR_PTR(error); goto out; } _