diff options
| -rw-r--r-- | fs/nfsd/nfs4state.c | 56 |
1 files changed, 11 insertions, 45 deletions
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c index 296eded356b6..12f7109720c2 100644 --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c | |||
| @@ -190,7 +190,7 @@ alloc_init_deleg(struct nfs4_client *clp, struct nfs4_stateid *stp, struct svc_f | |||
| 190 | dp->dl_vfs_file = stp->st_vfs_file; | 190 | dp->dl_vfs_file = stp->st_vfs_file; |
| 191 | dp->dl_type = type; | 191 | dp->dl_type = type; |
| 192 | dp->dl_ident = cb->cb_ident; | 192 | dp->dl_ident = cb->cb_ident; |
| 193 | dp->dl_stateid.si_boot = get_seconds(); | 193 | dp->dl_stateid.si_boot = boot_time; |
| 194 | dp->dl_stateid.si_stateownerid = current_delegid++; | 194 | dp->dl_stateid.si_stateownerid = current_delegid++; |
| 195 | dp->dl_stateid.si_fileid = 0; | 195 | dp->dl_stateid.si_fileid = 0; |
| 196 | dp->dl_stateid.si_generation = 0; | 196 | dp->dl_stateid.si_generation = 0; |
| @@ -1884,7 +1884,7 @@ init_stateid(struct nfs4_stateid *stp, struct nfs4_file *fp, struct nfsd4_open * | |||
| 1884 | stp->st_stateowner = sop; | 1884 | stp->st_stateowner = sop; |
| 1885 | get_nfs4_file(fp); | 1885 | get_nfs4_file(fp); |
| 1886 | stp->st_file = fp; | 1886 | stp->st_file = fp; |
| 1887 | stp->st_stateid.si_boot = get_seconds(); | 1887 | stp->st_stateid.si_boot = boot_time; |
| 1888 | stp->st_stateid.si_stateownerid = sop->so_id; | 1888 | stp->st_stateid.si_stateownerid = sop->so_id; |
| 1889 | stp->st_stateid.si_fileid = fp->fi_id; | 1889 | stp->st_stateid.si_fileid = fp->fi_id; |
| 1890 | stp->st_stateid.si_generation = 0; | 1890 | stp->st_stateid.si_generation = 0; |
| @@ -2733,39 +2733,11 @@ nfs4_check_fh(struct svc_fh *fhp, struct nfs4_stateid *stp) | |||
| 2733 | static int | 2733 | static int |
| 2734 | STALE_STATEID(stateid_t *stateid) | 2734 | STALE_STATEID(stateid_t *stateid) |
| 2735 | { | 2735 | { |
| 2736 | if (time_after((unsigned long)boot_time, | 2736 | if (stateid->si_boot == boot_time) |
| 2737 | (unsigned long)stateid->si_boot)) { | 2737 | return 0; |
| 2738 | dprintk("NFSD: stale stateid " STATEID_FMT "!\n", | 2738 | dprintk("NFSD: stale stateid " STATEID_FMT "!\n", |
| 2739 | STATEID_VAL(stateid)); | ||
| 2740 | return 1; | ||
| 2741 | } | ||
| 2742 | return 0; | ||
| 2743 | } | ||
| 2744 | |||
| 2745 | static int | ||
| 2746 | EXPIRED_STATEID(stateid_t *stateid) | ||
| 2747 | { | ||
| 2748 | if (time_before((unsigned long)boot_time, | ||
| 2749 | ((unsigned long)stateid->si_boot)) && | ||
| 2750 | time_before((unsigned long)(stateid->si_boot + nfsd4_lease), get_seconds())) { | ||
| 2751 | dprintk("NFSD: expired stateid " STATEID_FMT "!\n", | ||
| 2752 | STATEID_VAL(stateid)); | ||
| 2753 | return 1; | ||
| 2754 | } | ||
| 2755 | return 0; | ||
| 2756 | } | ||
| 2757 | |||
| 2758 | static __be32 | ||
| 2759 | stateid_error_map(stateid_t *stateid) | ||
| 2760 | { | ||
| 2761 | if (STALE_STATEID(stateid)) | ||
| 2762 | return nfserr_stale_stateid; | ||
| 2763 | if (EXPIRED_STATEID(stateid)) | ||
| 2764 | return nfserr_expired; | ||
| 2765 | |||
| 2766 | dprintk("NFSD: bad stateid " STATEID_FMT "!\n", | ||
| 2767 | STATEID_VAL(stateid)); | 2739 | STATEID_VAL(stateid)); |
| 2768 | return nfserr_bad_stateid; | 2740 | return 1; |
| 2769 | } | 2741 | } |
| 2770 | 2742 | ||
| 2771 | static inline int | 2743 | static inline int |
| @@ -2889,10 +2861,8 @@ nfs4_preprocess_stateid_op(struct nfsd4_compound_state *cstate, | |||
| 2889 | status = nfserr_bad_stateid; | 2861 | status = nfserr_bad_stateid; |
| 2890 | if (is_delegation_stateid(stateid)) { | 2862 | if (is_delegation_stateid(stateid)) { |
| 2891 | dp = find_delegation_stateid(ino, stateid); | 2863 | dp = find_delegation_stateid(ino, stateid); |
| 2892 | if (!dp) { | 2864 | if (!dp) |
| 2893 | status = stateid_error_map(stateid); | ||
| 2894 | goto out; | 2865 | goto out; |
| 2895 | } | ||
| 2896 | status = check_stateid_generation(stateid, &dp->dl_stateid, | 2866 | status = check_stateid_generation(stateid, &dp->dl_stateid, |
| 2897 | flags); | 2867 | flags); |
| 2898 | if (status) | 2868 | if (status) |
| @@ -2905,10 +2875,8 @@ nfs4_preprocess_stateid_op(struct nfsd4_compound_state *cstate, | |||
| 2905 | *filpp = dp->dl_vfs_file; | 2875 | *filpp = dp->dl_vfs_file; |
| 2906 | } else { /* open or lock stateid */ | 2876 | } else { /* open or lock stateid */ |
| 2907 | stp = find_stateid(stateid, flags); | 2877 | stp = find_stateid(stateid, flags); |
| 2908 | if (!stp) { | 2878 | if (!stp) |
| 2909 | status = stateid_error_map(stateid); | ||
| 2910 | goto out; | 2879 | goto out; |
| 2911 | } | ||
| 2912 | if (nfs4_check_fh(current_fh, stp)) | 2880 | if (nfs4_check_fh(current_fh, stp)) |
| 2913 | goto out; | 2881 | goto out; |
| 2914 | if (!stp->st_stateowner->so_confirmed) | 2882 | if (!stp->st_stateowner->so_confirmed) |
| @@ -2980,7 +2948,7 @@ nfs4_preprocess_seqid_op(struct nfsd4_compound_state *cstate, u32 seqid, | |||
| 2980 | */ | 2948 | */ |
| 2981 | sop = search_close_lru(stateid->si_stateownerid, flags); | 2949 | sop = search_close_lru(stateid->si_stateownerid, flags); |
| 2982 | if (sop == NULL) | 2950 | if (sop == NULL) |
| 2983 | return stateid_error_map(stateid); | 2951 | return nfserr_bad_stateid; |
| 2984 | *sopp = sop; | 2952 | *sopp = sop; |
| 2985 | goto check_replay; | 2953 | goto check_replay; |
| 2986 | } | 2954 | } |
| @@ -3247,10 +3215,8 @@ nfsd4_delegreturn(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, | |||
| 3247 | if (!is_delegation_stateid(stateid)) | 3215 | if (!is_delegation_stateid(stateid)) |
| 3248 | goto out; | 3216 | goto out; |
| 3249 | dp = find_delegation_stateid(inode, stateid); | 3217 | dp = find_delegation_stateid(inode, stateid); |
| 3250 | if (!dp) { | 3218 | if (!dp) |
| 3251 | status = stateid_error_map(stateid); | ||
| 3252 | goto out; | 3219 | goto out; |
| 3253 | } | ||
| 3254 | status = check_stateid_generation(stateid, &dp->dl_stateid, flags); | 3220 | status = check_stateid_generation(stateid, &dp->dl_stateid, flags); |
| 3255 | if (status) | 3221 | if (status) |
| 3256 | goto out; | 3222 | goto out; |
| @@ -3476,7 +3442,7 @@ alloc_init_lock_stateid(struct nfs4_stateowner *sop, struct nfs4_file *fp, struc | |||
| 3476 | stp->st_stateowner = sop; | 3442 | stp->st_stateowner = sop; |
| 3477 | get_nfs4_file(fp); | 3443 | get_nfs4_file(fp); |
| 3478 | stp->st_file = fp; | 3444 | stp->st_file = fp; |
| 3479 | stp->st_stateid.si_boot = get_seconds(); | 3445 | stp->st_stateid.si_boot = boot_time; |
| 3480 | stp->st_stateid.si_stateownerid = sop->so_id; | 3446 | stp->st_stateid.si_stateownerid = sop->so_id; |
| 3481 | stp->st_stateid.si_fileid = fp->fi_id; | 3447 | stp->st_stateid.si_fileid = fp->fi_id; |
| 3482 | stp->st_stateid.si_generation = 0; | 3448 | stp->st_stateid.si_generation = 0; |
