Commit a52458b4 authored by NeilBrown's avatar NeilBrown Committed by Anna Schumaker

NFS/NFSD/SUNRPC: replace generic creds with 'struct cred'.

SUNRPC has two sorts of credentials, both of which appear as
"struct rpc_cred".
There are "generic credentials" which are supplied by clients
such as NFS and passed in 'struct rpc_message' to indicate
which user should be used to authorize the request, and there
are low-level credentials such as AUTH_NULL, AUTH_UNIX, AUTH_GSS
which describe the credential to be sent over the wires.

This patch replaces all the generic credentials by 'struct cred'
pointers - the credential structure used throughout Linux.

For machine credentials, there is a special 'struct cred *' pointer
which is statically allocated and recognized where needed as
having a special meaning.  A look-up of a low-level cred will
map this to a machine credential.
Signed-off-by: default avatarNeilBrown <neilb@suse.com>
Acked-by: default avatarJ. Bruce Fields <bfields@redhat.com>
Signed-off-by: default avatarAnna Schumaker <Anna.Schumaker@Netapp.com>
parent 684f39b4
...@@ -256,7 +256,7 @@ static int nlm_wait_on_grace(wait_queue_head_t *queue) ...@@ -256,7 +256,7 @@ static int nlm_wait_on_grace(wait_queue_head_t *queue)
* Generic NLM call * Generic NLM call
*/ */
static int static int
nlmclnt_call(struct rpc_cred *cred, struct nlm_rqst *req, u32 proc) nlmclnt_call(const struct cred *cred, struct nlm_rqst *req, u32 proc)
{ {
struct nlm_host *host = req->a_host; struct nlm_host *host = req->a_host;
struct rpc_clnt *clnt; struct rpc_clnt *clnt;
...@@ -401,7 +401,7 @@ int nlm_async_reply(struct nlm_rqst *req, u32 proc, const struct rpc_call_ops *t ...@@ -401,7 +401,7 @@ int nlm_async_reply(struct nlm_rqst *req, u32 proc, const struct rpc_call_ops *t
* completion in order to be able to correctly track the lock * completion in order to be able to correctly track the lock
* state. * state.
*/ */
static int nlmclnt_async_call(struct rpc_cred *cred, struct nlm_rqst *req, u32 proc, const struct rpc_call_ops *tk_ops) static int nlmclnt_async_call(const struct cred *cred, struct nlm_rqst *req, u32 proc, const struct rpc_call_ops *tk_ops)
{ {
struct rpc_message msg = { struct rpc_message msg = {
.rpc_argp = &req->a_args, .rpc_argp = &req->a_args,
...@@ -510,7 +510,7 @@ static int do_vfs_lock(struct file_lock *fl) ...@@ -510,7 +510,7 @@ static int do_vfs_lock(struct file_lock *fl)
static int static int
nlmclnt_lock(struct nlm_rqst *req, struct file_lock *fl) nlmclnt_lock(struct nlm_rqst *req, struct file_lock *fl)
{ {
struct rpc_cred *cred = nfs_file_cred(fl->fl_file); const struct cred *cred = nfs_file_cred(fl->fl_file);
struct nlm_host *host = req->a_host; struct nlm_host *host = req->a_host;
struct nlm_res *resp = &req->a_res; struct nlm_res *resp = &req->a_res;
struct nlm_wait *block = NULL; struct nlm_wait *block = NULL;
......
...@@ -584,7 +584,7 @@ static int decode_sector_number(__be32 **rp, sector_t *sp) ...@@ -584,7 +584,7 @@ static int decode_sector_number(__be32 **rp, sector_t *sp)
static struct nfs4_deviceid_node * static struct nfs4_deviceid_node *
bl_find_get_deviceid(struct nfs_server *server, bl_find_get_deviceid(struct nfs_server *server,
const struct nfs4_deviceid *id, struct rpc_cred *cred, const struct nfs4_deviceid *id, const struct cred *cred,
gfp_t gfp_mask) gfp_t gfp_mask)
{ {
struct nfs4_deviceid_node *node; struct nfs4_deviceid_node *node;
......
...@@ -26,10 +26,8 @@ ...@@ -26,10 +26,8 @@
static void nfs_free_delegation(struct nfs_delegation *delegation) static void nfs_free_delegation(struct nfs_delegation *delegation)
{ {
if (delegation->cred) { put_cred(delegation->cred);
put_rpccred(delegation->cred); delegation->cred = NULL;
delegation->cred = NULL;
}
kfree_rcu(delegation, rcu); kfree_rcu(delegation, rcu);
} }
...@@ -178,13 +176,13 @@ static int nfs_delegation_claim_opens(struct inode *inode, ...@@ -178,13 +176,13 @@ static int nfs_delegation_claim_opens(struct inode *inode,
* @pagemod_limit: write delegation "space_limit" * @pagemod_limit: write delegation "space_limit"
* *
*/ */
void nfs_inode_reclaim_delegation(struct inode *inode, struct rpc_cred *cred, void nfs_inode_reclaim_delegation(struct inode *inode, const struct cred *cred,
fmode_t type, fmode_t type,
const nfs4_stateid *stateid, const nfs4_stateid *stateid,
unsigned long pagemod_limit) unsigned long pagemod_limit)
{ {
struct nfs_delegation *delegation; struct nfs_delegation *delegation;
struct rpc_cred *oldcred = NULL; const struct cred *oldcred = NULL;
rcu_read_lock(); rcu_read_lock();
delegation = rcu_dereference(NFS_I(inode)->delegation); delegation = rcu_dereference(NFS_I(inode)->delegation);
...@@ -195,12 +193,12 @@ void nfs_inode_reclaim_delegation(struct inode *inode, struct rpc_cred *cred, ...@@ -195,12 +193,12 @@ void nfs_inode_reclaim_delegation(struct inode *inode, struct rpc_cred *cred,
delegation->type = type; delegation->type = type;
delegation->pagemod_limit = pagemod_limit; delegation->pagemod_limit = pagemod_limit;
oldcred = delegation->cred; oldcred = delegation->cred;
delegation->cred = get_rpccred(cred); delegation->cred = get_cred(cred);
clear_bit(NFS_DELEGATION_NEED_RECLAIM, clear_bit(NFS_DELEGATION_NEED_RECLAIM,
&delegation->flags); &delegation->flags);
spin_unlock(&delegation->lock); spin_unlock(&delegation->lock);
rcu_read_unlock(); rcu_read_unlock();
put_rpccred(oldcred); put_cred(oldcred);
trace_nfs4_reclaim_delegation(inode, type); trace_nfs4_reclaim_delegation(inode, type);
return; return;
} }
...@@ -341,7 +339,7 @@ nfs_update_inplace_delegation(struct nfs_delegation *delegation, ...@@ -341,7 +339,7 @@ nfs_update_inplace_delegation(struct nfs_delegation *delegation,
* *
* Returns zero on success, or a negative errno value. * Returns zero on success, or a negative errno value.
*/ */
int nfs_inode_set_delegation(struct inode *inode, struct rpc_cred *cred, int nfs_inode_set_delegation(struct inode *inode, const struct cred *cred,
fmode_t type, fmode_t type,
const nfs4_stateid *stateid, const nfs4_stateid *stateid,
unsigned long pagemod_limit) unsigned long pagemod_limit)
...@@ -360,7 +358,7 @@ int nfs_inode_set_delegation(struct inode *inode, struct rpc_cred *cred, ...@@ -360,7 +358,7 @@ int nfs_inode_set_delegation(struct inode *inode, struct rpc_cred *cred,
delegation->type = type; delegation->type = type;
delegation->pagemod_limit = pagemod_limit; delegation->pagemod_limit = pagemod_limit;
delegation->change_attr = inode_peek_iversion_raw(inode); delegation->change_attr = inode_peek_iversion_raw(inode);
delegation->cred = get_rpccred(cred); delegation->cred = get_cred(cred);
delegation->inode = inode; delegation->inode = inode;
delegation->flags = 1<<NFS_DELEGATION_REFERENCED; delegation->flags = 1<<NFS_DELEGATION_REFERENCED;
spin_lock_init(&delegation->lock); spin_lock_init(&delegation->lock);
...@@ -1047,7 +1045,7 @@ void nfs_reap_expired_delegations(struct nfs_client *clp) ...@@ -1047,7 +1045,7 @@ void nfs_reap_expired_delegations(struct nfs_client *clp)
struct nfs_delegation *delegation; struct nfs_delegation *delegation;
struct nfs_server *server; struct nfs_server *server;
struct inode *inode; struct inode *inode;
struct rpc_cred *cred; const struct cred *cred;
nfs4_stateid stateid; nfs4_stateid stateid;
restart: restart:
...@@ -1069,7 +1067,7 @@ void nfs_reap_expired_delegations(struct nfs_client *clp) ...@@ -1069,7 +1067,7 @@ void nfs_reap_expired_delegations(struct nfs_client *clp)
nfs_sb_deactive(server->super); nfs_sb_deactive(server->super);
goto restart; goto restart;
} }
cred = get_rpccred_rcu(delegation->cred); cred = get_cred_rcu(delegation->cred);
nfs4_stateid_copy(&stateid, &delegation->stateid); nfs4_stateid_copy(&stateid, &delegation->stateid);
clear_bit(NFS_DELEGATION_TEST_EXPIRED, &delegation->flags); clear_bit(NFS_DELEGATION_TEST_EXPIRED, &delegation->flags);
rcu_read_unlock(); rcu_read_unlock();
...@@ -1078,7 +1076,7 @@ void nfs_reap_expired_delegations(struct nfs_client *clp) ...@@ -1078,7 +1076,7 @@ void nfs_reap_expired_delegations(struct nfs_client *clp)
nfs_revoke_delegation(inode, &stateid); nfs_revoke_delegation(inode, &stateid);
nfs_inode_find_state_and_recover(inode, &stateid); nfs_inode_find_state_and_recover(inode, &stateid);
} }
put_rpccred(cred); put_cred(cred);
if (nfs4_server_rebooted(clp)) { if (nfs4_server_rebooted(clp)) {
nfs_inode_mark_test_expired_delegation(server,inode); nfs_inode_mark_test_expired_delegation(server,inode);
iput(inode); iput(inode);
...@@ -1173,7 +1171,7 @@ bool nfs4_refresh_delegation_stateid(nfs4_stateid *dst, struct inode *inode) ...@@ -1173,7 +1171,7 @@ bool nfs4_refresh_delegation_stateid(nfs4_stateid *dst, struct inode *inode)
* otherwise "false" is returned. * otherwise "false" is returned.
*/ */
bool nfs4_copy_delegation_stateid(struct inode *inode, fmode_t flags, bool nfs4_copy_delegation_stateid(struct inode *inode, fmode_t flags,
nfs4_stateid *dst, struct rpc_cred **cred) nfs4_stateid *dst, const struct cred **cred)
{ {
struct nfs_inode *nfsi = NFS_I(inode); struct nfs_inode *nfsi = NFS_I(inode);
struct nfs_delegation *delegation; struct nfs_delegation *delegation;
...@@ -1187,7 +1185,7 @@ bool nfs4_copy_delegation_stateid(struct inode *inode, fmode_t flags, ...@@ -1187,7 +1185,7 @@ bool nfs4_copy_delegation_stateid(struct inode *inode, fmode_t flags,
nfs4_stateid_copy(dst, &delegation->stateid); nfs4_stateid_copy(dst, &delegation->stateid);
nfs_mark_delegation_referenced(delegation); nfs_mark_delegation_referenced(delegation);
if (cred) if (cred)
*cred = get_rpccred(delegation->cred); *cred = get_cred(delegation->cred);
} }
rcu_read_unlock(); rcu_read_unlock();
return ret; return ret;
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
*/ */
struct nfs_delegation { struct nfs_delegation {
struct list_head super_list; struct list_head super_list;
struct rpc_cred *cred; const struct cred *cred;
struct inode *inode; struct inode *inode;
nfs4_stateid stateid; nfs4_stateid stateid;
fmode_t type; fmode_t type;
...@@ -36,9 +36,9 @@ enum { ...@@ -36,9 +36,9 @@ enum {
NFS_DELEGATION_TEST_EXPIRED, NFS_DELEGATION_TEST_EXPIRED,
}; };
int nfs_inode_set_delegation(struct inode *inode, struct rpc_cred *cred, int nfs_inode_set_delegation(struct inode *inode, const struct cred *cred,
fmode_t type, const nfs4_stateid *stateid, unsigned long pagemod_limit); fmode_t type, const nfs4_stateid *stateid, unsigned long pagemod_limit);
void nfs_inode_reclaim_delegation(struct inode *inode, struct rpc_cred *cred, void nfs_inode_reclaim_delegation(struct inode *inode, const struct cred *cred,
fmode_t type, const nfs4_stateid *stateid, unsigned long pagemod_limit); fmode_t type, const nfs4_stateid *stateid, unsigned long pagemod_limit);
int nfs4_inode_return_delegation(struct inode *inode); int nfs4_inode_return_delegation(struct inode *inode);
int nfs_async_inode_return_delegation(struct inode *inode, const nfs4_stateid *stateid); int nfs_async_inode_return_delegation(struct inode *inode, const nfs4_stateid *stateid);
...@@ -60,10 +60,10 @@ void nfs_mark_test_expired_all_delegations(struct nfs_client *clp); ...@@ -60,10 +60,10 @@ void nfs_mark_test_expired_all_delegations(struct nfs_client *clp);
void nfs_reap_expired_delegations(struct nfs_client *clp); void nfs_reap_expired_delegations(struct nfs_client *clp);
/* NFSv4 delegation-related procedures */ /* NFSv4 delegation-related procedures */
int nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4_stateid *stateid, int issync); int nfs4_proc_delegreturn(struct inode *inode, const struct cred *cred, const nfs4_stateid *stateid, int issync);
int nfs4_open_delegation_recall(struct nfs_open_context *ctx, struct nfs4_state *state, const nfs4_stateid *stateid, fmode_t type); int nfs4_open_delegation_recall(struct nfs_open_context *ctx, struct nfs4_state *state, const nfs4_stateid *stateid, fmode_t type);
int nfs4_lock_delegation_recall(struct file_lock *fl, struct nfs4_state *state, const nfs4_stateid *stateid); int nfs4_lock_delegation_recall(struct file_lock *fl, struct nfs4_state *state, const nfs4_stateid *stateid);
bool nfs4_copy_delegation_stateid(struct inode *inode, fmode_t flags, nfs4_stateid *dst, struct rpc_cred **cred); bool nfs4_copy_delegation_stateid(struct inode *inode, fmode_t flags, nfs4_stateid *dst, const struct cred **cred);
bool nfs4_refresh_delegation_stateid(nfs4_stateid *dst, struct inode *inode); bool nfs4_refresh_delegation_stateid(nfs4_stateid *dst, struct inode *inode);
void nfs_mark_delegation_referenced(struct nfs_delegation *delegation); void nfs_mark_delegation_referenced(struct nfs_delegation *delegation);
......
...@@ -224,16 +224,14 @@ static struct nfs4_ff_layout_mirror *ff_layout_alloc_mirror(gfp_t gfp_flags) ...@@ -224,16 +224,14 @@ static struct nfs4_ff_layout_mirror *ff_layout_alloc_mirror(gfp_t gfp_flags)
static void ff_layout_free_mirror(struct nfs4_ff_layout_mirror *mirror) static void ff_layout_free_mirror(struct nfs4_ff_layout_mirror *mirror)
{ {
struct rpc_cred *cred; const struct cred *cred;
ff_layout_remove_mirror(mirror); ff_layout_remove_mirror(mirror);
kfree(mirror->fh_versions); kfree(mirror->fh_versions);
cred = rcu_access_pointer(mirror->ro_cred); cred = rcu_access_pointer(mirror->ro_cred);
if (cred) put_cred(cred);
put_rpccred(cred);
cred = rcu_access_pointer(mirror->rw_cred); cred = rcu_access_pointer(mirror->rw_cred);
if (cred) put_cred(cred);
put_rpccred(cred);
nfs4_ff_layout_put_deviceid(mirror->mirror_ds); nfs4_ff_layout_put_deviceid(mirror->mirror_ds);
kfree(mirror); kfree(mirror);
} }
...@@ -411,9 +409,8 @@ ff_layout_alloc_lseg(struct pnfs_layout_hdr *lh, ...@@ -411,9 +409,8 @@ ff_layout_alloc_lseg(struct pnfs_layout_hdr *lh,
for (i = 0; i < fls->mirror_array_cnt; i++) { for (i = 0; i < fls->mirror_array_cnt; i++) {
struct nfs4_ff_layout_mirror *mirror; struct nfs4_ff_layout_mirror *mirror;
struct auth_cred acred = {};
struct rpc_cred __rcu *cred;
struct cred *kcred; struct cred *kcred;
const struct cred *cred;
kuid_t uid; kuid_t uid;
kgid_t gid; kgid_t gid;
u32 ds_count, fh_count, id; u32 ds_count, fh_count, id;
...@@ -504,15 +501,7 @@ ff_layout_alloc_lseg(struct pnfs_layout_hdr *lh, ...@@ -504,15 +501,7 @@ ff_layout_alloc_lseg(struct pnfs_layout_hdr *lh,
goto out_err_free; goto out_err_free;
kcred->fsuid = uid; kcred->fsuid = uid;
kcred->fsgid = gid; kcred->fsgid = gid;
acred.cred = kcred; cred = kcred;
/* find the cred for it */
rcu_assign_pointer(cred, rpc_lookup_generic_cred(&acred, 0, gfp_flags));
put_cred(kcred);
if (IS_ERR(cred)) {
rc = PTR_ERR(cred);
goto out_err_free;
}
if (lgr->range.iomode == IOMODE_READ) if (lgr->range.iomode == IOMODE_READ)
rcu_assign_pointer(fls->mirror_array[i]->ro_cred, cred); rcu_assign_pointer(fls->mirror_array[i]->ro_cred, cred);
...@@ -1714,7 +1703,7 @@ ff_layout_read_pagelist(struct nfs_pgio_header *hdr) ...@@ -1714,7 +1703,7 @@ ff_layout_read_pagelist(struct nfs_pgio_header *hdr)
struct pnfs_layout_segment *lseg = hdr->lseg; struct pnfs_layout_segment *lseg = hdr->lseg;
struct nfs4_pnfs_ds *ds; struct nfs4_pnfs_ds *ds;
struct rpc_clnt *ds_clnt; struct rpc_clnt *ds_clnt;
struct rpc_cred *ds_cred; const struct cred *ds_cred;
loff_t offset = hdr->args.offset; loff_t offset = hdr->args.offset;
u32 idx = hdr->pgio_mirror_idx; u32 idx = hdr->pgio_mirror_idx;
int vers; int vers;
...@@ -1765,7 +1754,7 @@ ff_layout_read_pagelist(struct nfs_pgio_header *hdr) ...@@ -1765,7 +1754,7 @@ ff_layout_read_pagelist(struct nfs_pgio_header *hdr)
vers == 3 ? &ff_layout_read_call_ops_v3 : vers == 3 ? &ff_layout_read_call_ops_v3 :
&ff_layout_read_call_ops_v4, &ff_layout_read_call_ops_v4,
0, RPC_TASK_SOFTCONN); 0, RPC_TASK_SOFTCONN);
put_rpccred(ds_cred); put_cred(ds_cred);
return PNFS_ATTEMPTED; return PNFS_ATTEMPTED;
out_failed: out_failed:
...@@ -1781,7 +1770,7 @@ ff_layout_write_pagelist(struct nfs_pgio_header *hdr, int sync) ...@@ -1781,7 +1770,7 @@ ff_layout_write_pagelist(struct nfs_pgio_header *hdr, int sync)
struct pnfs_layout_segment *lseg = hdr->lseg; struct pnfs_layout_segment *lseg = hdr->lseg;
struct nfs4_pnfs_ds *ds; struct nfs4_pnfs_ds *ds;
struct rpc_clnt *ds_clnt; struct rpc_clnt *ds_clnt;
struct rpc_cred *ds_cred; const struct cred *ds_cred;
loff_t offset = hdr->args.offset; loff_t offset = hdr->args.offset;
int vers; int vers;
struct nfs_fh *fh; struct nfs_fh *fh;
...@@ -1830,7 +1819,7 @@ ff_layout_write_pagelist(struct nfs_pgio_header *hdr, int sync) ...@@ -1830,7 +1819,7 @@ ff_layout_write_pagelist(struct nfs_pgio_header *hdr, int sync)
vers == 3 ? &ff_layout_write_call_ops_v3 : vers == 3 ? &ff_layout_write_call_ops_v3 :
&ff_layout_write_call_ops_v4, &ff_layout_write_call_ops_v4,
sync, RPC_TASK_SOFTCONN); sync, RPC_TASK_SOFTCONN);
put_rpccred(ds_cred); put_cred(ds_cred);
return PNFS_ATTEMPTED; return PNFS_ATTEMPTED;
out_failed: out_failed:
...@@ -1860,7 +1849,7 @@ static int ff_layout_initiate_commit(struct nfs_commit_data *data, int how) ...@@ -1860,7 +1849,7 @@ static int ff_layout_initiate_commit(struct nfs_commit_data *data, int how)
struct pnfs_layout_segment *lseg = data->lseg; struct pnfs_layout_segment *lseg = data->lseg;
struct nfs4_pnfs_ds *ds; struct nfs4_pnfs_ds *ds;
struct rpc_clnt *ds_clnt; struct rpc_clnt *ds_clnt;
struct rpc_cred *ds_cred; const struct cred *ds_cred;
u32 idx; u32 idx;
int vers, ret; int vers, ret;
struct nfs_fh *fh; struct nfs_fh *fh;
...@@ -1900,7 +1889,7 @@ static int ff_layout_initiate_commit(struct nfs_commit_data *data, int how) ...@@ -1900,7 +1889,7 @@ static int ff_layout_initiate_commit(struct nfs_commit_data *data, int how)
vers == 3 ? &ff_layout_commit_call_ops_v3 : vers == 3 ? &ff_layout_commit_call_ops_v3 :
&ff_layout_commit_call_ops_v4, &ff_layout_commit_call_ops_v4,
how, RPC_TASK_SOFTCONN); how, RPC_TASK_SOFTCONN);
put_rpccred(ds_cred); put_cred(ds_cred);
return ret; return ret;
out_err: out_err:
pnfs_generic_prepare_to_resend_writes(data); pnfs_generic_prepare_to_resend_writes(data);
......
...@@ -81,8 +81,8 @@ struct nfs4_ff_layout_mirror { ...@@ -81,8 +81,8 @@ struct nfs4_ff_layout_mirror {
u32 fh_versions_cnt; u32 fh_versions_cnt;
struct nfs_fh *fh_versions; struct nfs_fh *fh_versions;
nfs4_stateid stateid; nfs4_stateid stateid;
struct rpc_cred __rcu *ro_cred; const struct cred __rcu *ro_cred;
struct rpc_cred __rcu *rw_cred; const struct cred __rcu *rw_cred;
refcount_t ref; refcount_t ref;
spinlock_t lock; spinlock_t lock;
unsigned long flags; unsigned long flags;
...@@ -229,8 +229,8 @@ nfs4_ff_find_or_create_ds_client(struct pnfs_layout_segment *lseg, ...@@ -229,8 +229,8 @@ nfs4_ff_find_or_create_ds_client(struct pnfs_layout_segment *lseg,
u32 ds_idx, u32 ds_idx,
struct nfs_client *ds_clp, struct nfs_client *ds_clp,
struct inode *inode); struct inode *inode);
struct rpc_cred *ff_layout_get_ds_cred(struct pnfs_layout_segment *lseg, const struct cred *ff_layout_get_ds_cred(struct pnfs_layout_segment *lseg,
u32 ds_idx, struct rpc_cred *mdscred); u32 ds_idx, const struct cred *mdscred);
bool ff_layout_avoid_mds_available_ds(struct pnfs_layout_segment *lseg); bool ff_layout_avoid_mds_available_ds(struct pnfs_layout_segment *lseg);
bool ff_layout_avoid_read_on_rw(struct pnfs_layout_segment *lseg); bool ff_layout_avoid_read_on_rw(struct pnfs_layout_segment *lseg);
......
...@@ -330,10 +330,10 @@ int ff_layout_track_ds_error(struct nfs4_flexfile_layout *flo, ...@@ -330,10 +330,10 @@ int ff_layout_track_ds_error(struct nfs4_flexfile_layout *flo,
return 0; return 0;
} }
static struct rpc_cred * static const struct cred *
ff_layout_get_mirror_cred(struct nfs4_ff_layout_mirror *mirror, u32 iomode) ff_layout_get_mirror_cred(struct nfs4_ff_layout_mirror *mirror, u32 iomode)
{ {
struct rpc_cred *cred, __rcu **pcred; const struct cred *cred, __rcu **pcred;
if (iomode == IOMODE_READ) if (iomode == IOMODE_READ)
pcred = &mirror->ro_cred; pcred = &mirror->ro_cred;
...@@ -346,7 +346,7 @@ ff_layout_get_mirror_cred(struct nfs4_ff_layout_mirror *mirror, u32 iomode) ...@@ -346,7 +346,7 @@ ff_layout_get_mirror_cred(struct nfs4_ff_layout_mirror *mirror, u32 iomode)
if (!cred) if (!cred)
break; break;
cred = get_rpccred_rcu(cred); cred = get_cred_rcu(cred);
} while(!cred); } while(!cred);
rcu_read_unlock(); rcu_read_unlock();
return cred; return cred;
...@@ -465,19 +465,19 @@ nfs4_ff_layout_prepare_ds(struct pnfs_layout_segment *lseg, u32 ds_idx, ...@@ -465,19 +465,19 @@ nfs4_ff_layout_prepare_ds(struct pnfs_layout_segment *lseg, u32 ds_idx,
return ds; return ds;
} }
struct rpc_cred * const struct cred *
ff_layout_get_ds_cred(struct pnfs_layout_segment *lseg, u32 ds_idx, ff_layout_get_ds_cred(struct pnfs_layout_segment *lseg, u32 ds_idx,
struct rpc_cred *mdscred) const struct cred *mdscred)
{ {
struct nfs4_ff_layout_mirror *mirror = FF_LAYOUT_COMP(lseg, ds_idx); struct nfs4_ff_layout_mirror *mirror = FF_LAYOUT_COMP(lseg, ds_idx);
struct rpc_cred *cred; const struct cred *cred;
if (mirror && !mirror->mirror_ds->ds_versions[0].tightly_coupled) { if (mirror && !mirror->mirror_ds->ds_versions[0].tightly_coupled) {
cred = ff_layout_get_mirror_cred(mirror, lseg->pls_range.iomode); cred = ff_layout_get_mirror_cred(mirror, lseg->pls_range.iomode);
if (!cred) if (!cred)
cred = get_rpccred(mdscred); cred = get_cred(mdscred);
} else { } else {
cred = get_rpccred(mdscred); cred = get_cred(mdscred);
} }
return cred; return cred;
} }
......
...@@ -950,13 +950,11 @@ struct nfs_open_context *alloc_nfs_open_context(struct dentry *dentry, ...@@ -950,13 +950,11 @@ struct nfs_open_context *alloc_nfs_open_context(struct dentry *dentry,
struct file *filp) struct file *filp)
{ {
struct nfs_open_context *ctx; struct nfs_open_context *ctx;
struct rpc_cred *cred = rpc_lookup_cred(); const struct cred *cred = get_current_cred();
if (IS_ERR(cred))
return ERR_CAST(cred);
ctx = kmalloc(sizeof(*ctx), GFP_KERNEL); ctx = kmalloc(sizeof(*ctx), GFP_KERNEL);
if (!ctx) { if (!ctx) {
put_rpccred(cred); put_cred(cred);
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
} }
nfs_sb_active(dentry->d_sb); nfs_sb_active(dentry->d_sb);
...@@ -998,8 +996,7 @@ static void __put_nfs_open_context(struct nfs_open_context *ctx, int is_sync) ...@@ -998,8 +996,7 @@ static void __put_nfs_open_context(struct nfs_open_context *ctx, int is_sync)
} }
if (inode != NULL) if (inode != NULL)
NFS_PROTO(inode)->close_context(ctx, is_sync); NFS_PROTO(inode)->close_context(ctx, is_sync);
if (ctx->cred != NULL) put_cred(ctx->cred);
put_rpccred(ctx->cred);
dput(ctx->dentry); dput(ctx->dentry);
nfs_sb_deactive(sb); nfs_sb_deactive(sb);
put_rpccred(ctx->ll_cred); put_rpccred(ctx->ll_cred);
...@@ -1044,7 +1041,7 @@ EXPORT_SYMBOL_GPL(nfs_file_set_open_context); ...@@ -1044,7 +1041,7 @@ EXPORT_SYMBOL_GPL(nfs_file_set_open_context);
/* /*
* Given an inode, search for an open context with the desired characteristics * Given an inode, search for an open context with the desired characteristics
*/ */
struct nfs_open_context *nfs_find_open_context(struct inode *inode, struct rpc_cred *cred, fmode_t mode) struct nfs_open_context *nfs_find_open_context(struct inode *inode, const struct cred *cred, fmode_t mode)
{ {
struct nfs_inode *nfsi = NFS_I(inode); struct nfs_inode *nfsi = NFS_I(inode);
struct nfs_open_context *pos, *ctx = NULL; struct nfs_open_context *pos, *ctx = NULL;
......
...@@ -254,7 +254,7 @@ struct nfs_pgio_header *nfs_pgio_header_alloc(const struct nfs_rw_ops *); ...@@ -254,7 +254,7 @@ struct nfs_pgio_header *nfs_pgio_header_alloc(const struct nfs_rw_ops *);
void nfs_pgio_header_free(struct nfs_pgio_header *); void nfs_pgio_header_free(struct nfs_pgio_header *);
int nfs_generic_pgio(struct nfs_pageio_descriptor *, struct nfs_pgio_header *); int nfs_generic_pgio(struct nfs_pageio_descriptor *, struct nfs_pgio_header *);
int nfs_initiate_pgio(struct rpc_clnt *clnt, struct nfs_pgio_header *hdr, int nfs_initiate_pgio(struct rpc_clnt *clnt, struct nfs_pgio_header *hdr,
struct rpc_cred *cred, const struct nfs_rpc_ops *rpc_ops, const struct cred *cred, const struct nfs_rpc_ops *rpc_ops,
const struct rpc_call_ops *call_ops, int how, int flags); const struct rpc_call_ops *call_ops, int how, int flags);
void nfs_free_request(struct nfs_page *req); void nfs_free_request(struct nfs_page *req);
struct nfs_pgio_mirror * struct nfs_pgio_mirror *
...@@ -269,7 +269,7 @@ static inline bool nfs_pgio_has_mirroring(struct nfs_pageio_descriptor *desc) ...@@ -269,7 +269,7 @@ static inline bool nfs_pgio_has_mirroring(struct nfs_pageio_descriptor *desc)
static inline bool nfs_match_open_context(const struct nfs_open_context *ctx1, static inline bool nfs_match_open_context(const struct nfs_open_context *ctx1,
const struct nfs_open_context *ctx2) const struct nfs_open_context *ctx2)
{ {
return ctx1->cred == ctx2->cred && ctx1->state == ctx2->state; return cred_fscmp(ctx1->cred, ctx2->cred) == 0 && ctx1->state == ctx2->state;
} }
/* nfs2xdr.c */ /* nfs2xdr.c */
...@@ -564,10 +564,10 @@ extern struct nfs_client *nfs4_init_client(struct nfs_client *clp, ...@@ -564,10 +564,10 @@ extern struct nfs_client *nfs4_init_client(struct nfs_client *clp,
const struct nfs_client_initdata *); const struct nfs_client_initdata *);
extern int nfs40_walk_client_list(struct nfs_client *clp, extern int nfs40_walk_client_list(struct nfs_client *clp,
struct nfs_client **result, struct nfs_client **result,
struct rpc_cred *cred); const struct cred *cred);
extern int nfs41_walk_client_list(struct nfs_client *clp, extern int nfs41_walk_client_list(struct nfs_client *clp,
struct nfs_client **result, struct nfs_client **result,
struct rpc_cred *cred); const struct cred *cred);
extern int nfs4_test_session_trunk(struct rpc_clnt *, extern int nfs4_test_session_trunk(struct rpc_clnt *,
struct rpc_xprt *, struct rpc_xprt *,
void *); void *);
......
...@@ -195,20 +195,15 @@ static int nfs3_proc_access(struct inode *inode, struct nfs_access_entry *entry) ...@@ -195,20 +195,15 @@ static int nfs3_proc_access(struct inode *inode, struct nfs_access_entry *entry)
.access = entry->mask, .access = entry->mask,
}; };
struct nfs3_accessres res; struct nfs3_accessres res;
struct auth_cred acred = {
.cred = entry->cred,
};
struct rpc_message msg = { struct rpc_message msg = {
.rpc_proc = &nfs3_procedures[NFS3PROC_ACCESS], .rpc_proc = &nfs3_procedures[NFS3PROC_ACCESS],
.rpc_argp = &arg, .rpc_argp = &arg,
.rpc_resp = &res, .rpc_resp = &res,
.rpc_cred = rpc_lookup_generic_cred(&acred, 0, GFP_NOFS), .rpc_cred = entry->cred,
}; };
int status = -ENOMEM; int status = -ENOMEM;
dprintk("NFS call access\n"); dprintk("NFS call access\n");
if (!msg.rpc_cred)
goto out;
res.fattr = nfs_alloc_fattr(); res.fattr = nfs_alloc_fattr();
if (res.fattr == NULL) if (res.fattr == NULL)
goto out; goto out;
...@@ -219,8 +214,6 @@ static int nfs3_proc_access(struct inode *inode, struct nfs_access_entry *entry) ...@@ -219,8 +214,6 @@ static int nfs3_proc_access(struct inode *inode, struct nfs_access_entry *entry)
nfs_access_set_mask(entry, res.access); nfs_access_set_mask(entry, res.access);
nfs_free_fattr(res.fattr); nfs_free_fattr(res.fattr);
out: out:
if (msg.rpc_cred)
put_rpccred(msg.rpc_cred);
dprintk("NFS reply access: %d\n", status); dprintk("NFS reply access: %d\n", status);
return status; return status;
} }
...@@ -631,15 +624,11 @@ nfs3_proc_readdir(struct dentry *dentry, const struct cred *cred, ...@@ -631,15 +624,11 @@ nfs3_proc_readdir(struct dentry *dentry, const struct 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 = rpc_lookup_generic_cred(&acred, .rpc_cred = cred,
0, GFP_NOFS),
}; };
int status = -ENOMEM; int status = -ENOMEM;
...@@ -649,8 +638,6 @@ nfs3_proc_readdir(struct dentry *dentry, const struct cred *cred, ...@@ -649,8 +638,6 @@ nfs3_proc_readdir(struct dentry *dentry, const struct 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;
...@@ -662,7 +649,6 @@ nfs3_proc_readdir(struct dentry *dentry, const struct cred *cred, ...@@ -662,7 +649,6 @@ nfs3_proc_readdir(struct dentry *dentry, const struct 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;
......
...@@ -62,7 +62,7 @@ struct nfs4_minor_version_ops { ...@@ -62,7 +62,7 @@ struct nfs4_minor_version_ops {
void (*free_lock_state)(struct nfs_server *, void (*free_lock_state)(struct nfs_server *,
struct nfs4_lock_state *); struct nfs4_lock_state *);
int (*test_and_free_expired)(struct nfs_server *, int (*test_and_free_expired)(struct nfs_server *,
nfs4_stateid *, struct rpc_cred *); nfs4_stateid *, const struct cred *);
struct nfs_seqid * struct nfs_seqid *
(*alloc_seqid)(struct nfs_seqid_counter *, gfp_t); (*alloc_seqid)(struct nfs_seqid_counter *, gfp_t);
int (*session_trunk)(struct rpc_clnt *, struct rpc_xprt *, void *); int (*session_trunk)(struct rpc_clnt *, struct rpc_xprt *, void *);
...@@ -107,7 +107,7 @@ struct nfs4_state_owner { ...@@ -107,7 +107,7 @@ struct nfs4_state_owner {
unsigned long so_expires; unsigned long so_expires;
struct rb_node so_server_node; struct rb_node so_server_node;
struct rpc_cred *so_cred; /* Associated cred */ const struct cred *so_cred; /* Associated cred */
spinlock_t so_lock; spinlock_t so_lock;
atomic_t so_count; atomic_t so_count;
...@@ -212,10 +212,10 @@ struct nfs4_state_recovery_ops { ...@@ -212,10 +212,10 @@ struct nfs4_state_recovery_ops {
int state_flag_bit; int state_flag_bit;
int (*recover_open)(struct nfs4_state_owner *, struct nfs4_state *); int (*recover_open)(struct nfs4_state_owner *, struct nfs4_state *);
int (*recover_lock)(struct nfs4_state *, struct file_lock *); int (*recover_lock)(struct nfs4_state *, struct file_lock *);
int (*establish_clid)(struct nfs_client *, struct rpc_cred *); int (*establish_clid)(struct nfs_client *, const struct cred *);
int (*reclaim_complete)(struct nfs_client *, struct rpc_cred *); int (*reclaim_complete)(struct nfs_client *, const struct cred *);
int (*detect_trunking)(struct nfs_client *, struct nfs_client **, int (*detect_trunking)(struct nfs_client *, struct nfs_client **,
struct rpc_cred *); const struct cred *);
}; };
struct nfs4_opendata { struct nfs4_opendata {
...@@ -245,19 +245,19 @@ struct nfs4_opendata { ...@@ -245,19 +245,19 @@ struct nfs4_opendata {
struct nfs4_add_xprt_data { struct nfs4_add_xprt_data {
struct nfs_client *clp; struct nfs_client *clp;
struct rpc_cred *cred; const struct cred *cred;
}; };
struct nfs4_state_maintenance_ops { struct nfs4_state_maintenance_ops {
int (*sched_state_renewal)(struct nfs_client *, struct rpc_cred *, unsigned); int (*sched_state_renewal)(struct nfs_client *, const struct cred *, unsigned);
struct rpc_cred * (*get_state_renewal_cred)(struct nfs_client *); const struct cred * (*get_state_renewal_cred)(struct nfs_client *);
int (*renew_lease)(struct nfs_client *, struct rpc_cred *); int (*renew_lease)(struct nfs_client *, const struct cred *);
}; };
struct nfs4_mig_recovery_ops { struct nfs4_mig_recovery_ops {
int (*get_locations)(struct inode *, struct nfs4_fs_locations *, int (*get_locations)(struct inode *, struct nfs4_fs_locations *,
struct page *, struct rpc_cred *); struct page *, const struct cred *);
int (*fsid_present)(struct inode *, struct rpc_cred *); int (*fsid_present)(struct inode *, const struct cred *);
}; };
extern const struct dentry_operations nfs4_dentry_operations; extern const struct dentry_operations nfs4_dentry_operations;
...@@ -286,21 +286,21 @@ extern int nfs4_call_sync(struct rpc_clnt *, struct nfs_server *, ...@@ -286,21 +286,21 @@ extern int nfs4_call_sync(struct rpc_clnt *, struct nfs_server *,
struct rpc_message *, struct nfs4_sequence_args *, struct rpc_message *, struct nfs4_sequence_args *,
struct nfs4_sequence_res *, int); struct nfs4_sequence_res *, int);
extern void nfs4_init_sequence(struct nfs4_sequence_args *, struct nfs4_sequence_res *, int, int); extern void nfs4_init_sequence(struct nfs4_sequence_args *, struct nfs4_sequence_res *, int, int);
extern int nfs4_proc_setclientid(struct nfs_client *, u32, unsigned short, struct rpc_cred *, struct nfs4_setclientid_res *); extern int nfs4_proc_setclientid(struct nfs_client *, u32, unsigned short, const struct cred *, struct nfs4_setclientid_res *);
extern int nfs4_proc_setclientid_confirm(struct nfs_client *, struct nfs4_setclientid_res *arg, struct rpc_cred *); extern int nfs4_proc_setclientid_confirm(struct nfs_client *, struct nfs4_setclientid_res *arg, const struct cred *);
extern int nfs4_proc_get_rootfh(struct nfs_server *, struct nfs_fh *, struct nfs_fsinfo *, bool); extern int nfs4_proc_get_rootfh(struct nfs_server *, struct nfs_fh *, struct nfs_fsinfo *, bool);
extern int nfs4_proc_bind_conn_to_session(struct nfs_client *, struct rpc_cred *cred); extern int nfs4_proc_bind_conn_to_session(struct nfs_client *, const struct cred *cred);
extern int nfs4_proc_exchange_id(struct nfs_client *clp, struct rpc_cred *cred); extern int nfs4_proc_exchange_id(struct nfs_client *clp, const struct cred *cred);
extern int nfs4_destroy_clientid(struct nfs_client *clp); extern int nfs4_destroy_clientid(struct nfs_client *clp);
extern int nfs4_init_clientid(struct nfs_client *, struct rpc_cred *); extern int nfs4_init_clientid(struct nfs_client *, const struct cred *);
extern int nfs41_init_clientid(struct nfs_client *, struct rpc_cred *); extern int nfs41_init_clientid(struct nfs_client *, const struct cred *);
extern int nfs4_do_close(struct nfs4_state *state, gfp_t gfp_mask, int wait); extern int nfs4_do_close(struct nfs4_state *state, gfp_t gfp_mask, int wait);
extern int nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fhandle); extern int nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fhandle);
extern int nfs4_proc_fs_locations(struct rpc_clnt *, struct inode *, const struct qstr *, extern int nfs4_proc_fs_locations(struct rpc_clnt *, struct inode *, const struct qstr *,
struct nfs4_fs_locations *, struct page *); struct nfs4_fs_locations *, struct page *);
extern int nfs4_proc_get_locations(struct inode *, struct nfs4_fs_locations *, extern int nfs4_proc_get_locations(struct inode *, struct nfs4_fs_locations *,
struct page *page, struct rpc_cred *); struct page *page, const struct cred *);
extern int nfs4_proc_fsid_present(struct inode *, struct rpc_cred *); extern int nfs4_proc_fsid_present(struct inode *, const struct cred *);
extern struct rpc_clnt *nfs4_proc_lookup_mountpoint(struct inode *, const struct qstr *, extern struct rpc_clnt *nfs4_proc_lookup_mountpoint(struct inode *, const struct qstr *,
struct nfs_fh *, struct nfs_fattr *); struct nfs_fh *, struct nfs_fattr *);
extern int nfs4_proc_secinfo(struct inode *, const struct qstr *, struct nfs4_secinfo_flavors *); extern int nfs4_proc_secinfo(struct inode *, const struct qstr *, struct nfs4_secinfo_flavors *);
...@@ -312,8 +312,8 @@ extern int nfs4_set_rw_stateid(nfs4_stateid *stateid, ...@@ -312,8 +312,8 @@ extern int nfs4_set_rw_stateid(nfs4_stateid *stateid,
#if defined(CONFIG_NFS_V4_1) #if defined(CONFIG_NFS_V4_1)
extern int nfs41_sequence_done(struct rpc_task *, struct nfs4_sequence_res *); extern int nfs41_sequence_done(struct rpc_task *, struct nfs4_sequence_res *);
extern int nfs4_proc_create_session(struct nfs_client *, struct rpc_cred *); extern int nfs4_proc_create_session(struct nfs_client *, const struct cred *);
extern int nfs4_proc_destroy_session(struct nfs4_session *, struct rpc_cred *); extern int nfs4_proc_destroy_session(struct nfs4_session *, const struct cred *);
extern int nfs4_proc_get_lease_time(struct nfs_client *clp, extern int nfs4_proc_get_lease_time(struct nfs_client *clp,
struct nfs_fsinfo *fsinfo); struct nfs_fsinfo *fsinfo);
extern int nfs4_proc_layoutcommit(struct nfs4_layoutcommit_data *data, extern int nfs4_proc_layoutcommit(struct nfs4_layoutcommit_data *data,
...@@ -443,16 +443,16 @@ extern void nfs4_set_lease_period(struct nfs_client *clp, ...@@ -443,16 +443,16 @@ extern void nfs4_set_lease_period(struct nfs_client *clp,
/* nfs4state.c */ /* nfs4state.c */
struct rpc_cred *nfs4_get_clid_cred(struct nfs_client *clp); const struct cred *nfs4_get_clid_cred(struct nfs_client *clp);
struct rpc_cred *nfs4_get_machine_cred(struct nfs_client *clp); const struct cred *nfs4_get_machine_cred(struct nfs_client *clp);
struct rpc_cred *nfs4_get_renew_cred(struct nfs_client *clp); const struct cred *nfs4_get_renew_cred(struct nfs_client *clp);
int nfs4_discover_server_trunking(struct nfs_client *clp, int nfs4_discover_server_trunking(struct nfs_client *clp,
struct nfs_client **); struct nfs_client **);
int nfs40_discover_server_trunking(struct nfs_client *clp, int nfs40_discover_server_trunking(struct nfs_client *clp,
struct nfs_client **, struct rpc_cred *); struct nfs_client **, const struct cred *);
#if defined(CONFIG_NFS_V4_1) #if defined(CONFIG_NFS_V4_1)
int nfs41_discover_server_trunking(struct nfs_client *clp, int nfs41_discover_server_trunking(struct nfs_client *clp,
struct nfs_client **, struct rpc_cred *); struct nfs_client **, const struct cred *);
extern void nfs4_schedule_session_recovery(struct nfs4_session *, int); extern void nfs4_schedule_session_recovery(struct nfs4_session *, int);
extern void nfs41_notify_server(struct nfs_client *); extern void nfs41_notify_server(struct nfs_client *);
#else #else
...@@ -461,7 +461,7 @@ static inline void nfs4_schedule_session_recovery(struct nfs4_session *session, ...@@ -461,7 +461,7 @@ static inline void nfs4_schedule_session_recovery(struct nfs4_session *session,
} }
#endif /* CONFIG_NFS_V4_1 */ #endif /* CONFIG_NFS_V4_1 */
extern struct nfs4_state_owner *nfs4_get_state_owner(struct nfs_server *, struct rpc_cred *, gfp_t); extern struct nfs4_state_owner *nfs4_get_state_owner(struct nfs_server *, const struct cred *, gfp_t);
extern void nfs4_put_state_owner(struct nfs4_state_owner *); extern void nfs4_put_state_owner(struct nfs4_state_owner *);
extern void nfs4_purge_state_owners(struct nfs_server *); extern void nfs4_purge_state_owners(struct nfs_server *);
extern struct nfs4_state * nfs4_get_open_state(struct inode *, struct nfs4_state_owner *); extern struct nfs4_state * nfs4_get_open_state(struct inode *, struct nfs4_state_owner *);
...@@ -487,7 +487,7 @@ extern void nfs4_put_lock_state(struct nfs4_lock_state *lsp); ...@@ -487,7 +487,7 @@ extern void nfs4_put_lock_state(struct nfs4_lock_state *lsp);
extern int nfs4_set_lock_state(struct nfs4_state *state, struct file_lock *fl); extern int nfs4_set_lock_state(struct nfs4_state *state, struct file_lock *fl);
extern int nfs4_select_rw_stateid(struct nfs4_state *, fmode_t, extern int nfs4_select_rw_stateid(struct nfs4_state *, fmode_t,
const struct nfs_lock_context *, nfs4_stateid *, const struct nfs_lock_context *, nfs4_stateid *,
struct rpc_cred **); const struct cred **);
extern bool nfs4_refresh_open_stateid(nfs4_stateid *dst, extern bool nfs4_refresh_open_stateid(nfs4_stateid *dst,
struct nfs4_state *state); struct nfs4_state *state);
extern bool nfs4_copy_open_stateid(nfs4_stateid *dst, extern bool nfs4_copy_open_stateid(nfs4_stateid *dst,
......
...@@ -545,7 +545,7 @@ static int nfs4_match_client(struct nfs_client *pos, struct nfs_client *new, ...@@ -545,7 +545,7 @@ static int nfs4_match_client(struct nfs_client *pos, struct nfs_client *new,
*/ */
int nfs40_walk_client_list(struct nfs_client *new, int nfs40_walk_client_list(struct nfs_client *new,
struct nfs_client **result, struct nfs_client **result,
struct rpc_cred *cred) const struct cred *cred)
{ {
struct nfs_net *nn = net_generic(new->cl_net, nfs_net_id); struct nfs_net *nn = net_generic(new->cl_net, nfs_net_id);
struct nfs_client *pos, *prev = NULL; struct nfs_client *pos, *prev = NULL;
...@@ -711,7 +711,7 @@ int nfs4_detect_session_trunking(struct nfs_client *clp, ...@@ -711,7 +711,7 @@ int nfs4_detect_session_trunking(struct nfs_client *clp,
*/ */
int nfs41_walk_client_list(struct nfs_client *new, int nfs41_walk_client_list(struct nfs_client *new,
struct nfs_client **result, struct nfs_client **result,
struct rpc_cred *cred) const struct cred *cred)
{ {
struct nfs_net *nn = net_generic(new->cl_net, nfs_net_id); struct nfs_net *nn = net_generic(new->cl_net, nfs_net_id);
struct nfs_client *pos, *prev = NULL; struct nfs_client *pos, *prev = NULL;
......
This diff is collapsed.
...@@ -57,7 +57,7 @@ nfs4_renew_state(struct work_struct *work) ...@@ -57,7 +57,7 @@ nfs4_renew_state(struct work_struct *work)
const struct nfs4_state_maintenance_ops *ops; const struct nfs4_state_maintenance_ops *ops;
struct nfs_client *clp = struct nfs_client *clp =
container_of(work, struct nfs_client, cl_renewd.work); container_of(work, struct nfs_client, cl_renewd.work);
struct rpc_cred *cred; const struct cred *cred;
long lease; long lease;
unsigned long last, now; unsigned long last, now;
unsigned renew_flags = 0; unsigned renew_flags = 0;
...@@ -90,7 +90,7 @@ nfs4_renew_state(struct work_struct *work) ...@@ -90,7 +90,7 @@ nfs4_renew_state(struct work_struct *work)
/* Queue an asynchronous RENEW. */ /* Queue an asynchronous RENEW. */
ret = ops->sched_state_renewal(clp, cred, renew_flags); ret = ops->sched_state_renewal(clp, cred, renew_flags);
put_rpccred(cred); put_cred(cred);
switch (ret) { switch (ret) {
default: default:
goto out_exp; goto out_exp;
......
...@@ -573,12 +573,11 @@ static void nfs4_destroy_session_slot_tables(struct nfs4_session *session) ...@@ -573,12 +573,11 @@ static void nfs4_destroy_session_slot_tables(struct nfs4_session *session)
void nfs4_destroy_session(struct nfs4_session *session) void nfs4_destroy_session(struct nfs4_session *session)
{ {
struct rpc_xprt *xprt; struct rpc_xprt *xprt;
struct rpc_cred *cred; const struct cred *cred;
cred = nfs4_get_clid_cred(session->clp); cred = nfs4_get_clid_cred(session->clp);
nfs4_proc_destroy_session(session, cred); nfs4_proc_destroy_session(session, cred);
if (cred) put_cred(cred);
put_rpccred(cred);
rcu_read_lock(); rcu_read_lock();
xprt = rcu_dereference(session->clp->cl_rpcclient->cl_xprt); xprt = rcu_dereference(session->clp->cl_rpcclient->cl_xprt);
......
This diff is collapsed.
...@@ -587,7 +587,7 @@ static void nfs_pgio_prepare(struct rpc_task *task, void *calldata) ...@@ -587,7 +587,7 @@ static void nfs_pgio_prepare(struct rpc_task *task, void *calldata)
} }
int nfs_initiate_pgio(struct rpc_clnt *clnt, struct nfs_pgio_header *hdr, int nfs_initiate_pgio(struct rpc_clnt *clnt, struct nfs_pgio_header *hdr,
struct rpc_cred *cred, const struct nfs_rpc_ops *rpc_ops, const struct cred *cred, const struct nfs_rpc_ops *rpc_ops,
const struct rpc_call_ops *call_ops, int how, int flags) const struct rpc_call_ops *call_ops, int how, int flags)
{ {
struct rpc_task *task; struct rpc_task *task;
......
...@@ -275,7 +275,7 @@ pnfs_free_layout_hdr(struct pnfs_layout_hdr *lo) ...@@ -275,7 +275,7 @@ pnfs_free_layout_hdr(struct pnfs_layout_hdr *lo)
list_del_init(&lo->plh_layouts); list_del_init(&lo->plh_layouts);
spin_unlock(&clp->cl_lock); spin_unlock(&clp->cl_lock);
} }
put_rpccred(lo->plh_lc_cred); put_cred(lo->plh_lc_cred);
return ld->free_layout_hdr(lo); return ld->free_layout_hdr(lo);
} }
...@@ -1038,7 +1038,7 @@ pnfs_alloc_init_layoutget_args(struct inode *ino, ...@@ -1038,7 +1038,7 @@ pnfs_alloc_init_layoutget_args(struct inode *ino,
lgp->args.ctx = get_nfs_open_context(ctx); lgp->args.ctx = get_nfs_open_context(ctx);
nfs4_stateid_copy(&lgp->args.stateid, stateid); nfs4_stateid_copy(&lgp->args.stateid, stateid);
lgp->gfp_flags = gfp_flags; lgp->gfp_flags = gfp_flags;
lgp->cred = get_rpccred(ctx->cred); lgp->cred = get_cred(ctx->cred);
return lgp; return lgp;
} }
...@@ -1049,7 +1049,7 @@ void pnfs_layoutget_free(struct nfs4_layoutget *lgp) ...@@ -1049,7 +1049,7 @@ void pnfs_layoutget_free(struct nfs4_layoutget *lgp)
nfs4_free_pages(lgp->args.layout.pages, max_pages); nfs4_free_pages(lgp->args.layout.pages, max_pages);
if (lgp->args.inode) if (lgp->args.inode)
pnfs_put_layout_hdr(NFS_I(lgp->args.inode)->layout); pnfs_put_layout_hdr(NFS_I(lgp->args.inode)->layout);
put_rpccred(lgp->cred); put_cred(lgp->cred);
put_nfs_open_context(lgp->args.ctx); put_nfs_open_context(lgp->args.ctx);
kfree(lgp); kfree(lgp);
} }
...@@ -1324,7 +1324,7 @@ pnfs_commit_and_return_layout(struct inode *inode) ...@@ -1324,7 +1324,7 @@ pnfs_commit_and_return_layout(struct inode *inode)
bool pnfs_roc(struct inode *ino, bool pnfs_roc(struct inode *ino,
struct nfs4_layoutreturn_args *args, struct nfs4_layoutreturn_args *args,
struct nfs4_layoutreturn_res *res, struct nfs4_layoutreturn_res *res,
const struct rpc_cred *cred) const struct cred *cred)
{ {
struct nfs_inode *nfsi = NFS_I(ino); struct nfs_inode *nfsi = NFS_I(ino);
struct nfs_open_context *ctx; struct nfs_open_context *ctx;
...@@ -1583,7 +1583,7 @@ alloc_init_layout_hdr(struct inode *ino, ...@@ -1583,7 +1583,7 @@ alloc_init_layout_hdr(struct inode *ino,
INIT_LIST_HEAD(&lo->plh_return_segs); INIT_LIST_HEAD(&lo->plh_return_segs);
INIT_LIST_HEAD(&lo->plh_bulk_destroy); INIT_LIST_HEAD(&lo->plh_bulk_destroy);
lo->plh_inode = ino; lo->plh_inode = ino;
lo->plh_lc_cred = get_rpccred(ctx->cred); lo->plh_lc_cred = get_cred(ctx->cred);
lo->plh_flags |= 1 << NFS_LAYOUT_INVALID_STID; lo->plh_flags |= 1 << NFS_LAYOUT_INVALID_STID;
return lo; return lo;
} }
...@@ -2928,7 +2928,7 @@ pnfs_layoutcommit_inode(struct inode *inode, bool sync) ...@@ -2928,7 +2928,7 @@ pnfs_layoutcommit_inode(struct inode *inode, bool sync)
spin_unlock(&inode->i_lock); spin_unlock(&inode->i_lock);
data->args.inode = inode; data->args.inode = inode;
data->cred = get_rpccred(nfsi->layout->plh_lc_cred); data->cred = get_cred(nfsi->layout->plh_lc_cred);
nfs_fattr_init(&data->fattr); nfs_fattr_init(&data->fattr);
data->args.bitmask = NFS_SERVER(inode)->cache_consistency_bitmask; data->args.bitmask = NFS_SERVER(inode)->cache_consistency_bitmask;
data->res.fattr = &data->fattr; data->res.fattr = &data->fattr;
...@@ -2941,7 +2941,7 @@ pnfs_layoutcommit_inode(struct inode *inode, bool sync) ...@@ -2941,7 +2941,7 @@ pnfs_layoutcommit_inode(struct inode *inode, bool sync)
if (ld->prepare_layoutcommit) { if (ld->prepare_layoutcommit) {
status = ld->prepare_layoutcommit(&data->args); status = ld->prepare_layoutcommit(&data->args);
if (status) { if (status) {
put_rpccred(data->cred); put_cred(data->cred);
spin_lock(&inode->i_lock); spin_lock(&inode->i_lock);
set_bit(NFS_INO_LAYOUTCOMMIT, &nfsi->flags); set_bit(NFS_INO_LAYOUTCOMMIT, &nfsi->flags);
if (end_pos > nfsi->layout->plh_lwb) if (end_pos > nfsi->layout->plh_lwb)
......
...@@ -200,7 +200,7 @@ struct pnfs_layout_hdr { ...@@ -200,7 +200,7 @@ struct pnfs_layout_hdr {
u32 plh_return_seq; u32 plh_return_seq;
enum pnfs_iomode plh_return_iomode; enum pnfs_iomode plh_return_iomode;
loff_t plh_lwb; /* last write byte for layoutcommit */ loff_t plh_lwb; /* last write byte for layoutcommit */
struct rpc_cred *plh_lc_cred; /* layoutcommit cred */ const struct cred *plh_lc_cred; /* layoutcommit cred */
struct inode *plh_inode; struct inode *plh_inode;
}; };
...@@ -230,7 +230,7 @@ extern void pnfs_unregister_layoutdriver(struct pnfs_layoutdriver_type *); ...@@ -230,7 +230,7 @@ extern void pnfs_unregister_layoutdriver(struct pnfs_layoutdriver_type *);
extern size_t max_response_pages(struct nfs_server *server); extern size_t max_response_pages(struct nfs_server *server);
extern int nfs4_proc_getdeviceinfo(struct nfs_server *server, extern int nfs4_proc_getdeviceinfo(struct nfs_server *server,
struct pnfs_device *dev, struct pnfs_device *dev,
struct rpc_cred *cred); const struct cred *cred);
extern struct pnfs_layout_segment* nfs4_proc_layoutget(struct nfs4_layoutget *lgp, long *timeout); extern struct pnfs_layout_segment* nfs4_proc_layoutget(struct nfs4_layoutget *lgp, long *timeout);
extern int nfs4_proc_layoutreturn(struct nfs4_layoutreturn *lrp, bool sync); extern int nfs4_proc_layoutreturn(struct nfs4_layoutreturn *lrp, bool sync);
...@@ -280,7 +280,7 @@ int pnfs_mark_layout_stateid_invalid(struct pnfs_layout_hdr *lo, ...@@ -280,7 +280,7 @@ int pnfs_mark_layout_stateid_invalid(struct pnfs_layout_hdr *lo,
bool pnfs_roc(struct inode *ino, bool pnfs_roc(struct inode *ino,
struct nfs4_layoutreturn_args *args, struct nfs4_layoutreturn_args *args,
struct nfs4_layoutreturn_res *res, struct nfs4_layoutreturn_res *res,
const struct rpc_cred *cred); const struct cred *cred);
void pnfs_roc_release(struct nfs4_layoutreturn_args *args, void pnfs_roc_release(struct nfs4_layoutreturn_args *args,
struct nfs4_layoutreturn_res *res, struct nfs4_layoutreturn_res *res,
int ret); int ret);
...@@ -343,7 +343,7 @@ struct nfs4_deviceid_node { ...@@ -343,7 +343,7 @@ struct nfs4_deviceid_node {
struct nfs4_deviceid_node * struct nfs4_deviceid_node *
nfs4_find_get_deviceid(struct nfs_server *server, nfs4_find_get_deviceid(struct nfs_server *server,
const struct nfs4_deviceid *id, struct rpc_cred *cred, const struct nfs4_deviceid *id, const struct cred *cred,
gfp_t gfp_mask); gfp_t gfp_mask);
void nfs4_delete_deviceid(const struct pnfs_layoutdriver_type *, const struct nfs_client *, const struct nfs4_deviceid *); void nfs4_delete_deviceid(const struct pnfs_layoutdriver_type *, const struct nfs_client *, const struct nfs4_deviceid *);
void nfs4_init_deviceid_node(struct nfs4_deviceid_node *, struct nfs_server *, void nfs4_init_deviceid_node(struct nfs4_deviceid_node *, struct nfs_server *,
...@@ -694,7 +694,7 @@ static inline bool ...@@ -694,7 +694,7 @@ static inline bool
pnfs_roc(struct inode *ino, pnfs_roc(struct inode *ino,
struct nfs4_layoutreturn_args *args, struct nfs4_layoutreturn_args *args,
struct nfs4_layoutreturn_res *res, struct nfs4_layoutreturn_res *res,
const struct rpc_cred *cred) const struct cred *cred)
{ {
return false; return false;
} }
......
...@@ -94,7 +94,7 @@ _lookup_deviceid(const struct pnfs_layoutdriver_type *ld, ...@@ -94,7 +94,7 @@ _lookup_deviceid(const struct pnfs_layoutdriver_type *ld,
static struct nfs4_deviceid_node * static struct nfs4_deviceid_node *
nfs4_get_device_info(struct nfs_server *server, nfs4_get_device_info(struct nfs_server *server,
const struct nfs4_deviceid *dev_id, const struct nfs4_deviceid *dev_id,
struct rpc_cred *cred, gfp_t gfp_flags) const struct cred *cred, gfp_t gfp_flags)
{ {
struct nfs4_deviceid_node *d = NULL; struct nfs4_deviceid_node *d = NULL;
struct pnfs_device *pdev = NULL; struct pnfs_device *pdev = NULL;
...@@ -184,7 +184,7 @@ __nfs4_find_get_deviceid(struct nfs_server *server, ...@@ -184,7 +184,7 @@ __nfs4_find_get_deviceid(struct nfs_server *server,
struct nfs4_deviceid_node * struct nfs4_deviceid_node *
nfs4_find_get_deviceid(struct nfs_server *server, nfs4_find_get_deviceid(struct nfs_server *server,
const struct nfs4_deviceid *id, struct rpc_cred *cred, const struct nfs4_deviceid *id, const struct cred *cred,
gfp_t gfp_mask) gfp_t gfp_mask)
{ {
long hash = nfs4_deviceid_hash(id); long hash = nfs4_deviceid_hash(id);
......
...@@ -686,7 +686,7 @@ static int _nfs4_pnfs_v4_ds_connect(struct nfs_server *mds_srv, ...@@ -686,7 +686,7 @@ static int _nfs4_pnfs_v4_ds_connect(struct nfs_server *mds_srv,
rpc_clnt_setup_test_and_add_xprt, rpc_clnt_setup_test_and_add_xprt,
&rpcdata); &rpcdata);
if (xprtdata.cred) if (xprtdata.cred)
put_rpccred(xprtdata.cred); put_cred(xprtdata.cred);
} else { } else {
clp = nfs4_set_ds_client(mds_srv, clp = nfs4_set_ds_client(mds_srv,
(struct sockaddr *)&da->da_addr, (struct sockaddr *)&da->da_addr,
......
...@@ -500,25 +500,18 @@ nfs_proc_readdir(struct dentry *dentry, const struct cred *cred, ...@@ -500,25 +500,18 @@ nfs_proc_readdir(struct dentry *dentry, const struct 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 = rpc_lookup_generic_cred(&acred, .rpc_cred = cred,
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;
} }
......
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
static void static void
nfs_free_unlinkdata(struct nfs_unlinkdata *data) nfs_free_unlinkdata(struct nfs_unlinkdata *data)
{ {
put_rpccred(data->cred); put_cred(data->cred);
kfree(data->args.name.name); kfree(data->args.name.name);
kfree(data); kfree(data);
} }
...@@ -177,11 +177,7 @@ nfs_async_unlink(struct dentry *dentry, const struct qstr *name) ...@@ -177,11 +177,7 @@ nfs_async_unlink(struct dentry *dentry, const struct qstr *name)
goto out_free; goto out_free;
data->args.name.len = name->len; data->args.name.len = name->len;
data->cred = rpc_lookup_cred(); data->cred = get_current_cred();
if (IS_ERR(data->cred)) {
status = PTR_ERR(data->cred);
goto out_free_name;
}
data->res.dir_attr = &data->dir_attr; data->res.dir_attr = &data->dir_attr;
init_waitqueue_head(&data->wq); init_waitqueue_head(&data->wq);
...@@ -202,8 +198,7 @@ nfs_async_unlink(struct dentry *dentry, const struct qstr *name) ...@@ -202,8 +198,7 @@ nfs_async_unlink(struct dentry *dentry, const struct qstr *name)
return 0; return 0;
out_unlock: out_unlock:
spin_unlock(&dentry->d_lock); spin_unlock(&dentry->d_lock);
put_rpccred(data->cred); put_cred(data->cred);
out_free_name:
kfree(data->args.name.name); kfree(data->args.name.name);
out_free: out_free:
kfree(data); kfree(data);
...@@ -307,7 +302,7 @@ static void nfs_async_rename_release(void *calldata) ...@@ -307,7 +302,7 @@ static void nfs_async_rename_release(void *calldata)
iput(data->old_dir); iput(data->old_dir);
iput(data->new_dir); iput(data->new_dir);
nfs_sb_deactive(sb); nfs_sb_deactive(sb);
put_rpccred(data->cred); put_cred(data->cred);
kfree(data); kfree(data);
} }
...@@ -352,7 +347,7 @@ nfs_async_rename(struct inode *old_dir, struct inode *new_dir, ...@@ -352,7 +347,7 @@ nfs_async_rename(struct inode *old_dir, struct inode *new_dir,
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
task_setup_data.callback_data = data; task_setup_data.callback_data = data;
data->cred = rpc_lookup_cred(); data->cred = get_current_cred();
if (IS_ERR(data->cred)) { if (IS_ERR(data->cred)) {
struct rpc_task *task = ERR_CAST(data->cred); struct rpc_task *task = ERR_CAST(data->cred);
kfree(data); kfree(data);
......
...@@ -1249,7 +1249,7 @@ bool nfs_ctx_key_to_expire(struct nfs_open_context *ctx, struct inode *inode) ...@@ -1249,7 +1249,7 @@ bool nfs_ctx_key_to_expire(struct nfs_open_context *ctx, struct inode *inode)
struct rpc_auth *auth = NFS_SERVER(inode)->client->cl_auth; struct rpc_auth *auth = NFS_SERVER(inode)->client->cl_auth;
struct rpc_cred *cred = ctx->ll_cred; struct rpc_cred *cred = ctx->ll_cred;
struct auth_cred acred = { struct auth_cred acred = {
.cred = ctx->cred->cr_cred, .cred = ctx->cred,
}; };
if (cred && !cred->cr_ops->crmatch(&acred, cred, 0)) { if (cred && !cred->cr_ops->crmatch(&acred, cred, 0)) {
......
...@@ -844,18 +844,15 @@ static int max_cb_time(struct net *net) ...@@ -844,18 +844,15 @@ static int max_cb_time(struct net *net)
return max(nn->nfsd4_lease/10, (time_t)1) * HZ; return max(nn->nfsd4_lease/10, (time_t)1) * HZ;
} }
static struct rpc_cred *get_backchannel_cred(struct nfs4_client *clp, struct rpc_clnt *client, struct nfsd4_session *ses) static const struct cred *get_backchannel_cred(struct nfs4_client *clp, struct rpc_clnt *client, struct nfsd4_session *ses)
{ {
if (clp->cl_minorversion == 0) { if (clp->cl_minorversion == 0) {
client->cl_principal = clp->cl_cred.cr_targ_princ ? client->cl_principal = clp->cl_cred.cr_targ_princ ?
clp->cl_cred.cr_targ_princ : "nfs"; clp->cl_cred.cr_targ_princ : "nfs";
return get_rpccred(rpc_machine_cred()); return get_cred(rpc_machine_cred());
} else { } else {
struct rpc_auth *auth = client->cl_auth;
struct auth_cred acred = {};
struct cred *kcred; struct cred *kcred;
struct rpc_cred *ret;
kcred = prepare_kernel_cred(NULL); kcred = prepare_kernel_cred(NULL);
if (!kcred) if (!kcred)
...@@ -863,10 +860,7 @@ static struct rpc_cred *get_backchannel_cred(struct nfs4_client *clp, struct rpc ...@@ -863,10 +860,7 @@ static struct rpc_cred *get_backchannel_cred(struct nfs4_client *clp, struct rpc
kcred->uid = ses->se_cb_sec.uid; kcred->uid = ses->se_cb_sec.uid;
kcred->gid = ses->se_cb_sec.gid; kcred->gid = ses->se_cb_sec.gid;
acred.cred = kcred; return kcred;
ret = auth->au_ops->lookup_cred(client->cl_auth, &acred, 0);
put_cred(kcred);
return ret;
} }
} }
...@@ -889,7 +883,7 @@ static int setup_callback_client(struct nfs4_client *clp, struct nfs4_cb_conn *c ...@@ -889,7 +883,7 @@ static int setup_callback_client(struct nfs4_client *clp, struct nfs4_cb_conn *c
.flags = (RPC_CLNT_CREATE_NOPING | RPC_CLNT_CREATE_QUIET), .flags = (RPC_CLNT_CREATE_NOPING | RPC_CLNT_CREATE_QUIET),
}; };
struct rpc_clnt *client; struct rpc_clnt *client;
struct rpc_cred *cred; const struct cred *cred;
if (clp->cl_minorversion == 0) { if (clp->cl_minorversion == 0) {
if (!clp->cl_cred.cr_principal && if (!clp->cl_cred.cr_principal &&
...@@ -1219,7 +1213,7 @@ static void nfsd4_process_cb_update(struct nfsd4_callback *cb) ...@@ -1219,7 +1213,7 @@ static void nfsd4_process_cb_update(struct nfsd4_callback *cb)
if (clp->cl_cb_client) { if (clp->cl_cb_client) {
rpc_shutdown_client(clp->cl_cb_client); rpc_shutdown_client(clp->cl_cb_client);
clp->cl_cb_client = NULL; clp->cl_cb_client = NULL;
put_rpccred(clp->cl_cb_cred); put_cred(clp->cl_cb_cred);
clp->cl_cb_cred = NULL; clp->cl_cb_cred = NULL;
} }
if (clp->cl_cb_conn.cb_xprt) { if (clp->cl_cb_conn.cb_xprt) {
......
...@@ -327,7 +327,7 @@ struct nfs4_client { ...@@ -327,7 +327,7 @@ struct nfs4_client {
#define NFSD4_CLIENT_CB_FLAG_MASK (1 << NFSD4_CLIENT_CB_UPDATE | \ #define NFSD4_CLIENT_CB_FLAG_MASK (1 << NFSD4_CLIENT_CB_UPDATE | \
1 << NFSD4_CLIENT_CB_KILL) 1 << NFSD4_CLIENT_CB_KILL)
unsigned long cl_flags; unsigned long cl_flags;
struct rpc_cred *cl_cb_cred; const struct cred *cl_cb_cred;
struct rpc_clnt *cl_cb_client; struct rpc_clnt *cl_cb_client;
u32 cl_cb_ident; u32 cl_cb_ident;
#define NFSD4_CB_UP 0 #define NFSD4_CB_UP 0
......
...@@ -70,7 +70,7 @@ struct nfs_open_context { ...@@ -70,7 +70,7 @@ struct nfs_open_context {
struct nfs_lock_context lock_context; struct nfs_lock_context lock_context;
fl_owner_t flock_owner; fl_owner_t flock_owner;
struct dentry *dentry; struct dentry *dentry;
struct rpc_cred *cred; const struct cred *cred;
struct rpc_cred *ll_cred; /* low-level cred - use to check for expiry */ struct rpc_cred *ll_cred; /* low-level cred - use to check for expiry */
struct nfs4_state *state; struct nfs4_state *state;
fmode_t mode; fmode_t mode;
...@@ -391,7 +391,7 @@ extern void nfs_setsecurity(struct inode *inode, struct nfs_fattr *fattr, ...@@ -391,7 +391,7 @@ extern void nfs_setsecurity(struct inode *inode, struct nfs_fattr *fattr,
struct nfs4_label *label); struct nfs4_label *label);
extern struct nfs_open_context *get_nfs_open_context(struct nfs_open_context *ctx); extern struct nfs_open_context *get_nfs_open_context(struct nfs_open_context *ctx);
extern void put_nfs_open_context(struct nfs_open_context *ctx); extern void put_nfs_open_context(struct nfs_open_context *ctx);
extern struct nfs_open_context *nfs_find_open_context(struct inode *inode, struct rpc_cred *cred, fmode_t mode); extern struct nfs_open_context *nfs_find_open_context(struct inode *inode, const struct cred *cred, fmode_t mode);
extern struct nfs_open_context *alloc_nfs_open_context(struct dentry *dentry, fmode_t f_mode, struct file *filp); extern struct nfs_open_context *alloc_nfs_open_context(struct dentry *dentry, fmode_t f_mode, struct file *filp);
extern void nfs_inode_attach_open_context(struct nfs_open_context *ctx); extern void nfs_inode_attach_open_context(struct nfs_open_context *ctx);
extern void nfs_file_set_open_context(struct file *filp, struct nfs_open_context *ctx); extern void nfs_file_set_open_context(struct file *filp, struct nfs_open_context *ctx);
...@@ -462,7 +462,7 @@ static inline struct nfs_open_context *nfs_file_open_context(struct file *filp) ...@@ -462,7 +462,7 @@ static inline struct nfs_open_context *nfs_file_open_context(struct file *filp)
return filp->private_data; return filp->private_data;
} }
static inline struct rpc_cred *nfs_file_cred(struct file *file) static inline const struct cred *nfs_file_cred(struct file *file)
{ {
if (file != NULL) { if (file != NULL) {
struct nfs_open_context *ctx = struct nfs_open_context *ctx =
......
...@@ -270,7 +270,7 @@ struct nfs4_layoutget_res { ...@@ -270,7 +270,7 @@ struct nfs4_layoutget_res {
struct nfs4_layoutget { struct nfs4_layoutget {
struct nfs4_layoutget_args args; struct nfs4_layoutget_args args;
struct nfs4_layoutget_res res; struct nfs4_layoutget_res res;
struct rpc_cred *cred; const struct cred *cred;
gfp_t gfp_flags; gfp_t gfp_flags;
}; };
...@@ -309,7 +309,7 @@ struct nfs4_layoutcommit_data { ...@@ -309,7 +309,7 @@ struct nfs4_layoutcommit_data {
struct rpc_task task; struct rpc_task task;
struct nfs_fattr fattr; struct nfs_fattr fattr;
struct list_head lseg_list; struct list_head lseg_list;
struct rpc_cred *cred; const struct cred *cred;
struct inode *inode; struct inode *inode;
struct nfs4_layoutcommit_args args; struct nfs4_layoutcommit_args args;
struct nfs4_layoutcommit_res res; struct nfs4_layoutcommit_res res;
...@@ -334,7 +334,7 @@ struct nfs4_layoutreturn_res { ...@@ -334,7 +334,7 @@ struct nfs4_layoutreturn_res {
struct nfs4_layoutreturn { struct nfs4_layoutreturn {
struct nfs4_layoutreturn_args args; struct nfs4_layoutreturn_args args;
struct nfs4_layoutreturn_res res; struct nfs4_layoutreturn_res res;
struct rpc_cred *cred; const struct cred *cred;
struct nfs_client *clp; struct nfs_client *clp;
struct inode *inode; struct inode *inode;
int rpc_status; int rpc_status;
...@@ -1469,7 +1469,7 @@ enum { ...@@ -1469,7 +1469,7 @@ enum {
struct nfs_io_completion; struct nfs_io_completion;
struct nfs_pgio_header { struct nfs_pgio_header {
struct inode *inode; struct inode *inode;
struct rpc_cred *cred; const struct cred *cred;
struct list_head pages; struct list_head pages;
struct nfs_page *req; struct nfs_page *req;
struct nfs_writeverf verf; /* Used for writes */ struct nfs_writeverf verf; /* Used for writes */
...@@ -1529,7 +1529,7 @@ struct nfs_commit_info { ...@@ -1529,7 +1529,7 @@ struct nfs_commit_info {
struct nfs_commit_data { struct nfs_commit_data {
struct rpc_task task; struct rpc_task task;
struct inode *inode; struct inode *inode;
struct rpc_cred *cred; const struct cred *cred;
struct nfs_fattr fattr; struct nfs_fattr fattr;
struct nfs_writeverf verf; struct nfs_writeverf verf;
struct list_head pages; /* Coalesced requests we wish to flush */ struct list_head pages; /* Coalesced requests we wish to flush */
...@@ -1560,7 +1560,7 @@ struct nfs_unlinkdata { ...@@ -1560,7 +1560,7 @@ struct nfs_unlinkdata {
struct nfs_removeres res; struct nfs_removeres res;
struct dentry *dentry; struct dentry *dentry;
wait_queue_head_t wq; wait_queue_head_t wq;
struct rpc_cred *cred; const struct cred *cred;
struct nfs_fattr dir_attr; struct nfs_fattr dir_attr;
long timeout; long timeout;
}; };
...@@ -1568,7 +1568,7 @@ struct nfs_unlinkdata { ...@@ -1568,7 +1568,7 @@ struct nfs_unlinkdata {
struct nfs_renamedata { struct nfs_renamedata {
struct nfs_renameargs args; struct nfs_renameargs args;
struct nfs_renameres res; struct nfs_renameres res;
struct rpc_cred *cred; const struct cred *cred;
struct inode *old_dir; struct inode *old_dir;
struct dentry *old_dentry; struct dentry *old_dentry;
struct nfs_fattr old_fattr; struct nfs_fattr old_fattr;
......
...@@ -67,7 +67,7 @@ struct rpc_cred { ...@@ -67,7 +67,7 @@ struct rpc_cred {
#define RPCAUTH_CRED_HASHED 2 #define RPCAUTH_CRED_HASHED 2
#define RPCAUTH_CRED_NEGATIVE 3 #define RPCAUTH_CRED_NEGATIVE 3
struct rpc_cred *rpc_machine_cred(void); const struct cred *rpc_machine_cred(void);
/* /*
* Client authentication handle * Client authentication handle
...@@ -196,21 +196,5 @@ struct rpc_cred *get_rpccred(struct rpc_cred *cred) ...@@ -196,21 +196,5 @@ struct rpc_cred *get_rpccred(struct rpc_cred *cred)
return NULL; return NULL;
} }
/**
* get_rpccred_rcu - get a reference to a cred using rcu-protected pointer
* @cred: cred of which to take a reference
*
* In some cases, we may have a pointer to a credential to which we
* want to take a reference, but don't already have one. Because these
* objects are freed using RCU, we can access the cr_count while its
* on its way to destruction and only take a reference if it's not already
* zero.
*/
static inline struct rpc_cred *
get_rpccred_rcu(struct rpc_cred *cred)
{
return get_rpccred(cred);
}
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
#endif /* _LINUX_SUNRPC_AUTH_H */ #endif /* _LINUX_SUNRPC_AUTH_H */
...@@ -26,7 +26,7 @@ struct rpc_message { ...@@ -26,7 +26,7 @@ struct rpc_message {
const struct rpc_procinfo *rpc_proc; /* Procedure information */ const struct rpc_procinfo *rpc_proc; /* Procedure information */
void * rpc_argp; /* Arguments */ void * rpc_argp; /* Arguments */
void * rpc_resp; /* Result */ void * rpc_resp; /* Result */
struct rpc_cred * rpc_cred; /* Credentials */ const struct cred * rpc_cred; /* Credentials */
}; };
struct rpc_call_ops; struct rpc_call_ops;
......
...@@ -39,15 +39,15 @@ static const struct rpc_authops __rcu *auth_flavors[RPC_AUTH_MAXFLAVOR] = { ...@@ -39,15 +39,15 @@ static const struct rpc_authops __rcu *auth_flavors[RPC_AUTH_MAXFLAVOR] = {
static LIST_HEAD(cred_unused); static LIST_HEAD(cred_unused);
static unsigned long number_cred_unused; static unsigned long number_cred_unused;
static struct rpc_cred machine_cred = { static struct cred machine_cred = {
.cr_count = REFCOUNT_INIT(1), .usage = ATOMIC_INIT(1),
}; };
/* /*
* Return the machine_cred pointer to be used whenever * Return the machine_cred pointer to be used whenever
* the a generic machine credential is needed. * the a generic machine credential is needed.
*/ */
struct rpc_cred *rpc_machine_cred(void) const struct cred *rpc_machine_cred(void)
{ {
return &machine_cred; return &machine_cred;
} }
...@@ -720,11 +720,15 @@ rpcauth_bind_new_cred(struct rpc_task *task, int lookupflags) ...@@ -720,11 +720,15 @@ rpcauth_bind_new_cred(struct rpc_task *task, int lookupflags)
} }
static int static int
rpcauth_bindcred(struct rpc_task *task, struct rpc_cred *cred, int flags) rpcauth_bindcred(struct rpc_task *task, const struct cred *cred, int flags)
{ {
struct rpc_rqst *req = task->tk_rqstp; struct rpc_rqst *req = task->tk_rqstp;
struct rpc_cred *new = NULL; struct rpc_cred *new = NULL;
int lookupflags = 0; int lookupflags = 0;
struct rpc_auth *auth = task->tk_client->cl_auth;
struct auth_cred acred = {
.cred = cred,
};
if (flags & RPC_TASK_ASYNC) if (flags & RPC_TASK_ASYNC)
lookupflags |= RPCAUTH_LOOKUP_NEW; lookupflags |= RPCAUTH_LOOKUP_NEW;
...@@ -733,7 +737,7 @@ rpcauth_bindcred(struct rpc_task *task, struct rpc_cred *cred, int flags) ...@@ -733,7 +737,7 @@ rpcauth_bindcred(struct rpc_task *task, struct rpc_cred *cred, int flags)
new = task->tk_op_cred->cr_ops->crbind(task, task->tk_op_cred, new = task->tk_op_cred->cr_ops->crbind(task, task->tk_op_cred,
lookupflags); lookupflags);
else if (cred != NULL && cred != &machine_cred) else if (cred != NULL && cred != &machine_cred)
new = cred->cr_ops->crbind(task, cred, lookupflags); new = auth->au_ops->lookup_cred(auth, &acred, lookupflags);
else if (cred == &machine_cred) else if (cred == &machine_cred)
new = rpcauth_bind_machine_cred(task, lookupflags); new = rpcauth_bind_machine_cred(task, lookupflags);
......
...@@ -1030,7 +1030,7 @@ rpc_task_set_rpc_message(struct rpc_task *task, const struct rpc_message *msg) ...@@ -1030,7 +1030,7 @@ rpc_task_set_rpc_message(struct rpc_task *task, const struct rpc_message *msg)
task->tk_msg.rpc_argp = msg->rpc_argp; task->tk_msg.rpc_argp = msg->rpc_argp;
task->tk_msg.rpc_resp = msg->rpc_resp; task->tk_msg.rpc_resp = msg->rpc_resp;
if (msg->rpc_cred != NULL) if (msg->rpc_cred != NULL)
task->tk_msg.rpc_cred = get_rpccred(msg->rpc_cred); task->tk_msg.rpc_cred = get_cred(msg->rpc_cred);
} }
} }
...@@ -2542,7 +2542,7 @@ struct rpc_task *rpc_call_null_helper(struct rpc_clnt *clnt, ...@@ -2542,7 +2542,7 @@ struct rpc_task *rpc_call_null_helper(struct rpc_clnt *clnt,
.rpc_op_cred = cred, .rpc_op_cred = cred,
.callback_ops = (ops != NULL) ? ops : &rpc_default_ops, .callback_ops = (ops != NULL) ? ops : &rpc_default_ops,
.callback_data = data, .callback_data = data,
.flags = flags, .flags = flags | RPC_TASK_NULLCREDS,
}; };
return rpc_run_task(&task_setup_data); return rpc_run_task(&task_setup_data);
......
...@@ -1074,7 +1074,7 @@ static void rpc_release_resources_task(struct rpc_task *task) ...@@ -1074,7 +1074,7 @@ static void rpc_release_resources_task(struct rpc_task *task)
{ {
xprt_release(task); xprt_release(task);
if (task->tk_msg.rpc_cred) { if (task->tk_msg.rpc_cred) {
put_rpccred(task->tk_msg.rpc_cred); put_cred(task->tk_msg.rpc_cred);
task->tk_msg.rpc_cred = NULL; task->tk_msg.rpc_cred = NULL;
} }
rpc_task_release_client(task); rpc_task_release_client(task);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment