|
@@ -1,6 +1,4 @@
|
|
/*
|
|
/*
|
|
-* linux/fs/nfsd/nfs4state.c
|
|
|
|
-*
|
|
|
|
* Copyright (c) 2001 The Regents of the University of Michigan.
|
|
* Copyright (c) 2001 The Regents of the University of Michigan.
|
|
* All rights reserved.
|
|
* All rights reserved.
|
|
*
|
|
*
|
|
@@ -34,28 +32,14 @@
|
|
*
|
|
*
|
|
*/
|
|
*/
|
|
|
|
|
|
-#include <linux/param.h>
|
|
|
|
-#include <linux/major.h>
|
|
|
|
-#include <linux/slab.h>
|
|
|
|
-
|
|
|
|
-#include <linux/sunrpc/svc.h>
|
|
|
|
-#include <linux/nfsd/nfsd.h>
|
|
|
|
-#include <linux/nfsd/cache.h>
|
|
|
|
#include <linux/file.h>
|
|
#include <linux/file.h>
|
|
-#include <linux/mount.h>
|
|
|
|
-#include <linux/workqueue.h>
|
|
|
|
#include <linux/smp_lock.h>
|
|
#include <linux/smp_lock.h>
|
|
-#include <linux/kthread.h>
|
|
|
|
-#include <linux/nfs4.h>
|
|
|
|
-#include <linux/nfsd/state.h>
|
|
|
|
-#include <linux/nfsd/xdr4.h>
|
|
|
|
#include <linux/namei.h>
|
|
#include <linux/namei.h>
|
|
#include <linux/swap.h>
|
|
#include <linux/swap.h>
|
|
-#include <linux/mutex.h>
|
|
|
|
-#include <linux/lockd/bind.h>
|
|
|
|
-#include <linux/module.h>
|
|
|
|
#include <linux/sunrpc/svcauth_gss.h>
|
|
#include <linux/sunrpc/svcauth_gss.h>
|
|
#include <linux/sunrpc/clnt.h>
|
|
#include <linux/sunrpc/clnt.h>
|
|
|
|
+#include "xdr4.h"
|
|
|
|
+#include "vfs.h"
|
|
|
|
|
|
#define NFSDDBG_FACILITY NFSDDBG_PROC
|
|
#define NFSDDBG_FACILITY NFSDDBG_PROC
|
|
|
|
|
|
@@ -477,13 +461,14 @@ static int set_forechannel_drc_size(struct nfsd4_channel_attrs *fchan)
|
|
|
|
|
|
/*
|
|
/*
|
|
* fchan holds the client values on input, and the server values on output
|
|
* fchan holds the client values on input, and the server values on output
|
|
|
|
+ * sv_max_mesg is the maximum payload plus one page for overhead.
|
|
*/
|
|
*/
|
|
static int init_forechannel_attrs(struct svc_rqst *rqstp,
|
|
static int init_forechannel_attrs(struct svc_rqst *rqstp,
|
|
struct nfsd4_channel_attrs *session_fchan,
|
|
struct nfsd4_channel_attrs *session_fchan,
|
|
struct nfsd4_channel_attrs *fchan)
|
|
struct nfsd4_channel_attrs *fchan)
|
|
{
|
|
{
|
|
int status = 0;
|
|
int status = 0;
|
|
- __u32 maxcount = svc_max_payload(rqstp);
|
|
|
|
|
|
+ __u32 maxcount = nfsd_serv->sv_max_mesg;
|
|
|
|
|
|
/* headerpadsz set to zero in encode routine */
|
|
/* headerpadsz set to zero in encode routine */
|
|
|
|
|
|
@@ -523,6 +508,15 @@ free_session_slots(struct nfsd4_session *ses)
|
|
kfree(ses->se_slots[i]);
|
|
kfree(ses->se_slots[i]);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * We don't actually need to cache the rpc and session headers, so we
|
|
|
|
+ * can allocate a little less for each slot:
|
|
|
|
+ */
|
|
|
|
+static inline int slot_bytes(struct nfsd4_channel_attrs *ca)
|
|
|
|
+{
|
|
|
|
+ return ca->maxresp_cached - NFSD_MIN_HDR_SEQ_SZ;
|
|
|
|
+}
|
|
|
|
+
|
|
static int
|
|
static int
|
|
alloc_init_session(struct svc_rqst *rqstp, struct nfs4_client *clp,
|
|
alloc_init_session(struct svc_rqst *rqstp, struct nfs4_client *clp,
|
|
struct nfsd4_create_session *cses)
|
|
struct nfsd4_create_session *cses)
|
|
@@ -554,7 +548,7 @@ alloc_init_session(struct svc_rqst *rqstp, struct nfs4_client *clp,
|
|
memcpy(new, &tmp, sizeof(*new));
|
|
memcpy(new, &tmp, sizeof(*new));
|
|
|
|
|
|
/* allocate each struct nfsd4_slot and data cache in one piece */
|
|
/* allocate each struct nfsd4_slot and data cache in one piece */
|
|
- cachesize = new->se_fchannel.maxresp_cached - NFSD_MIN_HDR_SEQ_SZ;
|
|
|
|
|
|
+ cachesize = slot_bytes(&new->se_fchannel);
|
|
for (i = 0; i < new->se_fchannel.maxreqs; i++) {
|
|
for (i = 0; i < new->se_fchannel.maxreqs; i++) {
|
|
sp = kzalloc(sizeof(*sp) + cachesize, GFP_KERNEL);
|
|
sp = kzalloc(sizeof(*sp) + cachesize, GFP_KERNEL);
|
|
if (!sp)
|
|
if (!sp)
|
|
@@ -628,10 +622,12 @@ void
|
|
free_session(struct kref *kref)
|
|
free_session(struct kref *kref)
|
|
{
|
|
{
|
|
struct nfsd4_session *ses;
|
|
struct nfsd4_session *ses;
|
|
|
|
+ int mem;
|
|
|
|
|
|
ses = container_of(kref, struct nfsd4_session, se_ref);
|
|
ses = container_of(kref, struct nfsd4_session, se_ref);
|
|
spin_lock(&nfsd_drc_lock);
|
|
spin_lock(&nfsd_drc_lock);
|
|
- nfsd_drc_mem_used -= ses->se_fchannel.maxreqs * NFSD_SLOT_CACHE_SIZE;
|
|
|
|
|
|
+ mem = ses->se_fchannel.maxreqs * slot_bytes(&ses->se_fchannel);
|
|
|
|
+ nfsd_drc_mem_used -= mem;
|
|
spin_unlock(&nfsd_drc_lock);
|
|
spin_unlock(&nfsd_drc_lock);
|
|
free_session_slots(ses);
|
|
free_session_slots(ses);
|
|
kfree(ses);
|
|
kfree(ses);
|
|
@@ -2404,11 +2400,8 @@ nfs4_open_delegation(struct svc_fh *fh, struct nfsd4_open *open, struct nfs4_sta
|
|
|
|
|
|
memcpy(&open->op_delegate_stateid, &dp->dl_stateid, sizeof(dp->dl_stateid));
|
|
memcpy(&open->op_delegate_stateid, &dp->dl_stateid, sizeof(dp->dl_stateid));
|
|
|
|
|
|
- dprintk("NFSD: delegation stateid=(%08x/%08x/%08x/%08x)\n\n",
|
|
|
|
- dp->dl_stateid.si_boot,
|
|
|
|
- dp->dl_stateid.si_stateownerid,
|
|
|
|
- dp->dl_stateid.si_fileid,
|
|
|
|
- dp->dl_stateid.si_generation);
|
|
|
|
|
|
+ dprintk("NFSD: delegation stateid=" STATEID_FMT "\n",
|
|
|
|
+ STATEID_VAL(&dp->dl_stateid));
|
|
out:
|
|
out:
|
|
if (open->op_claim_type == NFS4_OPEN_CLAIM_PREVIOUS
|
|
if (open->op_claim_type == NFS4_OPEN_CLAIM_PREVIOUS
|
|
&& flag == NFS4_OPEN_DELEGATE_NONE
|
|
&& flag == NFS4_OPEN_DELEGATE_NONE
|
|
@@ -2498,9 +2491,8 @@ nfsd4_process_open2(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nf
|
|
|
|
|
|
status = nfs_ok;
|
|
status = nfs_ok;
|
|
|
|
|
|
- dprintk("nfs4_process_open2: stateid=(%08x/%08x/%08x/%08x)\n",
|
|
|
|
- stp->st_stateid.si_boot, stp->st_stateid.si_stateownerid,
|
|
|
|
- stp->st_stateid.si_fileid, stp->st_stateid.si_generation);
|
|
|
|
|
|
+ dprintk("%s: stateid=" STATEID_FMT "\n", __func__,
|
|
|
|
+ STATEID_VAL(&stp->st_stateid));
|
|
out:
|
|
out:
|
|
if (fp)
|
|
if (fp)
|
|
put_nfs4_file(fp);
|
|
put_nfs4_file(fp);
|
|
@@ -2666,9 +2658,8 @@ STALE_STATEID(stateid_t *stateid)
|
|
{
|
|
{
|
|
if (time_after((unsigned long)boot_time,
|
|
if (time_after((unsigned long)boot_time,
|
|
(unsigned long)stateid->si_boot)) {
|
|
(unsigned long)stateid->si_boot)) {
|
|
- dprintk("NFSD: stale stateid (%08x/%08x/%08x/%08x)!\n",
|
|
|
|
- stateid->si_boot, stateid->si_stateownerid,
|
|
|
|
- stateid->si_fileid, stateid->si_generation);
|
|
|
|
|
|
+ dprintk("NFSD: stale stateid " STATEID_FMT "!\n",
|
|
|
|
+ STATEID_VAL(stateid));
|
|
return 1;
|
|
return 1;
|
|
}
|
|
}
|
|
return 0;
|
|
return 0;
|
|
@@ -2680,9 +2671,8 @@ EXPIRED_STATEID(stateid_t *stateid)
|
|
if (time_before((unsigned long)boot_time,
|
|
if (time_before((unsigned long)boot_time,
|
|
((unsigned long)stateid->si_boot)) &&
|
|
((unsigned long)stateid->si_boot)) &&
|
|
time_before((unsigned long)(stateid->si_boot + lease_time), get_seconds())) {
|
|
time_before((unsigned long)(stateid->si_boot + lease_time), get_seconds())) {
|
|
- dprintk("NFSD: expired stateid (%08x/%08x/%08x/%08x)!\n",
|
|
|
|
- stateid->si_boot, stateid->si_stateownerid,
|
|
|
|
- stateid->si_fileid, stateid->si_generation);
|
|
|
|
|
|
+ dprintk("NFSD: expired stateid " STATEID_FMT "!\n",
|
|
|
|
+ STATEID_VAL(stateid));
|
|
return 1;
|
|
return 1;
|
|
}
|
|
}
|
|
return 0;
|
|
return 0;
|
|
@@ -2696,9 +2686,8 @@ stateid_error_map(stateid_t *stateid)
|
|
if (EXPIRED_STATEID(stateid))
|
|
if (EXPIRED_STATEID(stateid))
|
|
return nfserr_expired;
|
|
return nfserr_expired;
|
|
|
|
|
|
- dprintk("NFSD: bad stateid (%08x/%08x/%08x/%08x)!\n",
|
|
|
|
- stateid->si_boot, stateid->si_stateownerid,
|
|
|
|
- stateid->si_fileid, stateid->si_generation);
|
|
|
|
|
|
+ dprintk("NFSD: bad stateid " STATEID_FMT "!\n",
|
|
|
|
+ STATEID_VAL(stateid));
|
|
return nfserr_bad_stateid;
|
|
return nfserr_bad_stateid;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -2884,10 +2873,8 @@ nfs4_preprocess_seqid_op(struct nfsd4_compound_state *cstate, u32 seqid,
|
|
struct svc_fh *current_fh = &cstate->current_fh;
|
|
struct svc_fh *current_fh = &cstate->current_fh;
|
|
__be32 status;
|
|
__be32 status;
|
|
|
|
|
|
- dprintk("NFSD: preprocess_seqid_op: seqid=%d "
|
|
|
|
- "stateid = (%08x/%08x/%08x/%08x)\n", seqid,
|
|
|
|
- stateid->si_boot, stateid->si_stateownerid, stateid->si_fileid,
|
|
|
|
- stateid->si_generation);
|
|
|
|
|
|
+ dprintk("NFSD: %s: seqid=%d stateid = " STATEID_FMT "\n", __func__,
|
|
|
|
+ seqid, STATEID_VAL(stateid));
|
|
|
|
|
|
*stpp = NULL;
|
|
*stpp = NULL;
|
|
*sopp = NULL;
|
|
*sopp = NULL;
|
|
@@ -3019,12 +3006,8 @@ nfsd4_open_confirm(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
|
|
sop->so_confirmed = 1;
|
|
sop->so_confirmed = 1;
|
|
update_stateid(&stp->st_stateid);
|
|
update_stateid(&stp->st_stateid);
|
|
memcpy(&oc->oc_resp_stateid, &stp->st_stateid, sizeof(stateid_t));
|
|
memcpy(&oc->oc_resp_stateid, &stp->st_stateid, sizeof(stateid_t));
|
|
- dprintk("NFSD: nfsd4_open_confirm: success, seqid=%d "
|
|
|
|
- "stateid=(%08x/%08x/%08x/%08x)\n", oc->oc_seqid,
|
|
|
|
- stp->st_stateid.si_boot,
|
|
|
|
- stp->st_stateid.si_stateownerid,
|
|
|
|
- stp->st_stateid.si_fileid,
|
|
|
|
- stp->st_stateid.si_generation);
|
|
|
|
|
|
+ dprintk("NFSD: %s: success, seqid=%d stateid=" STATEID_FMT "\n",
|
|
|
|
+ __func__, oc->oc_seqid, STATEID_VAL(&stp->st_stateid));
|
|
|
|
|
|
nfsd4_create_clid_dir(sop->so_client);
|
|
nfsd4_create_clid_dir(sop->so_client);
|
|
out:
|
|
out:
|
|
@@ -3283,9 +3266,8 @@ find_delegation_stateid(struct inode *ino, stateid_t *stid)
|
|
struct nfs4_file *fp;
|
|
struct nfs4_file *fp;
|
|
struct nfs4_delegation *dl;
|
|
struct nfs4_delegation *dl;
|
|
|
|
|
|
- dprintk("NFSD:find_delegation_stateid stateid=(%08x/%08x/%08x/%08x)\n",
|
|
|
|
- stid->si_boot, stid->si_stateownerid,
|
|
|
|
- stid->si_fileid, stid->si_generation);
|
|
|
|
|
|
+ dprintk("NFSD: %s: stateid=" STATEID_FMT "\n", __func__,
|
|
|
|
+ STATEID_VAL(stid));
|
|
|
|
|
|
fp = find_file(ino);
|
|
fp = find_file(ino);
|
|
if (!fp)
|
|
if (!fp)
|