NFS: struct nfs_open_dir_context: convert rpc_cred pointer to cred.
authorNeilBrown <neilb@suse.com>
Mon, 3 Dec 2018 00:30:30 +0000 (11:30 +1100)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Wed, 19 Dec 2018 18:52:46 +0000 (13:52 -0500)
Use the common 'struct cred' to pass credentials for readdir.

Signed-off-by: NeilBrown <neilb@suse.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
fs/nfs/dir.c
fs/nfs/nfs3proc.c
fs/nfs/nfs4proc.c
fs/nfs/proc.c
include/linux/nfs_fs.h
include/linux/nfs_xdr.h

index 4dc61b6f74e82dbac99719dde47a2d25e468c55d..6bf4471850c8cbe329699f3fa5eaa54c6daaa685 100644 (file)
@@ -67,7 +67,7 @@ const struct address_space_operations nfs_dir_aops = {
        .freepage = nfs_readdir_clear_array,
 };
 
        .freepage = nfs_readdir_clear_array,
 };
 
-static struct nfs_open_dir_context *alloc_nfs_open_dir_context(struct inode *dir, struct rpc_cred *cred)
+static struct nfs_open_dir_context *alloc_nfs_open_dir_context(struct inode *dir, const struct cred *cred)
 {
        struct nfs_inode *nfsi = NFS_I(dir);
        struct nfs_open_dir_context *ctx;
 {
        struct nfs_inode *nfsi = NFS_I(dir);
        struct nfs_open_dir_context *ctx;
@@ -77,7 +77,7 @@ static struct nfs_open_dir_context *alloc_nfs_open_dir_context(struct inode *dir
                ctx->attr_gencount = nfsi->attr_gencount;
                ctx->dir_cookie = 0;
                ctx->dup_cookie = 0;
                ctx->attr_gencount = nfsi->attr_gencount;
                ctx->dir_cookie = 0;
                ctx->dup_cookie = 0;
-               ctx->cred = get_rpccred(cred);
+               ctx->cred = get_cred(cred);
                spin_lock(&dir->i_lock);
                list_add(&ctx->list, &nfsi->open_files);
                spin_unlock(&dir->i_lock);
                spin_lock(&dir->i_lock);
                list_add(&ctx->list, &nfsi->open_files);
                spin_unlock(&dir->i_lock);
@@ -91,7 +91,7 @@ static void put_nfs_open_dir_context(struct inode *dir, struct nfs_open_dir_cont
        spin_lock(&dir->i_lock);
        list_del(&ctx->list);
        spin_unlock(&dir->i_lock);
        spin_lock(&dir->i_lock);
        list_del(&ctx->list);
        spin_unlock(&dir->i_lock);
-       put_rpccred(ctx->cred);
+       put_cred(ctx->cred);
        kfree(ctx);
 }
 
        kfree(ctx);
 }
 
@@ -103,23 +103,18 @@ nfs_opendir(struct inode *inode, struct file *filp)
 {
        int res = 0;
        struct nfs_open_dir_context *ctx;
 {
        int res = 0;
        struct nfs_open_dir_context *ctx;
-       struct rpc_cred *cred;
 
        dfprintk(FILE, "NFS: open dir(%pD2)\n", filp);
 
        nfs_inc_stats(inode, NFSIOS_VFSOPEN);
 
 
        dfprintk(FILE, "NFS: open dir(%pD2)\n", filp);
 
        nfs_inc_stats(inode, NFSIOS_VFSOPEN);
 
-       cred = rpc_lookup_cred();
-       if (IS_ERR(cred))
-               return PTR_ERR(cred);
-       ctx = alloc_nfs_open_dir_context(inode, cred);
+       ctx = alloc_nfs_open_dir_context(inode, current_cred());
        if (IS_ERR(ctx)) {
                res = PTR_ERR(ctx);
                goto out;
        }
        filp->private_data = ctx;
 out:
        if (IS_ERR(ctx)) {
                res = PTR_ERR(ctx);
                goto out;
        }
        filp->private_data = ctx;
 out:
-       put_rpccred(cred);
        return res;
 }
 
        return res;
 }
 
@@ -334,7 +329,7 @@ int nfs_readdir_xdr_filler(struct page **pages, nfs_readdir_descriptor_t *desc,
                        struct nfs_entry *entry, struct file *file, struct inode *inode)
 {
        struct nfs_open_dir_context *ctx = file->private_data;
                        struct nfs_entry *entry, struct file *file, struct inode *inode)
 {
        struct nfs_open_dir_context *ctx = file->private_data;
-       struct rpc_cred *cred = ctx->cred;
+       const struct cred *cred = ctx->cred;
        unsigned long   timestamp, gencount;
        int             error;
 
        unsigned long   timestamp, gencount;
        int             error;
 
index f7174f3a9575c19218947c0d3cc4700fa4d7c4d8..a2e9e09c37723e83a7ef6610c93e643f2bec0eed 100644 (file)
@@ -614,7 +614,7 @@ out:
  * readdirplus.
  */
 static int
  * readdirplus.
  */
 static int
-nfs3_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
+nfs3_proc_readdir(struct dentry *dentry, const struct cred *cred,
                  u64 cookie, struct page **pages, unsigned int count, bool plus)
 {
        struct inode            *dir = d_inode(dentry);
                  u64 cookie, struct page **pages, unsigned int count, bool plus)
 {
        struct inode            *dir = d_inode(dentry);
@@ -631,11 +631,15 @@ nfs3_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
                .verf           = verf,
                .plus           = plus
        };
                .verf           = verf,
                .plus           = plus
        };
+       struct auth_cred acred = {
+               .cred           = cred,
+       };
        struct rpc_message      msg = {
                .rpc_proc       = &nfs3_procedures[NFS3PROC_READDIR],
                .rpc_argp       = &arg,
                .rpc_resp       = &res,
        struct rpc_message      msg = {
                .rpc_proc       = &nfs3_procedures[NFS3PROC_READDIR],
                .rpc_argp       = &arg,
                .rpc_resp       = &res,
-               .rpc_cred       = cred
+               .rpc_cred       = rpc_lookup_generic_cred(&acred,
+                                                         0, GFP_NOFS),
        };
        int status = -ENOMEM;
 
        };
        int status = -ENOMEM;
 
@@ -645,6 +649,8 @@ nfs3_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
        dprintk("NFS call  readdir%s %d\n",
                        plus? "plus" : "", (unsigned int) cookie);
 
        dprintk("NFS call  readdir%s %d\n",
                        plus? "plus" : "", (unsigned int) cookie);
 
+       if (!msg.rpc_cred)
+               return -ENOMEM;
        res.dir_attr = nfs_alloc_fattr();
        if (res.dir_attr == NULL)
                goto out;
        res.dir_attr = nfs_alloc_fattr();
        if (res.dir_attr == NULL)
                goto out;
@@ -656,6 +662,7 @@ nfs3_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
 
        nfs_free_fattr(res.dir_attr);
 out:
 
        nfs_free_fattr(res.dir_attr);
 out:
+       put_rpccred(msg.rpc_cred);
        dprintk("NFS reply readdir%s: %d\n",
                        plus? "plus" : "", status);
        return status;
        dprintk("NFS reply readdir%s: %d\n",
                        plus? "plus" : "", status);
        return status;
index bf97331c02d335584bb1d796b94325ee9b69d5e2..80cedb007c3c943ba2ac1165142b1c505b559d96 100644 (file)
@@ -4699,7 +4699,7 @@ static int nfs4_proc_mkdir(struct inode *dir, struct dentry *dentry,
        return err;
 }
 
        return err;
 }
 
-static int _nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
+static int _nfs4_proc_readdir(struct dentry *dentry, const struct cred *cred,
                u64 cookie, struct page **pages, unsigned int count, bool plus)
 {
        struct inode            *dir = d_inode(dentry);
                u64 cookie, struct page **pages, unsigned int count, bool plus)
 {
        struct inode            *dir = d_inode(dentry);
@@ -4712,17 +4712,23 @@ static int _nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
                .plus = plus,
        };
        struct nfs4_readdir_res res;
                .plus = plus,
        };
        struct nfs4_readdir_res res;
+       struct auth_cred acred = {
+               .cred           = cred,
+       };
        struct rpc_message msg = {
                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READDIR],
                .rpc_argp = &args,
                .rpc_resp = &res,
        struct rpc_message msg = {
                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READDIR],
                .rpc_argp = &args,
                .rpc_resp = &res,
-               .rpc_cred = cred,
+               .rpc_cred = rpc_lookup_generic_cred(&acred,
+                                                   0, GFP_NOFS),
        };
        int                     status;
 
        dprintk("%s: dentry = %pd2, cookie = %Lu\n", __func__,
                        dentry,
                        (unsigned long long)cookie);
        };
        int                     status;
 
        dprintk("%s: dentry = %pd2, cookie = %Lu\n", __func__,
                        dentry,
                        (unsigned long long)cookie);
+       if (!msg.rpc_cred)
+               return -ENOMEM;
        nfs4_setup_readdir(cookie, NFS_I(dir)->cookieverf, dentry, &args);
        res.pgbase = args.pgbase;
        status = nfs4_call_sync(NFS_SERVER(dir)->client, NFS_SERVER(dir), &msg, &args.seq_args, &res.seq_res, 0);
        nfs4_setup_readdir(cookie, NFS_I(dir)->cookieverf, dentry, &args);
        res.pgbase = args.pgbase;
        status = nfs4_call_sync(NFS_SERVER(dir)->client, NFS_SERVER(dir), &msg, &args.seq_args, &res.seq_res, 0);
@@ -4733,11 +4739,12 @@ static int _nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
 
        nfs_invalidate_atime(dir);
 
 
        nfs_invalidate_atime(dir);
 
+       put_rpccred(msg.rpc_cred);
        dprintk("%s: returns %d\n", __func__, status);
        return status;
 }
 
        dprintk("%s: returns %d\n", __func__, status);
        return status;
 }
 
-static int nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
+static int nfs4_proc_readdir(struct dentry *dentry, const struct cred *cred,
                u64 cookie, struct page **pages, unsigned int count, bool plus)
 {
        struct nfs4_exception exception = { };
                u64 cookie, struct page **pages, unsigned int count, bool plus)
 {
        struct nfs4_exception exception = { };
index e0c257bd62b938372f957b58177458fe37c9f0da..1ba717bd20c4ce9db93b390057a522303f28a508 100644 (file)
@@ -490,7 +490,7 @@ nfs_proc_rmdir(struct inode *dir, const struct qstr *name)
  * from nfs_readdir by calling the decode_entry function directly.
  */
 static int
  * from nfs_readdir by calling the decode_entry function directly.
  */
 static int
-nfs_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
+nfs_proc_readdir(struct dentry *dentry, const struct cred *cred,
                 u64 cookie, struct page **pages, unsigned int count, bool plus)
 {
        struct inode            *dir = d_inode(dentry);
                 u64 cookie, struct page **pages, unsigned int count, bool plus)
 {
        struct inode            *dir = d_inode(dentry);
@@ -500,18 +500,25 @@ nfs_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
                .count          = count,
                .pages          = pages,
        };
                .count          = count,
                .pages          = pages,
        };
+       struct auth_cred acred = {
+               .cred           = cred,
+       };
        struct rpc_message      msg = {
                .rpc_proc       = &nfs_procedures[NFSPROC_READDIR],
                .rpc_argp       = &arg,
        struct rpc_message      msg = {
                .rpc_proc       = &nfs_procedures[NFSPROC_READDIR],
                .rpc_argp       = &arg,
-               .rpc_cred       = cred,
+               .rpc_cred       = rpc_lookup_generic_cred(&acred,
+                                                         0, GFP_NOFS),
        };
        int                     status;
 
        dprintk("NFS call  readdir %d\n", (unsigned int)cookie);
        };
        int                     status;
 
        dprintk("NFS call  readdir %d\n", (unsigned int)cookie);
+       if (!msg.rpc_cred)
+               return -ENOMEM;
        status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
 
        nfs_invalidate_atime(dir);
 
        status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
 
        nfs_invalidate_atime(dir);
 
+       put_rpccred(msg.rpc_cred);
        dprintk("NFS reply readdir: %d\n", status);
        return status;
 }
        dprintk("NFS reply readdir: %d\n", status);
        return status;
 }
index 7d2064bd421fc3e65c4ea53cb18a5f473feece42..271015e55d0f87653a8559ad0801cd1d7328c449 100644 (file)
@@ -89,7 +89,7 @@ struct nfs_open_context {
 
 struct nfs_open_dir_context {
        struct list_head list;
 
 struct nfs_open_dir_context {
        struct list_head list;
-       struct rpc_cred *cred;
+       const struct cred *cred;
        unsigned long attr_gencount;
        __u64 dir_cookie;
        __u64 dup_cookie;
        unsigned long attr_gencount;
        __u64 dir_cookie;
        __u64 dup_cookie;
index 0e016252cfc698c1e140f4f1990b2ba6af541d2a..cd489e2e0979657817e01e7d2c74660974989623 100644 (file)
@@ -1634,7 +1634,7 @@ struct nfs_rpc_ops {
                            unsigned int, struct iattr *);
        int     (*mkdir)   (struct inode *, struct dentry *, struct iattr *);
        int     (*rmdir)   (struct inode *, const struct qstr *);
                            unsigned int, struct iattr *);
        int     (*mkdir)   (struct inode *, struct dentry *, struct iattr *);
        int     (*rmdir)   (struct inode *, const struct qstr *);
-       int     (*readdir) (struct dentry *, struct rpc_cred *,
+       int     (*readdir) (struct dentry *, const struct cred *,
                            u64, struct page **, unsigned int, bool);
        int     (*mknod)   (struct inode *, struct dentry *, struct iattr *,
                            dev_t);
                            u64, struct page **, unsigned int, bool);
        int     (*mknod)   (struct inode *, struct dentry *, struct iattr *,
                            dev_t);