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

Commit 3320fef1 authored by Stanislav Kinsbursky's avatar Stanislav Kinsbursky Committed by J. Bruce Fields
Browse files

nfsd: use service net instead of hard-coded init_net



This patch replaces init_net by SVC_NET(), where possible and also passes
proper context to nested functions where required.

Signed-off-by: default avatarStanislav Kinsbursky <skinsbursky@parallels.com>
Signed-off-by: default avatarJ. Bruce Fields <bfields@redhat.com>
parent 73758fed
Loading
Loading
Loading
Loading
+9 −4
Original line number Original line Diff line number Diff line
@@ -40,6 +40,7 @@
#include "xdr4.h"
#include "xdr4.h"
#include "vfs.h"
#include "vfs.h"
#include "current_stateid.h"
#include "current_stateid.h"
#include "netns.h"


#define NFSDDBG_FACILITY		NFSDDBG_PROC
#define NFSDDBG_FACILITY		NFSDDBG_PROC


@@ -304,6 +305,8 @@ nfsd4_open(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
{
{
	__be32 status;
	__be32 status;
	struct nfsd4_compoundres *resp;
	struct nfsd4_compoundres *resp;
	struct net *net = SVC_NET(rqstp);
	struct nfsd_net *nn = net_generic(net, nfsd_net_id);


	dprintk("NFSD: nfsd4_open filename %.*s op_openowner %p\n",
	dprintk("NFSD: nfsd4_open filename %.*s op_openowner %p\n",
		(int)open->op_fname.len, open->op_fname.data,
		(int)open->op_fname.len, open->op_fname.data,
@@ -331,7 +334,7 @@ nfsd4_open(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,


	/* check seqid for replay. set nfs4_owner */
	/* check seqid for replay. set nfs4_owner */
	resp = rqstp->rq_resp;
	resp = rqstp->rq_resp;
	status = nfsd4_process_open1(&resp->cstate, open);
	status = nfsd4_process_open1(&resp->cstate, open, nn);
	if (status == nfserr_replay_me) {
	if (status == nfserr_replay_me) {
		struct nfs4_replay *rp = &open->op_openowner->oo_owner.so_replay;
		struct nfs4_replay *rp = &open->op_openowner->oo_owner.so_replay;
		fh_put(&cstate->current_fh);
		fh_put(&cstate->current_fh);
@@ -354,10 +357,10 @@ nfsd4_open(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
	/* Openowner is now set, so sequence id will get bumped.  Now we need
	/* Openowner is now set, so sequence id will get bumped.  Now we need
	 * these checks before we do any creates: */
	 * these checks before we do any creates: */
	status = nfserr_grace;
	status = nfserr_grace;
	if (locks_in_grace(SVC_NET(rqstp)) && open->op_claim_type != NFS4_OPEN_CLAIM_PREVIOUS)
	if (locks_in_grace(net) && open->op_claim_type != NFS4_OPEN_CLAIM_PREVIOUS)
		goto out;
		goto out;
	status = nfserr_no_grace;
	status = nfserr_no_grace;
	if (!locks_in_grace(SVC_NET(rqstp)) && open->op_claim_type == NFS4_OPEN_CLAIM_PREVIOUS)
	if (!locks_in_grace(net) && open->op_claim_type == NFS4_OPEN_CLAIM_PREVIOUS)
		goto out;
		goto out;


	switch (open->op_claim_type) {
	switch (open->op_claim_type) {
@@ -370,7 +373,9 @@ nfsd4_open(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
			break;
			break;
		case NFS4_OPEN_CLAIM_PREVIOUS:
		case NFS4_OPEN_CLAIM_PREVIOUS:
			open->op_openowner->oo_flags |= NFS4_OO_CONFIRMED;
			open->op_openowner->oo_flags |= NFS4_OO_CONFIRMED;
			status = nfs4_check_open_reclaim(&open->op_clientid, cstate->minorversion);
			status = nfs4_check_open_reclaim(&open->op_clientid,
							 cstate->minorversion,
							 nn);
			if (status)
			if (status)
				goto out;
				goto out;
		case NFS4_OPEN_CLAIM_FH:
		case NFS4_OPEN_CLAIM_FH:
+38 −25
Original line number Original line Diff line number Diff line
@@ -2620,14 +2620,13 @@ static __be32 nfsd4_check_seqid(struct nfsd4_compound_state *cstate, struct nfs4


__be32
__be32
nfsd4_process_open1(struct nfsd4_compound_state *cstate,
nfsd4_process_open1(struct nfsd4_compound_state *cstate,
		    struct nfsd4_open *open)
		    struct nfsd4_open *open, struct nfsd_net *nn)
{
{
	clientid_t *clientid = &open->op_clientid;
	clientid_t *clientid = &open->op_clientid;
	struct nfs4_client *clp = NULL;
	struct nfs4_client *clp = NULL;
	unsigned int strhashval;
	unsigned int strhashval;
	struct nfs4_openowner *oo = NULL;
	struct nfs4_openowner *oo = NULL;
	__be32 status;
	__be32 status;
	struct nfsd_net *nn = net_generic(&init_net, nfsd_net_id);


	if (STALE_CLIENTID(&open->op_clientid, nn))
	if (STALE_CLIENTID(&open->op_clientid, nn))
		return nfserr_stale_clientid;
		return nfserr_stale_clientid;
@@ -3408,10 +3407,11 @@ static __be32 nfsd4_validate_stateid(struct nfs4_client *cl, stateid_t *stateid)
	return nfs_ok;
	return nfs_ok;
}
}


static __be32 nfsd4_lookup_stateid(stateid_t *stateid, unsigned char typemask, struct nfs4_stid **s, bool sessions)
static __be32 nfsd4_lookup_stateid(stateid_t *stateid, unsigned char typemask,
				   struct nfs4_stid **s, bool sessions,
				   struct nfsd_net *nn)
{
{
	struct nfs4_client *cl;
	struct nfs4_client *cl;
	struct nfsd_net *nn = net_generic(&init_net, nfsd_net_id);


	if (ZERO_STATEID(stateid) || ONE_STATEID(stateid))
	if (ZERO_STATEID(stateid) || ONE_STATEID(stateid))
		return nfserr_bad_stateid;
		return nfserr_bad_stateid;
@@ -3439,6 +3439,7 @@ nfs4_preprocess_stateid_op(struct net *net, struct nfsd4_compound_state *cstate,
	struct nfs4_delegation *dp = NULL;
	struct nfs4_delegation *dp = NULL;
	struct svc_fh *current_fh = &cstate->current_fh;
	struct svc_fh *current_fh = &cstate->current_fh;
	struct inode *ino = current_fh->fh_dentry->d_inode;
	struct inode *ino = current_fh->fh_dentry->d_inode;
	struct nfsd_net *nn = net_generic(net, nfsd_net_id);
	__be32 status;
	__be32 status;


	if (filpp)
	if (filpp)
@@ -3450,7 +3451,8 @@ nfs4_preprocess_stateid_op(struct net *net, struct nfsd4_compound_state *cstate,
	if (ZERO_STATEID(stateid) || ONE_STATEID(stateid))
	if (ZERO_STATEID(stateid) || ONE_STATEID(stateid))
		return check_special_stateids(net, current_fh, stateid, flags);
		return check_special_stateids(net, current_fh, stateid, flags);


	status = nfsd4_lookup_stateid(stateid, NFS4_DELEG_STID|NFS4_OPEN_STID|NFS4_LOCK_STID, &s, cstate->minorversion);
	status = nfsd4_lookup_stateid(stateid, NFS4_DELEG_STID|NFS4_OPEN_STID|NFS4_LOCK_STID,
				      &s, cstate->minorversion, nn);
	if (status)
	if (status)
		return status;
		return status;
	status = check_stateid_generation(stateid, &s->sc_stateid, nfsd4_has_session(cstate));
	status = check_stateid_generation(stateid, &s->sc_stateid, nfsd4_has_session(cstate));
@@ -3591,7 +3593,8 @@ static __be32 nfs4_seqid_op_checks(struct nfsd4_compound_state *cstate, stateid_
static __be32
static __be32
nfs4_preprocess_seqid_op(struct nfsd4_compound_state *cstate, u32 seqid,
nfs4_preprocess_seqid_op(struct nfsd4_compound_state *cstate, u32 seqid,
			 stateid_t *stateid, char typemask,
			 stateid_t *stateid, char typemask,
			 struct nfs4_ol_stateid **stpp)
			 struct nfs4_ol_stateid **stpp,
			 struct nfsd_net *nn)
{
{
	__be32 status;
	__be32 status;
	struct nfs4_stid *s;
	struct nfs4_stid *s;
@@ -3600,7 +3603,8 @@ nfs4_preprocess_seqid_op(struct nfsd4_compound_state *cstate, u32 seqid,
		seqid, STATEID_VAL(stateid));
		seqid, STATEID_VAL(stateid));


	*stpp = NULL;
	*stpp = NULL;
	status = nfsd4_lookup_stateid(stateid, typemask, &s, cstate->minorversion);
	status = nfsd4_lookup_stateid(stateid, typemask, &s,
				      cstate->minorversion, nn);
	if (status)
	if (status)
		return status;
		return status;
	*stpp = openlockstateid(s);
	*stpp = openlockstateid(s);
@@ -3609,13 +3613,14 @@ nfs4_preprocess_seqid_op(struct nfsd4_compound_state *cstate, u32 seqid,
	return nfs4_seqid_op_checks(cstate, stateid, seqid, *stpp);
	return nfs4_seqid_op_checks(cstate, stateid, seqid, *stpp);
}
}


static __be32 nfs4_preprocess_confirmed_seqid_op(struct nfsd4_compound_state *cstate, u32 seqid, stateid_t *stateid, struct nfs4_ol_stateid **stpp)
static __be32 nfs4_preprocess_confirmed_seqid_op(struct nfsd4_compound_state *cstate, u32 seqid,
						 stateid_t *stateid, struct nfs4_ol_stateid **stpp, struct nfsd_net *nn)
{
{
	__be32 status;
	__be32 status;
	struct nfs4_openowner *oo;
	struct nfs4_openowner *oo;


	status = nfs4_preprocess_seqid_op(cstate, seqid, stateid,
	status = nfs4_preprocess_seqid_op(cstate, seqid, stateid,
						NFS4_OPEN_STID, stpp);
						NFS4_OPEN_STID, stpp, nn);
	if (status)
	if (status)
		return status;
		return status;
	oo = openowner((*stpp)->st_stateowner);
	oo = openowner((*stpp)->st_stateowner);
@@ -3631,6 +3636,7 @@ nfsd4_open_confirm(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
	__be32 status;
	__be32 status;
	struct nfs4_openowner *oo;
	struct nfs4_openowner *oo;
	struct nfs4_ol_stateid *stp;
	struct nfs4_ol_stateid *stp;
	struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);


	dprintk("NFSD: nfsd4_open_confirm on file %.*s\n",
	dprintk("NFSD: nfsd4_open_confirm on file %.*s\n",
			(int)cstate->current_fh.fh_dentry->d_name.len,
			(int)cstate->current_fh.fh_dentry->d_name.len,
@@ -3644,7 +3650,7 @@ nfsd4_open_confirm(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,


	status = nfs4_preprocess_seqid_op(cstate,
	status = nfs4_preprocess_seqid_op(cstate,
					oc->oc_seqid, &oc->oc_req_stateid,
					oc->oc_seqid, &oc->oc_req_stateid,
					NFS4_OPEN_STID, &stp);
					NFS4_OPEN_STID, &stp, nn);
	if (status)
	if (status)
		goto out;
		goto out;
	oo = openowner(stp->st_stateowner);
	oo = openowner(stp->st_stateowner);
@@ -3708,6 +3714,7 @@ nfsd4_open_downgrade(struct svc_rqst *rqstp,
{
{
	__be32 status;
	__be32 status;
	struct nfs4_ol_stateid *stp;
	struct nfs4_ol_stateid *stp;
	struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);


	dprintk("NFSD: nfsd4_open_downgrade on file %.*s\n", 
	dprintk("NFSD: nfsd4_open_downgrade on file %.*s\n", 
			(int)cstate->current_fh.fh_dentry->d_name.len,
			(int)cstate->current_fh.fh_dentry->d_name.len,
@@ -3720,7 +3727,7 @@ nfsd4_open_downgrade(struct svc_rqst *rqstp,


	nfs4_lock_state();
	nfs4_lock_state();
	status = nfs4_preprocess_confirmed_seqid_op(cstate, od->od_seqid,
	status = nfs4_preprocess_confirmed_seqid_op(cstate, od->od_seqid,
					&od->od_stateid, &stp);
					&od->od_stateid, &stp, nn);
	if (status)
	if (status)
		goto out; 
		goto out; 
	status = nfserr_inval;
	status = nfserr_inval;
@@ -3783,6 +3790,8 @@ nfsd4_close(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
	__be32 status;
	__be32 status;
	struct nfs4_openowner *oo;
	struct nfs4_openowner *oo;
	struct nfs4_ol_stateid *stp;
	struct nfs4_ol_stateid *stp;
	struct net *net = SVC_NET(rqstp);
	struct nfsd_net *nn = net_generic(net, nfsd_net_id);


	dprintk("NFSD: nfsd4_close on file %.*s\n", 
	dprintk("NFSD: nfsd4_close on file %.*s\n", 
			(int)cstate->current_fh.fh_dentry->d_name.len,
			(int)cstate->current_fh.fh_dentry->d_name.len,
@@ -3792,7 +3801,7 @@ nfsd4_close(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
	status = nfs4_preprocess_seqid_op(cstate, close->cl_seqid,
	status = nfs4_preprocess_seqid_op(cstate, close->cl_seqid,
					&close->cl_stateid,
					&close->cl_stateid,
					NFS4_OPEN_STID|NFS4_CLOSED_STID,
					NFS4_OPEN_STID|NFS4_CLOSED_STID,
					&stp);
					&stp, nn);
	if (status)
	if (status)
		goto out; 
		goto out; 
	oo = openowner(stp->st_stateowner);
	oo = openowner(stp->st_stateowner);
@@ -3831,12 +3840,14 @@ nfsd4_delegreturn(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
	stateid_t *stateid = &dr->dr_stateid;
	stateid_t *stateid = &dr->dr_stateid;
	struct nfs4_stid *s;
	struct nfs4_stid *s;
	__be32 status;
	__be32 status;
	struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);


	if ((status = fh_verify(rqstp, &cstate->current_fh, S_IFREG, 0)))
	if ((status = fh_verify(rqstp, &cstate->current_fh, S_IFREG, 0)))
		return status;
		return status;


	nfs4_lock_state();
	nfs4_lock_state();
	status = nfsd4_lookup_stateid(stateid, NFS4_DELEG_STID, &s, cstate->minorversion);
	status = nfsd4_lookup_stateid(stateid, NFS4_DELEG_STID, &s,
				      cstate->minorversion, nn);
	if (status)
	if (status)
		goto out;
		goto out;
	dp = delegstateid(s);
	dp = delegstateid(s);
@@ -4085,7 +4096,8 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
	bool new_state = false;
	bool new_state = false;
	int lkflg;
	int lkflg;
	int err;
	int err;
	struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
	struct net *net = SVC_NET(rqstp);
	struct nfsd_net *nn = net_generic(net, nfsd_net_id);


	dprintk("NFSD: nfsd4_lock: start=%Ld length=%Ld\n",
	dprintk("NFSD: nfsd4_lock: start=%Ld length=%Ld\n",
		(long long) lock->lk_offset,
		(long long) lock->lk_offset,
@@ -4119,7 +4131,7 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
		status = nfs4_preprocess_confirmed_seqid_op(cstate,
		status = nfs4_preprocess_confirmed_seqid_op(cstate,
				        lock->lk_new_open_seqid,
				        lock->lk_new_open_seqid,
		                        &lock->lk_new_open_stateid,
		                        &lock->lk_new_open_stateid,
					&open_stp);
					&open_stp, nn);
		if (status)
		if (status)
			goto out;
			goto out;
		open_sop = openowner(open_stp->st_stateowner);
		open_sop = openowner(open_stp->st_stateowner);
@@ -4133,7 +4145,7 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
		status = nfs4_preprocess_seqid_op(cstate,
		status = nfs4_preprocess_seqid_op(cstate,
				       lock->lk_old_lock_seqid,
				       lock->lk_old_lock_seqid,
				       &lock->lk_old_lock_stateid,
				       &lock->lk_old_lock_stateid,
				       NFS4_LOCK_STID, &lock_stp);
				       NFS4_LOCK_STID, &lock_stp, nn);
	if (status)
	if (status)
		goto out;
		goto out;
	lock_sop = lockowner(lock_stp->st_stateowner);
	lock_sop = lockowner(lock_stp->st_stateowner);
@@ -4144,10 +4156,10 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
		goto out;
		goto out;


	status = nfserr_grace;
	status = nfserr_grace;
	if (locks_in_grace(SVC_NET(rqstp)) && !lock->lk_reclaim)
	if (locks_in_grace(net) && !lock->lk_reclaim)
		goto out;
		goto out;
	status = nfserr_no_grace;
	status = nfserr_no_grace;
	if (!locks_in_grace(SVC_NET(rqstp)) && lock->lk_reclaim)
	if (!locks_in_grace(net) && lock->lk_reclaim)
		goto out;
		goto out;


	file_lock = locks_alloc_lock();
	file_lock = locks_alloc_lock();
@@ -4333,6 +4345,7 @@ nfsd4_locku(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
	struct file_lock *file_lock = NULL;
	struct file_lock *file_lock = NULL;
	__be32 status;
	__be32 status;
	int err;
	int err;
	struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);


	dprintk("NFSD: nfsd4_locku: start=%Ld length=%Ld\n",
	dprintk("NFSD: nfsd4_locku: start=%Ld length=%Ld\n",
		(long long) locku->lu_offset,
		(long long) locku->lu_offset,
@@ -4344,7 +4357,8 @@ nfsd4_locku(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
	nfs4_lock_state();
	nfs4_lock_state();
									        
									        
	status = nfs4_preprocess_seqid_op(cstate, locku->lu_seqid,
	status = nfs4_preprocess_seqid_op(cstate, locku->lu_seqid,
					&locku->lu_stateid, NFS4_LOCK_STID, &stp);
					&locku->lu_stateid, NFS4_LOCK_STID,
					&stp, nn);
	if (status)
	if (status)
		goto out;
		goto out;
	filp = find_any_file(stp->st_file);
	filp = find_any_file(stp->st_file);
@@ -4564,10 +4578,9 @@ nfsd4_find_reclaim_client(const char *recdir, struct nfsd_net *nn)
* Called from OPEN. Look for clientid in reclaim list.
* Called from OPEN. Look for clientid in reclaim list.
*/
*/
__be32
__be32
nfs4_check_open_reclaim(clientid_t *clid, bool sessions)
nfs4_check_open_reclaim(clientid_t *clid, bool sessions, struct nfsd_net *nn)
{
{
	struct nfs4_client *clp;
	struct nfs4_client *clp;
	struct nfsd_net *nn = net_generic(&init_net, nfsd_net_id);


	/* find clientid in conf_id_hashtbl */
	/* find clientid in conf_id_hashtbl */
	clp = find_confirmed_client(clid, sessions, nn);
	clp = find_confirmed_client(clid, sessions, nn);
@@ -4583,7 +4596,7 @@ void nfsd_forget_clients(u64 num)
{
{
	struct nfs4_client *clp, *next;
	struct nfs4_client *clp, *next;
	int count = 0;
	int count = 0;
	struct nfsd_net *nn = net_generic(&init_net, nfsd_net_id);
	struct nfsd_net *nn = net_generic(current->nsproxy->net_ns, nfsd_net_id);


	nfs4_lock_state();
	nfs4_lock_state();
	list_for_each_entry_safe(clp, next, &nn->client_lru, cl_lru) {
	list_for_each_entry_safe(clp, next, &nn->client_lru, cl_lru) {
@@ -4897,8 +4910,8 @@ __nfs4_state_shutdown(struct net *net)
		unhash_delegation(dp);
		unhash_delegation(dp);
	}
	}


	nfsd4_client_tracking_exit(&init_net);
	nfsd4_client_tracking_exit(net);
	put_net(&init_net);
	put_net(net);
}
}


void
void
+1 −1
Original line number Original line Diff line number Diff line
@@ -470,7 +470,7 @@ void nfs4_remove_reclaim_record(struct nfs4_client_reclaim *, struct nfsd_net *)
extern void nfs4_release_reclaim(struct nfsd_net *);
extern void nfs4_release_reclaim(struct nfsd_net *);
extern struct nfs4_client_reclaim *nfsd4_find_reclaim_client(const char *recdir,
extern struct nfs4_client_reclaim *nfsd4_find_reclaim_client(const char *recdir,
							struct nfsd_net *nn);
							struct nfsd_net *nn);
extern __be32 nfs4_check_open_reclaim(clientid_t *clid, bool sessions);
extern __be32 nfs4_check_open_reclaim(clientid_t *clid, bool sessions, struct nfsd_net *nn);
extern void nfs4_free_openowner(struct nfs4_openowner *);
extern void nfs4_free_openowner(struct nfs4_openowner *);
extern void nfs4_free_lockowner(struct nfs4_lockowner *);
extern void nfs4_free_lockowner(struct nfs4_lockowner *);
extern int set_callback_cred(void);
extern int set_callback_cred(void);
+1 −1
Original line number Original line Diff line number Diff line
@@ -581,7 +581,7 @@ extern __be32 nfsd4_destroy_session(struct svc_rqst *,
extern __be32 nfsd4_destroy_clientid(struct svc_rqst *, struct nfsd4_compound_state *, struct nfsd4_destroy_clientid *);
extern __be32 nfsd4_destroy_clientid(struct svc_rqst *, struct nfsd4_compound_state *, struct nfsd4_destroy_clientid *);
__be32 nfsd4_reclaim_complete(struct svc_rqst *, struct nfsd4_compound_state *, struct nfsd4_reclaim_complete *);
__be32 nfsd4_reclaim_complete(struct svc_rqst *, struct nfsd4_compound_state *, struct nfsd4_reclaim_complete *);
extern __be32 nfsd4_process_open1(struct nfsd4_compound_state *,
extern __be32 nfsd4_process_open1(struct nfsd4_compound_state *,
		struct nfsd4_open *open);
		struct nfsd4_open *open, struct nfsd_net *nn);
extern __be32 nfsd4_process_open2(struct svc_rqst *rqstp,
extern __be32 nfsd4_process_open2(struct svc_rqst *rqstp,
		struct svc_fh *current_fh, struct nfsd4_open *open);
		struct svc_fh *current_fh, struct nfsd4_open *open);
extern void nfsd4_cleanup_open_state(struct nfsd4_open *open, __be32 status);
extern void nfsd4_cleanup_open_state(struct nfsd4_open *open, __be32 status);