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: NeilBrown <neilb@suse.com> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
This commit is contained in:
Родитель
b68572e07c
Коммит
684f39b4cf
15
fs/nfs/dir.c
15
fs/nfs/dir.c
|
@ -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_inode *nfsi = NFS_I(dir);
|
||||||
struct nfs_open_dir_context *ctx;
|
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->attr_gencount = nfsi->attr_gencount;
|
||||||
ctx->dir_cookie = 0;
|
ctx->dir_cookie = 0;
|
||||||
ctx->dup_cookie = 0;
|
ctx->dup_cookie = 0;
|
||||||
ctx->cred = get_rpccred(cred);
|
ctx->cred = get_cred(cred);
|
||||||
spin_lock(&dir->i_lock);
|
spin_lock(&dir->i_lock);
|
||||||
list_add(&ctx->list, &nfsi->open_files);
|
list_add(&ctx->list, &nfsi->open_files);
|
||||||
spin_unlock(&dir->i_lock);
|
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);
|
spin_lock(&dir->i_lock);
|
||||||
list_del(&ctx->list);
|
list_del(&ctx->list);
|
||||||
spin_unlock(&dir->i_lock);
|
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;
|
int res = 0;
|
||||||
struct nfs_open_dir_context *ctx;
|
struct nfs_open_dir_context *ctx;
|
||||||
struct rpc_cred *cred;
|
|
||||||
|
|
||||||
dfprintk(FILE, "NFS: open dir(%pD2)\n", filp);
|
dfprintk(FILE, "NFS: open dir(%pD2)\n", filp);
|
||||||
|
|
||||||
nfs_inc_stats(inode, NFSIOS_VFSOPEN);
|
nfs_inc_stats(inode, NFSIOS_VFSOPEN);
|
||||||
|
|
||||||
cred = rpc_lookup_cred();
|
ctx = alloc_nfs_open_dir_context(inode, current_cred());
|
||||||
if (IS_ERR(cred))
|
|
||||||
return PTR_ERR(cred);
|
|
||||||
ctx = alloc_nfs_open_dir_context(inode, cred);
|
|
||||||
if (IS_ERR(ctx)) {
|
if (IS_ERR(ctx)) {
|
||||||
res = PTR_ERR(ctx);
|
res = PTR_ERR(ctx);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
filp->private_data = ctx;
|
filp->private_data = ctx;
|
||||||
out:
|
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_entry *entry, struct file *file, struct inode *inode)
|
||||||
{
|
{
|
||||||
struct nfs_open_dir_context *ctx = file->private_data;
|
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;
|
unsigned long timestamp, gencount;
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
|
|
|
@ -614,7 +614,7 @@ out:
|
||||||
* readdirplus.
|
* readdirplus.
|
||||||
*/
|
*/
|
||||||
static int
|
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)
|
u64 cookie, struct page **pages, unsigned int count, bool plus)
|
||||||
{
|
{
|
||||||
struct inode *dir = d_inode(dentry);
|
struct inode *dir = d_inode(dentry);
|
||||||
|
@ -631,11 +631,15 @@ nfs3_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
|
||||||
.verf = verf,
|
.verf = verf,
|
||||||
.plus = plus
|
.plus = plus
|
||||||
};
|
};
|
||||||
|
struct auth_cred acred = {
|
||||||
|
.cred = cred,
|
||||||
|
};
|
||||||
struct rpc_message msg = {
|
struct rpc_message msg = {
|
||||||
.rpc_proc = &nfs3_procedures[NFS3PROC_READDIR],
|
.rpc_proc = &nfs3_procedures[NFS3PROC_READDIR],
|
||||||
.rpc_argp = &arg,
|
.rpc_argp = &arg,
|
||||||
.rpc_resp = &res,
|
.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",
|
dprintk("NFS call readdir%s %d\n",
|
||||||
plus? "plus" : "", (unsigned int) cookie);
|
plus? "plus" : "", (unsigned int) cookie);
|
||||||
|
|
||||||
|
if (!msg.rpc_cred)
|
||||||
|
return -ENOMEM;
|
||||||
res.dir_attr = nfs_alloc_fattr();
|
res.dir_attr = nfs_alloc_fattr();
|
||||||
if (res.dir_attr == NULL)
|
if (res.dir_attr == NULL)
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -656,6 +662,7 @@ nfs3_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
|
||||||
|
|
||||||
nfs_free_fattr(res.dir_attr);
|
nfs_free_fattr(res.dir_attr);
|
||||||
out:
|
out:
|
||||||
|
put_rpccred(msg.rpc_cred);
|
||||||
dprintk("NFS reply readdir%s: %d\n",
|
dprintk("NFS reply readdir%s: %d\n",
|
||||||
plus? "plus" : "", status);
|
plus? "plus" : "", status);
|
||||||
return status;
|
return status;
|
||||||
|
|
|
@ -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)
|
u64 cookie, struct page **pages, unsigned int count, bool plus)
|
||||||
{
|
{
|
||||||
struct inode *dir = d_inode(dentry);
|
struct inode *dir = d_inode(dentry);
|
||||||
|
@ -4712,17 +4712,23 @@ static int _nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
|
||||||
.plus = plus,
|
.plus = plus,
|
||||||
};
|
};
|
||||||
struct nfs4_readdir_res res;
|
struct nfs4_readdir_res res;
|
||||||
|
struct auth_cred acred = {
|
||||||
|
.cred = cred,
|
||||||
|
};
|
||||||
struct rpc_message msg = {
|
struct rpc_message msg = {
|
||||||
.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READDIR],
|
.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READDIR],
|
||||||
.rpc_argp = &args,
|
.rpc_argp = &args,
|
||||||
.rpc_resp = &res,
|
.rpc_resp = &res,
|
||||||
.rpc_cred = cred,
|
.rpc_cred = rpc_lookup_generic_cred(&acred,
|
||||||
|
0, GFP_NOFS),
|
||||||
};
|
};
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
dprintk("%s: dentry = %pd2, cookie = %Lu\n", __func__,
|
dprintk("%s: dentry = %pd2, cookie = %Lu\n", __func__,
|
||||||
dentry,
|
dentry,
|
||||||
(unsigned long long)cookie);
|
(unsigned long long)cookie);
|
||||||
|
if (!msg.rpc_cred)
|
||||||
|
return -ENOMEM;
|
||||||
nfs4_setup_readdir(cookie, NFS_I(dir)->cookieverf, dentry, &args);
|
nfs4_setup_readdir(cookie, NFS_I(dir)->cookieverf, dentry, &args);
|
||||||
res.pgbase = args.pgbase;
|
res.pgbase = args.pgbase;
|
||||||
status = nfs4_call_sync(NFS_SERVER(dir)->client, NFS_SERVER(dir), &msg, &args.seq_args, &res.seq_res, 0);
|
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);
|
dprintk("%s: returns %d\n", __func__, status);
|
||||||
return 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)
|
u64 cookie, struct page **pages, unsigned int count, bool plus)
|
||||||
{
|
{
|
||||||
struct nfs4_exception exception = { };
|
struct nfs4_exception exception = { };
|
||||||
|
|
|
@ -490,7 +490,7 @@ nfs_proc_rmdir(struct inode *dir, const struct qstr *name)
|
||||||
* from nfs_readdir by calling the decode_entry function directly.
|
* from nfs_readdir by calling the decode_entry function directly.
|
||||||
*/
|
*/
|
||||||
static int
|
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)
|
u64 cookie, struct page **pages, unsigned int count, bool plus)
|
||||||
{
|
{
|
||||||
struct inode *dir = d_inode(dentry);
|
struct inode *dir = d_inode(dentry);
|
||||||
|
@ -500,18 +500,25 @@ nfs_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
|
||||||
.count = count,
|
.count = count,
|
||||||
.pages = pages,
|
.pages = pages,
|
||||||
};
|
};
|
||||||
|
struct auth_cred acred = {
|
||||||
|
.cred = cred,
|
||||||
|
};
|
||||||
struct rpc_message msg = {
|
struct rpc_message msg = {
|
||||||
.rpc_proc = &nfs_procedures[NFSPROC_READDIR],
|
.rpc_proc = &nfs_procedures[NFSPROC_READDIR],
|
||||||
.rpc_argp = &arg,
|
.rpc_argp = &arg,
|
||||||
.rpc_cred = cred,
|
.rpc_cred = rpc_lookup_generic_cred(&acred,
|
||||||
|
0, GFP_NOFS),
|
||||||
};
|
};
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
dprintk("NFS call readdir %d\n", (unsigned int)cookie);
|
dprintk("NFS call readdir %d\n", (unsigned int)cookie);
|
||||||
|
if (!msg.rpc_cred)
|
||||||
|
return -ENOMEM;
|
||||||
status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
|
status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
|
||||||
|
|
||||||
nfs_invalidate_atime(dir);
|
nfs_invalidate_atime(dir);
|
||||||
|
|
||||||
|
put_rpccred(msg.rpc_cred);
|
||||||
dprintk("NFS reply readdir: %d\n", status);
|
dprintk("NFS reply readdir: %d\n", status);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
|
@ -89,7 +89,7 @@ struct nfs_open_context {
|
||||||
|
|
||||||
struct nfs_open_dir_context {
|
struct nfs_open_dir_context {
|
||||||
struct list_head list;
|
struct list_head list;
|
||||||
struct rpc_cred *cred;
|
const struct cred *cred;
|
||||||
unsigned long attr_gencount;
|
unsigned long attr_gencount;
|
||||||
__u64 dir_cookie;
|
__u64 dir_cookie;
|
||||||
__u64 dup_cookie;
|
__u64 dup_cookie;
|
||||||
|
|
|
@ -1634,7 +1634,7 @@ struct nfs_rpc_ops {
|
||||||
unsigned int, struct iattr *);
|
unsigned int, struct iattr *);
|
||||||
int (*mkdir) (struct inode *, struct dentry *, struct iattr *);
|
int (*mkdir) (struct inode *, struct dentry *, struct iattr *);
|
||||||
int (*rmdir) (struct inode *, const struct qstr *);
|
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);
|
u64, struct page **, unsigned int, bool);
|
||||||
int (*mknod) (struct inode *, struct dentry *, struct iattr *,
|
int (*mknod) (struct inode *, struct dentry *, struct iattr *,
|
||||||
dev_t);
|
dev_t);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче