Re: [PATCH] nfs: only show Posix ACLs in listxattr if actually present

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Christoph,

On Wed, Jun 18, 2014 at 5:07 AM, Christoph Hellwig <hch@xxxxxx> wrote:
> The big ACL switched nfs to use generic_listxattr, which calls all existing
> ->list handlers.  Add a custom .listxattr implementation that only lists
> the ACLs if they actually are present on the given inode.
>
> Signed-off-by: Christoph Hellwig <hch@xxxxxx>
> Reported-by: Philippe Troin <phil@xxxxxxxx>
> Tested-by: Philippe Troin <phil@xxxxxxxx>
> ---
>  fs/nfs/nfs3acl.c  |   43 +++++++++++++++++++++++++++++++++++++++++++
>  fs/nfs/nfs3proc.c |    4 ++--
>  2 files changed, 45 insertions(+), 2 deletions(-)
>
> diff --git a/fs/nfs/nfs3acl.c b/fs/nfs/nfs3acl.c
> index 871d6ed..8f854dd 100644
> --- a/fs/nfs/nfs3acl.c
> +++ b/fs/nfs/nfs3acl.c
> @@ -247,3 +247,46 @@ const struct xattr_handler *nfs3_xattr_handlers[] = {
>         &posix_acl_default_xattr_handler,
>         NULL,
>  };
> +
> +static int
> +nfs3_list_one_acl(struct inode *inode, int type, const char *name, void *data,
> +               size_t size, ssize_t *result)

Why do you make 'result' a pointer to ssize_t rather than a size_t here?

> +{
> +       struct posix_acl *acl;
> +       char *p = data + *result;
> +
> +       acl = get_acl(inode, type);
> +       if (!acl)
> +               return 0;
> +
> +       posix_acl_release(acl);
> +
> +       *result += strlen(name);
> +       *result += 1;
> +       if (!size)
> +               return 0;
> +       if (*result > size)
> +               return -ERANGE;
> +
> +       strcpy(p, name);
> +       return 0;
> +}
> +
> +ssize_t
> +nfs3_listxattr(struct dentry *dentry, char *data, size_t size)
> +{
> +       struct inode *inode = dentry->d_inode;
> +       ssize_t result = 0;
> +       int error;
> +
> +       error = nfs3_list_one_acl(inode, ACL_TYPE_ACCESS,
> +                       POSIX_ACL_XATTR_ACCESS, data, size, &result);
> +       if (error)
> +               return error;
> +
> +       error = nfs3_list_one_acl(inode, ACL_TYPE_DEFAULT,
> +                       POSIX_ACL_XATTR_DEFAULT, data, size, &result);
> +       if (error)
> +               return error;
> +       return result;
> +}
> diff --git a/fs/nfs/nfs3proc.c b/fs/nfs/nfs3proc.c
> index e7daa42..f0afa29 100644
> --- a/fs/nfs/nfs3proc.c
> +++ b/fs/nfs/nfs3proc.c
> @@ -885,7 +885,7 @@ static const struct inode_operations nfs3_dir_inode_operations = {
>         .getattr        = nfs_getattr,
>         .setattr        = nfs_setattr,
>  #ifdef CONFIG_NFS_V3_ACL
> -       .listxattr      = generic_listxattr,
> +       .listxattr      = nfs3_listxattr,
>         .getxattr       = generic_getxattr,
>         .setxattr       = generic_setxattr,
>         .removexattr    = generic_removexattr,
> @@ -899,7 +899,7 @@ static const struct inode_operations nfs3_file_inode_operations = {
>         .getattr        = nfs_getattr,
>         .setattr        = nfs_setattr,
>  #ifdef CONFIG_NFS_V3_ACL
> -       .listxattr      = generic_listxattr,
> +       .listxattr      = nfs3_listxattr,
>         .getxattr       = generic_getxattr,
>         .setxattr       = generic_setxattr,
>         .removexattr    = generic_removexattr,
> --
> 1.7.10.4
>



-- 
Trond Myklebust

Linux NFS client maintainer, PrimaryData

trond.myklebust@xxxxxxxxxxxxxxx
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux