diff options
Diffstat (limited to 'fs/nfsd/nfs4state.c')
| -rw-r--r-- | fs/nfsd/nfs4state.c | 84 |
1 files changed, 33 insertions, 51 deletions
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c index 2153f9bdbebd..f19ed866c95f 100644 --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c | |||
| @@ -1,6 +1,4 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * linux/fs/nfsd/nfs4state.c | ||
| 3 | * | ||
| 4 | * Copyright (c) 2001 The Regents of the University of Michigan. | 2 | * Copyright (c) 2001 The Regents of the University of Michigan. |
| 5 | * All rights reserved. | 3 | * All rights reserved. |
| 6 | * | 4 | * |
| @@ -34,28 +32,14 @@ | |||
| 34 | * | 32 | * |
| 35 | */ | 33 | */ |
| 36 | 34 | ||
| 37 | #include <linux/param.h> | ||
| 38 | #include <linux/major.h> | ||
| 39 | #include <linux/slab.h> | ||
| 40 | |||
| 41 | #include <linux/sunrpc/svc.h> | ||
| 42 | #include <linux/nfsd/nfsd.h> | ||
| 43 | #include <linux/nfsd/cache.h> | ||
| 44 | #include <linux/file.h> | 35 | #include <linux/file.h> |
| 45 | #include <linux/mount.h> | ||
| 46 | #include <linux/workqueue.h> | ||
| 47 | #include <linux/smp_lock.h> | 36 | #include <linux/smp_lock.h> |
| 48 | #include <linux/kthread.h> | ||
| 49 | #include <linux/nfs4.h> | ||
| 50 | #include <linux/nfsd/state.h> | ||
| 51 | #include <linux/nfsd/xdr4.h> | ||
| 52 | #include <linux/namei.h> | 37 | #include <linux/namei.h> |
| 53 | #include <linux/swap.h> | 38 | #include <linux/swap.h> |
| 54 | #include <linux/mutex.h> | ||
| 55 | #include <linux/lockd/bind.h> | ||
| 56 | #include <linux/module.h> | ||
| 57 | #include <linux/sunrpc/svcauth_gss.h> | 39 | #include <linux/sunrpc/svcauth_gss.h> |
| 58 | #include <linux/sunrpc/clnt.h> | 40 | #include <linux/sunrpc/clnt.h> |
| 41 | #include "xdr4.h" | ||
| 42 | #include "vfs.h" | ||
| 59 | 43 | ||
| 60 | #define NFSDDBG_FACILITY NFSDDBG_PROC | 44 | #define NFSDDBG_FACILITY NFSDDBG_PROC |
| 61 | 45 | ||
| @@ -477,13 +461,14 @@ static int set_forechannel_drc_size(struct nfsd4_channel_attrs *fchan) | |||
| 477 | 461 | ||
| 478 | /* | 462 | /* |
| 479 | * fchan holds the client values on input, and the server values on output | 463 | * fchan holds the client values on input, and the server values on output |
| 464 | * sv_max_mesg is the maximum payload plus one page for overhead. | ||
| 480 | */ | 465 | */ |
| 481 | static int init_forechannel_attrs(struct svc_rqst *rqstp, | 466 | static int init_forechannel_attrs(struct svc_rqst *rqstp, |
| 482 | struct nfsd4_channel_attrs *session_fchan, | 467 | struct nfsd4_channel_attrs *session_fchan, |
| 483 | struct nfsd4_channel_attrs *fchan) | 468 | struct nfsd4_channel_attrs *fchan) |
| 484 | { | 469 | { |
| 485 | int status = 0; | 470 | int status = 0; |
| 486 | __u32 maxcount = svc_max_payload(rqstp); | 471 | __u32 maxcount = nfsd_serv->sv_max_mesg; |
| 487 | 472 | ||
| 488 | /* headerpadsz set to zero in encode routine */ | 473 | /* headerpadsz set to zero in encode routine */ |
| 489 | 474 | ||
| @@ -523,6 +508,15 @@ free_session_slots(struct nfsd4_session *ses) | |||
| 523 | kfree(ses->se_slots[i]); | 508 | kfree(ses->se_slots[i]); |
| 524 | } | 509 | } |
| 525 | 510 | ||
| 511 | /* | ||
| 512 | * We don't actually need to cache the rpc and session headers, so we | ||
| 513 | * can allocate a little less for each slot: | ||
| 514 | */ | ||
| 515 | static inline int slot_bytes(struct nfsd4_channel_attrs *ca) | ||
| 516 | { | ||
| 517 | return ca->maxresp_cached - NFSD_MIN_HDR_SEQ_SZ; | ||
| 518 | } | ||
| 519 | |||
| 526 | static int | 520 | static int |
| 527 | alloc_init_session(struct svc_rqst *rqstp, struct nfs4_client *clp, | 521 | alloc_init_session(struct svc_rqst *rqstp, struct nfs4_client *clp, |
| 528 | struct nfsd4_create_session *cses) | 522 | struct nfsd4_create_session *cses) |
| @@ -554,7 +548,7 @@ alloc_init_session(struct svc_rqst *rqstp, struct nfs4_client *clp, | |||
| 554 | memcpy(new, &tmp, sizeof(*new)); | 548 | memcpy(new, &tmp, sizeof(*new)); |
| 555 | 549 | ||
| 556 | /* allocate each struct nfsd4_slot and data cache in one piece */ | 550 | /* allocate each struct nfsd4_slot and data cache in one piece */ |
| 557 | cachesize = new->se_fchannel.maxresp_cached - NFSD_MIN_HDR_SEQ_SZ; | 551 | cachesize = slot_bytes(&new->se_fchannel); |
| 558 | for (i = 0; i < new->se_fchannel.maxreqs; i++) { | 552 | for (i = 0; i < new->se_fchannel.maxreqs; i++) { |
| 559 | sp = kzalloc(sizeof(*sp) + cachesize, GFP_KERNEL); | 553 | sp = kzalloc(sizeof(*sp) + cachesize, GFP_KERNEL); |
| 560 | if (!sp) | 554 | if (!sp) |
| @@ -628,10 +622,12 @@ void | |||
| 628 | free_session(struct kref *kref) | 622 | free_session(struct kref *kref) |
| 629 | { | 623 | { |
| 630 | struct nfsd4_session *ses; | 624 | struct nfsd4_session *ses; |
| 625 | int mem; | ||
| 631 | 626 | ||
| 632 | ses = container_of(kref, struct nfsd4_session, se_ref); | 627 | ses = container_of(kref, struct nfsd4_session, se_ref); |
| 633 | spin_lock(&nfsd_drc_lock); | 628 | spin_lock(&nfsd_drc_lock); |
| 634 | nfsd_drc_mem_used -= ses->se_fchannel.maxreqs * NFSD_SLOT_CACHE_SIZE; | 629 | mem = ses->se_fchannel.maxreqs * slot_bytes(&ses->se_fchannel); |
| 630 | nfsd_drc_mem_used -= mem; | ||
| 635 | spin_unlock(&nfsd_drc_lock); | 631 | spin_unlock(&nfsd_drc_lock); |
| 636 | free_session_slots(ses); | 632 | free_session_slots(ses); |
| 637 | kfree(ses); | 633 | kfree(ses); |
| @@ -2404,11 +2400,8 @@ nfs4_open_delegation(struct svc_fh *fh, struct nfsd4_open *open, struct nfs4_sta | |||
| 2404 | 2400 | ||
| 2405 | memcpy(&open->op_delegate_stateid, &dp->dl_stateid, sizeof(dp->dl_stateid)); | 2401 | memcpy(&open->op_delegate_stateid, &dp->dl_stateid, sizeof(dp->dl_stateid)); |
| 2406 | 2402 | ||
| 2407 | dprintk("NFSD: delegation stateid=(%08x/%08x/%08x/%08x)\n\n", | 2403 | dprintk("NFSD: delegation stateid=" STATEID_FMT "\n", |
| 2408 | dp->dl_stateid.si_boot, | 2404 | STATEID_VAL(&dp->dl_stateid)); |
| 2409 | dp->dl_stateid.si_stateownerid, | ||
| 2410 | dp->dl_stateid.si_fileid, | ||
| 2411 | dp->dl_stateid.si_generation); | ||
| 2412 | out: | 2405 | out: |
| 2413 | if (open->op_claim_type == NFS4_OPEN_CLAIM_PREVIOUS | 2406 | if (open->op_claim_type == NFS4_OPEN_CLAIM_PREVIOUS |
| 2414 | && flag == NFS4_OPEN_DELEGATE_NONE | 2407 | && flag == NFS4_OPEN_DELEGATE_NONE |
| @@ -2498,9 +2491,8 @@ nfsd4_process_open2(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nf | |||
| 2498 | 2491 | ||
| 2499 | status = nfs_ok; | 2492 | status = nfs_ok; |
| 2500 | 2493 | ||
| 2501 | dprintk("nfs4_process_open2: stateid=(%08x/%08x/%08x/%08x)\n", | 2494 | dprintk("%s: stateid=" STATEID_FMT "\n", __func__, |
| 2502 | stp->st_stateid.si_boot, stp->st_stateid.si_stateownerid, | 2495 | STATEID_VAL(&stp->st_stateid)); |
| 2503 | stp->st_stateid.si_fileid, stp->st_stateid.si_generation); | ||
| 2504 | out: | 2496 | out: |
| 2505 | if (fp) | 2497 | if (fp) |
| 2506 | put_nfs4_file(fp); | 2498 | put_nfs4_file(fp); |
| @@ -2666,9 +2658,8 @@ STALE_STATEID(stateid_t *stateid) | |||
| 2666 | { | 2658 | { |
| 2667 | if (time_after((unsigned long)boot_time, | 2659 | if (time_after((unsigned long)boot_time, |
| 2668 | (unsigned long)stateid->si_boot)) { | 2660 | (unsigned long)stateid->si_boot)) { |
| 2669 | dprintk("NFSD: stale stateid (%08x/%08x/%08x/%08x)!\n", | 2661 | dprintk("NFSD: stale stateid " STATEID_FMT "!\n", |
| 2670 | stateid->si_boot, stateid->si_stateownerid, | 2662 | STATEID_VAL(stateid)); |
| 2671 | stateid->si_fileid, stateid->si_generation); | ||
| 2672 | return 1; | 2663 | return 1; |
| 2673 | } | 2664 | } |
| 2674 | return 0; | 2665 | return 0; |
| @@ -2680,9 +2671,8 @@ EXPIRED_STATEID(stateid_t *stateid) | |||
| 2680 | if (time_before((unsigned long)boot_time, | 2671 | if (time_before((unsigned long)boot_time, |
| 2681 | ((unsigned long)stateid->si_boot)) && | 2672 | ((unsigned long)stateid->si_boot)) && |
| 2682 | time_before((unsigned long)(stateid->si_boot + lease_time), get_seconds())) { | 2673 | time_before((unsigned long)(stateid->si_boot + lease_time), get_seconds())) { |
| 2683 | dprintk("NFSD: expired stateid (%08x/%08x/%08x/%08x)!\n", | 2674 | dprintk("NFSD: expired stateid " STATEID_FMT "!\n", |
| 2684 | stateid->si_boot, stateid->si_stateownerid, | 2675 | STATEID_VAL(stateid)); |
| 2685 | stateid->si_fileid, stateid->si_generation); | ||
| 2686 | return 1; | 2676 | return 1; |
| 2687 | } | 2677 | } |
| 2688 | return 0; | 2678 | return 0; |
| @@ -2696,9 +2686,8 @@ stateid_error_map(stateid_t *stateid) | |||
| 2696 | if (EXPIRED_STATEID(stateid)) | 2686 | if (EXPIRED_STATEID(stateid)) |
| 2697 | return nfserr_expired; | 2687 | return nfserr_expired; |
| 2698 | 2688 | ||
| 2699 | dprintk("NFSD: bad stateid (%08x/%08x/%08x/%08x)!\n", | 2689 | dprintk("NFSD: bad stateid " STATEID_FMT "!\n", |
| 2700 | stateid->si_boot, stateid->si_stateownerid, | 2690 | STATEID_VAL(stateid)); |
| 2701 | stateid->si_fileid, stateid->si_generation); | ||
| 2702 | return nfserr_bad_stateid; | 2691 | return nfserr_bad_stateid; |
| 2703 | } | 2692 | } |
| 2704 | 2693 | ||
| @@ -2884,10 +2873,8 @@ nfs4_preprocess_seqid_op(struct nfsd4_compound_state *cstate, u32 seqid, | |||
| 2884 | struct svc_fh *current_fh = &cstate->current_fh; | 2873 | struct svc_fh *current_fh = &cstate->current_fh; |
| 2885 | __be32 status; | 2874 | __be32 status; |
| 2886 | 2875 | ||
| 2887 | dprintk("NFSD: preprocess_seqid_op: seqid=%d " | 2876 | dprintk("NFSD: %s: seqid=%d stateid = " STATEID_FMT "\n", __func__, |
| 2888 | "stateid = (%08x/%08x/%08x/%08x)\n", seqid, | 2877 | seqid, STATEID_VAL(stateid)); |
| 2889 | stateid->si_boot, stateid->si_stateownerid, stateid->si_fileid, | ||
| 2890 | stateid->si_generation); | ||
| 2891 | 2878 | ||
| 2892 | *stpp = NULL; | 2879 | *stpp = NULL; |
| 2893 | *sopp = NULL; | 2880 | *sopp = NULL; |
| @@ -3019,12 +3006,8 @@ nfsd4_open_confirm(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, | |||
| 3019 | sop->so_confirmed = 1; | 3006 | sop->so_confirmed = 1; |
| 3020 | update_stateid(&stp->st_stateid); | 3007 | update_stateid(&stp->st_stateid); |
| 3021 | memcpy(&oc->oc_resp_stateid, &stp->st_stateid, sizeof(stateid_t)); | 3008 | memcpy(&oc->oc_resp_stateid, &stp->st_stateid, sizeof(stateid_t)); |
| 3022 | dprintk("NFSD: nfsd4_open_confirm: success, seqid=%d " | 3009 | dprintk("NFSD: %s: success, seqid=%d stateid=" STATEID_FMT "\n", |
| 3023 | "stateid=(%08x/%08x/%08x/%08x)\n", oc->oc_seqid, | 3010 | __func__, oc->oc_seqid, STATEID_VAL(&stp->st_stateid)); |
| 3024 | stp->st_stateid.si_boot, | ||
| 3025 | stp->st_stateid.si_stateownerid, | ||
| 3026 | stp->st_stateid.si_fileid, | ||
| 3027 | stp->st_stateid.si_generation); | ||
| 3028 | 3011 | ||
| 3029 | nfsd4_create_clid_dir(sop->so_client); | 3012 | nfsd4_create_clid_dir(sop->so_client); |
| 3030 | out: | 3013 | out: |
| @@ -3283,9 +3266,8 @@ find_delegation_stateid(struct inode *ino, stateid_t *stid) | |||
| 3283 | struct nfs4_file *fp; | 3266 | struct nfs4_file *fp; |
| 3284 | struct nfs4_delegation *dl; | 3267 | struct nfs4_delegation *dl; |
| 3285 | 3268 | ||
| 3286 | dprintk("NFSD:find_delegation_stateid stateid=(%08x/%08x/%08x/%08x)\n", | 3269 | dprintk("NFSD: %s: stateid=" STATEID_FMT "\n", __func__, |
| 3287 | stid->si_boot, stid->si_stateownerid, | 3270 | STATEID_VAL(stid)); |
| 3288 | stid->si_fileid, stid->si_generation); | ||
| 3289 | 3271 | ||
| 3290 | fp = find_file(ino); | 3272 | fp = find_file(ino); |
| 3291 | if (!fp) | 3273 | if (!fp) |
