aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/nfsd/nfs4state.c56
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)
2733static int 2733static int
2734STALE_STATEID(stateid_t *stateid) 2734STALE_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
2745static int
2746EXPIRED_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
2758static __be32
2759stateid_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
2771static inline int 2743static 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;