Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 684f39b4 authored by NeilBrown's avatar NeilBrown Committed by Anna Schumaker
Browse files

NFS: struct nfs_open_dir_context: convert rpc_cred pointer to cred.



Use the common 'struct cred' to pass credentials for readdir.

Signed-off-by: default avatarNeilBrown <neilb@suse.com>
Signed-off-by: default avatarAnna Schumaker <Anna.Schumaker@Netapp.com>
parent b68572e0
Loading
Loading
Loading
Loading
+5 −10
Original line number Diff line number Diff line
@@ -67,7 +67,7 @@ const struct address_space_operations nfs_dir_aops = {
	.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;
@@ -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->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);
@@ -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);
	put_rpccred(ctx->cred);
	put_cred(ctx->cred);
	kfree(ctx);
}

@@ -103,23 +103,18 @@ nfs_opendir(struct inode *inode, struct file *filp)
{
	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);

	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:
	put_rpccred(cred);
	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 rpc_cred	*cred = ctx->cred;
	const struct cred *cred = ctx->cred;
	unsigned long	timestamp, gencount;
	int		error;

+9 −2
Original line number Diff line number Diff line
@@ -614,7 +614,7 @@ nfs3_proc_rmdir(struct inode *dir, const struct qstr *name)
 * 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);
@@ -631,11 +631,15 @@ nfs3_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
		.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,
		.rpc_cred	= cred
		.rpc_cred	= rpc_lookup_generic_cred(&acred,
							  0, GFP_NOFS),
	};
	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);

	if (!msg.rpc_cred)
		return -ENOMEM;
	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:
	put_rpccred(msg.rpc_cred);
	dprintk("NFS reply readdir%s: %d\n",
			plus? "plus" : "", status);
	return status;
+10 −3
Original line number Diff line number Diff line
@@ -4699,7 +4699,7 @@ static int nfs4_proc_mkdir(struct inode *dir, struct dentry *dentry,
	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);
@@ -4712,17 +4712,23 @@ static int _nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
		.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,
		.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);
	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);
@@ -4733,11 +4739,12 @@ static int _nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,

	nfs_invalidate_atime(dir);

	put_rpccred(msg.rpc_cred);
	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 = { };
+9 −2
Original line number Diff line number Diff line
@@ -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
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);
@@ -500,18 +500,25 @@ nfs_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
		.count		= count,
		.pages		= pages,
	};
	struct auth_cred acred = {
		.cred		= cred,
	};
	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);
	if (!msg.rpc_cred)
		return -ENOMEM;
	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;
}
+1 −1
Original line number Diff line number Diff line
@@ -89,7 +89,7 @@ struct nfs_open_context {

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;
Loading