提交 2dc164f2 编写于 作者: D Dave Chinner 提交者: Ben Myers

xfs: fix memory allocation failures with ACLs

Ever since increasing the number of supported ACLs from 25 to as
many as can fit in an xattr, there have been reports of order 4
memory allocations failing in the ACL code. Fix it in the same way
we've fixed all the xattr read/write code that has the same problem.
Signed-off-by: NDave Chinner <dchinner@redhat.com>
Reviewed-by: NMark Tinguely <tinguely@sgi.com>
Signed-off-by: NBen Myers <bpm@sgi.com>
上级 0a4edc8f
......@@ -152,9 +152,12 @@ xfs_get_acl(struct inode *inode, int type)
* go out to the disk.
*/
len = XFS_ACL_MAX_SIZE(ip->i_mount);
xfs_acl = kzalloc(len, GFP_KERNEL);
xfs_acl = kmem_zalloc(len, KM_SLEEP | KM_MAYFAIL);
if (!xfs_acl) {
xfs_acl = kmem_zalloc_large(len);
if (!xfs_acl)
return ERR_PTR(-ENOMEM);
}
error = -xfs_attr_get(ip, ea_name, (unsigned char *)xfs_acl,
&len, ATTR_ROOT);
......@@ -175,9 +178,12 @@ xfs_get_acl(struct inode *inode, int type)
if (IS_ERR(acl))
goto out;
out_update_cache:
out_update_cache:
set_cached_acl(inode, type, acl);
out:
out:
if (is_vmalloc_addr(xfs_acl))
kmem_free_large(xfs_acl);
else
kfree(xfs_acl);
return acl;
}
......@@ -209,9 +215,12 @@ xfs_set_acl(struct inode *inode, int type, struct posix_acl *acl)
struct xfs_acl *xfs_acl;
int len = XFS_ACL_MAX_SIZE(ip->i_mount);
xfs_acl = kzalloc(len, GFP_KERNEL);
xfs_acl = kmem_zalloc(len, KM_SLEEP | KM_MAYFAIL);
if (!xfs_acl) {
xfs_acl = kmem_zalloc_large(len);
if (!xfs_acl)
return -ENOMEM;
}
xfs_acl_to_disk(xfs_acl, acl);
......@@ -222,6 +231,9 @@ xfs_set_acl(struct inode *inode, int type, struct posix_acl *acl)
error = -xfs_attr_set(ip, ea_name, (unsigned char *)xfs_acl,
len, ATTR_ROOT);
if (is_vmalloc_addr(xfs_acl))
kmem_free_large(xfs_acl);
else
kfree(xfs_acl);
} else {
/*
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册