lkml.org 
[lkml]   [2014]   [Jul]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.15 06/37] nfs: only show Posix ACLs in listxattr if actually present
    Date
    3.15-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Christoph Hellwig <hch@lst.de>

    commit 74adf83f5d7720925499b4938f930591f947b660 upstream.

    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@lst.de>
    Reported-by: Philippe Troin <phil@fifi.org>
    Tested-by: Philippe Troin <phil@fifi.org>
    Fixes: 013cdf1088d7 (nfs: use generic posix ACL infrastructure ...)
    Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    fs/nfs/nfs3acl.c | 43 +++++++++++++++++++++++++++++++++++++++++++
    fs/nfs/nfs3proc.c | 4 ++--
    2 files changed, 45 insertions(+), 2 deletions(-)

    --- a/fs/nfs/nfs3acl.c
    +++ b/fs/nfs/nfs3acl.c
    @@ -247,3 +247,46 @@ const struct xattr_handler *nfs3_xattr_h
    &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)
    +{
    + 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;
    +}
    --- a/fs/nfs/nfs3proc.c
    +++ b/fs/nfs/nfs3proc.c
    @@ -891,7 +891,7 @@ static const struct inode_operations nfs
    .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,
    @@ -905,7 +905,7 @@ static const struct inode_operations nfs
    .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,



    \
     
     \ /
      Last update: 2014-07-30 05:21    [W:4.728 / U:0.304 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site