Re: [PATCH 11/11] xfs: increase number of ACL entries for V5 superblocks

Brian Foster
2013-05-21T14:03:04Z

On 05/21/2013 04:02 AM, Dave Chinner wrote:
> From: Dave Chinner <dchinner@redhat.com>
>
> The limit of 25 ACL entries is arbitrary, but baked into the on-disk
> format. For version 5 superblocks, increase it to the maximum nuber
> of ACLs that can fit into a single xattr.
>
> Signed-off-by: Dave Chinner <dchinner@redhat.com>
> ---
> fs/xfs/xfs_acl.c | 31 ++++++++++++++++++-------------
> fs/xfs/xfs_acl.h | 30 +++++++++++++++++++++++-------
> 2 files changed, 41 insertions(+), 20 deletions(-)
>
...
> diff --git a/fs/xfs/xfs_acl.h b/fs/xfs/xfs_acl.h
> index 39632d9..5310a52 100644
> --- a/fs/xfs/xfs_acl.h
> +++ b/fs/xfs/xfs_acl.h
> @@ -22,19 +22,35 @@ struct inode;
> struct posix_acl;
> struct xfs_inode;
>
> -#define XFS_ACL_MAX_ENTRIES 25
> #define XFS_ACL_NOT_PRESENT (-1)
>
> /* On-disk XFS access control list structure */
> +struct xfs_acl_entry {
> + __be32 ae_tag;
> + __be32 ae_id;
> + __be16 ae_perm;
> + __be16 ae_pad; /* fill the implicit hole in the structure */
> +};
> +
> struct xfs_acl {
> - __be32 acl_cnt;
> - struct xfs_acl_entry {
> - __be32 ae_tag;
> - __be32 ae_id;
> - __be16 ae_perm;
> - } acl_entry[XFS_ACL_MAX_ENTRIES];
> + __be32 acl_cnt;
> + struct xfs_acl_entry acl_entry[0];
> };
>
> +/*
> + * The number of ACL entries allowed is defined by the on-disk format.
> + * For v4 superblocks, that is limited to 25 entries. For v5 superblocks, it is
> + * limited only by the maximum size of the xattr that stores the information.
> + */
> +#define XFS_ACL_MAX_ENTRIES(mp) \
> + (xfs_sb_version_hascrc(&mp->m_sb) \
> + ? (XATTR_SIZE_MAX - sizeof(__be32) / sizeof(struct xfs_acl_entry)) \

It looks like this should be:

(XATTR_SIZE_MAX - sizeof(__be32)) / sizeof(struct xfs_acl_entry)

(i.e., misplaced parens)

Brian

> + : 25)
> +
> +#define XFS_ACL_SIZE(mp) \
> + (sizeof(struct xfs_acl) + \
> + sizeof(struct xfs_acl_entry) * XFS_ACL_MAX_ENTRIES((mp)))
> +
> /* On-disk XFS extended attribute names */
> #define SGI_ACL_FILE (unsigned char *)"SGI_ACL_FILE"
> #define SGI_ACL_DEFAULT (unsigned char *)"SGI_ACL_DEFAULT"