Re: [PATCH] Return more useful error number when acls are too large

From: Andreas Gruenbacher
Date: Tue Apr 27 2004 - 13:25:05 EST


On Tue, 2004-04-27 at 03:24, Nathan Scott wrote:
> hi Andreas,
>
> On Mon, Apr 26, 2004 at 12:27:58PM +0200, Andreas Gruenbacher wrote:
> > Hello,
> >
> > could you please add this to mainline? Getting EINVAL when an acl
> > becomes too large is quite confusing.
> >
> > if (acl) {
> > if (acl->a_count > EXT2_ACL_MAX_ENTRIES)
> > - return -EINVAL;
> > + return -ENOSPC;
>
> That seems an odd error code to change it to, since its not
> related to the device running out of free space right? Maybe
> use -E2BIG instead?

I don't see a problem with giving ENOSPC this particular meaning here.
The error number used must be among those defined for NFSv3, so E2BIG
won't do.

> XFS has a similar check (different limit as you know), so is
> also affected by this; could you update XFS at the same time
> with whatever value gets chosen, if its not EINVAL? Or just
> let me know what gets chosen & I'll fix it up later.

I think this patch is correct for xfs. Nathan, would you mind to
double-check? Thanks.


Index: linux-2.6.6-rc2/fs/xfs/xfs_acl.c
===================================================================
--- linux-2.6.6-rc2.orig/fs/xfs/xfs_acl.c
+++ linux-2.6.6-rc2/fs/xfs/xfs_acl.c
@@ -148,10 +148,7 @@ posix_acl_xattr_to_xfs(
return EINVAL;
}
}
- if (xfs_acl_invalid(dest))
- return EINVAL;
-
- return 0;
+ return xfs_acl_invalid(dest);
}

/*
@@ -249,10 +246,9 @@ xfs_acl_vget(
if (!size) {
error = -posix_acl_xattr_size(XFS_ACL_MAX_ENTRIES);
} else {
- if (xfs_acl_invalid(xfs_acl)) {
- error = EINVAL;
+ error = xfs_acl_invalid(xfs_acl);
+ if (error)
goto out;
- }
if (kind == _ACL_TYPE_ACCESS) {
vattr_t va;

@@ -590,7 +586,7 @@ xfs_acl_invalid(
goto acl_invalid;

if (aclp->acl_cnt > XFS_ACL_MAX_ENTRIES)
- goto acl_invalid;
+ return ENOSPC;

for (i = 0; i < aclp->acl_cnt; i++) {
entry = &aclp->acl_entry[i];


Thanks,
--
Andreas Gruenbacher <agruen@xxxxxxx>
SUSE Labs, SUSE LINUX AG
Index: linux-2.6.6-rc2/fs/xfs/xfs_acl.c
===================================================================
--- linux-2.6.6-rc2.orig/fs/xfs/xfs_acl.c
+++ linux-2.6.6-rc2/fs/xfs/xfs_acl.c
@@ -148,10 +148,7 @@ posix_acl_xattr_to_xfs(
return EINVAL;
}
}
- if (xfs_acl_invalid(dest))
- return EINVAL;
-
- return 0;
+ return xfs_acl_invalid(dest);
}

/*
@@ -249,10 +246,9 @@ xfs_acl_vget(
if (!size) {
error = -posix_acl_xattr_size(XFS_ACL_MAX_ENTRIES);
} else {
- if (xfs_acl_invalid(xfs_acl)) {
- error = EINVAL;
+ error = xfs_acl_invalid(xfs_acl);
+ if (error)
goto out;
- }
if (kind == _ACL_TYPE_ACCESS) {
vattr_t va;

@@ -590,7 +586,7 @@ xfs_acl_invalid(
goto acl_invalid;

if (aclp->acl_cnt > XFS_ACL_MAX_ENTRIES)
- goto acl_invalid;
+ return ENOSPC;

for (i = 0; i < aclp->acl_cnt; i++) {
entry = &aclp->acl_entry[i];