lkml.org 
[lkml]   [2007]   [Apr]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[AppArmor 25/41] Add a struct vfsmount parameter to vfs_getxattr()
    The vfsmount will be passed down to the LSM hook so that LSMs can compute
    pathnames.

    Signed-off-by: Tony Jones <tonyj@suse.de>
    Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
    Signed-off-by: John Johansen <jjohansen@suse.de>

    ---
    fs/nfsd/nfs4xdr.c | 2 +-
    fs/nfsd/vfs.c | 21 ++++++++++++---------
    fs/xattr.c | 14 ++++++++------
    include/linux/nfsd/nfsd.h | 3 ++-
    include/linux/xattr.h | 3 ++-
    5 files changed, 25 insertions(+), 18 deletions(-)

    --- a/fs/nfsd/nfs4xdr.c
    +++ b/fs/nfsd/nfs4xdr.c
    @@ -1470,7 +1470,7 @@ nfsd4_encode_fattr(struct svc_fh *fhp, s
    }
    if (bmval0 & (FATTR4_WORD0_ACL | FATTR4_WORD0_ACLSUPPORT
    | FATTR4_WORD0_SUPPORTED_ATTRS)) {
    - err = nfsd4_get_nfs4_acl(rqstp, dentry, &acl);
    + err = nfsd4_get_nfs4_acl(rqstp, dentry, exp->ex_mnt, &acl);
    aclsupport = (err == 0);
    if (bmval0 & FATTR4_WORD0_ACL) {
    if (err == -EOPNOTSUPP)
    --- a/fs/nfsd/vfs.c
    +++ b/fs/nfsd/vfs.c
    @@ -378,11 +378,12 @@ out_nfserr:
    #if defined(CONFIG_NFSD_V2_ACL) || \
    defined(CONFIG_NFSD_V3_ACL) || \
    defined(CONFIG_NFSD_V4)
    -static ssize_t nfsd_getxattr(struct dentry *dentry, char *key, void **buf)
    +static ssize_t nfsd_getxattr(struct dentry *dentry, struct vfsmount *mnt,
    + char *key, void **buf)
    {
    ssize_t buflen;

    - buflen = vfs_getxattr(dentry, key, NULL, 0);
    + buflen = vfs_getxattr(dentry, mnt, key, NULL, 0);
    if (buflen <= 0)
    return buflen;

    @@ -390,7 +391,7 @@ static ssize_t nfsd_getxattr(struct dent
    if (!*buf)
    return -ENOMEM;

    - return vfs_getxattr(dentry, key, *buf, buflen);
    + return vfs_getxattr(dentry, mnt, key, *buf, buflen);
    }
    #endif

    @@ -479,13 +480,13 @@ out_nfserr:
    }

    static struct posix_acl *
    -_get_posix_acl(struct dentry *dentry, char *key)
    +_get_posix_acl(struct dentry *dentry, struct vfsmount *mnt, char *key)
    {
    void *buf = NULL;
    struct posix_acl *pacl = NULL;
    int buflen;

    - buflen = nfsd_getxattr(dentry, key, &buf);
    + buflen = nfsd_getxattr(dentry, mnt, key, &buf);
    if (!buflen)
    buflen = -ENODATA;
    if (buflen <= 0)
    @@ -497,14 +498,15 @@ _get_posix_acl(struct dentry *dentry, ch
    }

    int
    -nfsd4_get_nfs4_acl(struct svc_rqst *rqstp, struct dentry *dentry, struct nfs4_acl **acl)
    +nfsd4_get_nfs4_acl(struct svc_rqst *rqstp, struct dentry *dentry,
    + struct vfsmount *mnt, struct nfs4_acl **acl)
    {
    struct inode *inode = dentry->d_inode;
    int error = 0;
    struct posix_acl *pacl = NULL, *dpacl = NULL;
    unsigned int flags = 0;

    - pacl = _get_posix_acl(dentry, POSIX_ACL_XATTR_ACCESS);
    + pacl = _get_posix_acl(dentry, mnt, POSIX_ACL_XATTR_ACCESS);
    if (IS_ERR(pacl) && PTR_ERR(pacl) == -ENODATA)
    pacl = posix_acl_from_mode(inode->i_mode, GFP_KERNEL);
    if (IS_ERR(pacl)) {
    @@ -514,7 +516,7 @@ nfsd4_get_nfs4_acl(struct svc_rqst *rqst
    }

    if (S_ISDIR(inode->i_mode)) {
    - dpacl = _get_posix_acl(dentry, POSIX_ACL_XATTR_DEFAULT);
    + dpacl = _get_posix_acl(dentry, mnt, POSIX_ACL_XATTR_DEFAULT);
    if (IS_ERR(dpacl) && PTR_ERR(dpacl) == -ENODATA)
    dpacl = NULL;
    else if (IS_ERR(dpacl)) {
    @@ -1938,7 +1940,8 @@ nfsd_get_posix_acl(struct svc_fh *fhp, i
    return ERR_PTR(-EOPNOTSUPP);
    }

    - size = nfsd_getxattr(fhp->fh_dentry, name, &value);
    + size = nfsd_getxattr(fhp->fh_dentry, fhp->fh_export->ex_mnt, name,
    + &value);
    if (size < 0)
    return ERR_PTR(size);

    --- a/fs/xattr.c
    +++ b/fs/xattr.c
    @@ -107,7 +107,8 @@ out:
    EXPORT_SYMBOL_GPL(vfs_setxattr);

    ssize_t
    -vfs_getxattr(struct dentry *dentry, char *name, void *value, size_t size)
    +vfs_getxattr(struct dentry *dentry, struct vfsmount *mnt, char *name,
    + void *value, size_t size)
    {
    struct inode *inode = dentry->d_inode;
    int error;
    @@ -279,7 +280,8 @@ sys_fsetxattr(int fd, char __user *name,
    * Extended attribute GET operations
    */
    static ssize_t
    -getxattr(struct dentry *d, char __user *name, void __user *value, size_t size)
    +getxattr(struct dentry *dentry, struct vfsmount *mnt, char __user *name,
    + void __user *value, size_t size)
    {
    ssize_t error;
    void *kvalue = NULL;
    @@ -299,7 +301,7 @@ getxattr(struct dentry *d, char __user *
    return -ENOMEM;
    }

    - error = vfs_getxattr(d, kname, kvalue, size);
    + error = vfs_getxattr(dentry, mnt, kname, kvalue, size);
    if (error > 0) {
    if (size && copy_to_user(value, kvalue, error))
    error = -EFAULT;
    @@ -322,7 +324,7 @@ sys_getxattr(char __user *path, char __u
    error = user_path_walk(path, &nd);
    if (error)
    return error;
    - error = getxattr(nd.dentry, name, value, size);
    + error = getxattr(nd.dentry, nd.mnt, name, value, size);
    path_release(&nd);
    return error;
    }
    @@ -337,7 +339,7 @@ sys_lgetxattr(char __user *path, char __
    error = user_path_walk_link(path, &nd);
    if (error)
    return error;
    - error = getxattr(nd.dentry, name, value, size);
    + error = getxattr(nd.dentry, nd.mnt, name, value, size);
    path_release(&nd);
    return error;
    }
    @@ -351,7 +353,7 @@ sys_fgetxattr(int fd, char __user *name,
    f = fget(fd);
    if (!f)
    return error;
    - error = getxattr(f->f_path.dentry, name, value, size);
    + error = getxattr(f->f_path.dentry, f->f_path.mnt, name, value, size);
    fput(f);
    return error;
    }
    --- a/include/linux/nfsd/nfsd.h
    +++ b/include/linux/nfsd/nfsd.h
    @@ -77,7 +77,8 @@ __be32 nfsd_setattr(struct svc_rqst *,
    #ifdef CONFIG_NFSD_V4
    __be32 nfsd4_set_nfs4_acl(struct svc_rqst *, struct svc_fh *,
    struct nfs4_acl *);
    -int nfsd4_get_nfs4_acl(struct svc_rqst *, struct dentry *, struct nfs4_acl **);
    +int nfsd4_get_nfs4_acl(struct svc_rqst *, struct dentry *,
    + struct vfsmount *mnt, struct nfs4_acl **);
    #endif /* CONFIG_NFSD_V4 */
    __be32 nfsd_create(struct svc_rqst *, struct svc_fh *,
    char *name, int len, struct iattr *attrs,
    --- a/include/linux/xattr.h
    +++ b/include/linux/xattr.h
    @@ -46,7 +46,8 @@ struct xattr_handler {
    size_t size, int flags);
    };

    -ssize_t vfs_getxattr(struct dentry *, char *, void *, size_t);
    +ssize_t vfs_getxattr(struct dentry *, struct vfsmount *, char *, void *,
    + size_t);
    ssize_t vfs_listxattr(struct dentry *d, char *list, size_t size);
    int vfs_setxattr(struct dentry *, struct vfsmount *, char *, void *, size_t,
    int);
    --
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2007-04-12 11:43    [W:4.258 / U:0.440 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site