diff options
Diffstat (limited to 'fs/nfsd')
-rw-r--r-- | fs/nfsd/nfs4state.c | 56 |
1 files changed, 22 insertions, 34 deletions
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c index 67e03b5d0d83..59b214f01b6d 100644 --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c | |||
@@ -2165,7 +2165,6 @@ out: | |||
2165 | static int | 2165 | static int |
2166 | nfs4_preprocess_seqid_op(struct svc_fh *current_fh, u32 seqid, stateid_t *stateid, int flags, struct nfs4_stateowner **sopp, struct nfs4_stateid **stpp, clientid_t *lockclid) | 2166 | nfs4_preprocess_seqid_op(struct svc_fh *current_fh, u32 seqid, stateid_t *stateid, int flags, struct nfs4_stateowner **sopp, struct nfs4_stateid **stpp, clientid_t *lockclid) |
2167 | { | 2167 | { |
2168 | int status; | ||
2169 | struct nfs4_stateid *stp; | 2168 | struct nfs4_stateid *stp; |
2170 | struct nfs4_stateowner *sop; | 2169 | struct nfs4_stateowner *sop; |
2171 | 2170 | ||
@@ -2173,19 +2172,17 @@ nfs4_preprocess_seqid_op(struct svc_fh *current_fh, u32 seqid, stateid_t *statei | |||
2173 | "stateid = (%08x/%08x/%08x/%08x)\n", seqid, | 2172 | "stateid = (%08x/%08x/%08x/%08x)\n", seqid, |
2174 | stateid->si_boot, stateid->si_stateownerid, stateid->si_fileid, | 2173 | stateid->si_boot, stateid->si_stateownerid, stateid->si_fileid, |
2175 | stateid->si_generation); | 2174 | stateid->si_generation); |
2176 | 2175 | ||
2177 | *stpp = NULL; | 2176 | *stpp = NULL; |
2178 | *sopp = NULL; | 2177 | *sopp = NULL; |
2179 | 2178 | ||
2180 | status = nfserr_bad_stateid; | ||
2181 | if (ZERO_STATEID(stateid) || ONE_STATEID(stateid)) { | 2179 | if (ZERO_STATEID(stateid) || ONE_STATEID(stateid)) { |
2182 | printk("NFSD: preprocess_seqid_op: magic stateid!\n"); | 2180 | printk("NFSD: preprocess_seqid_op: magic stateid!\n"); |
2183 | goto out; | 2181 | return nfserr_bad_stateid; |
2184 | } | 2182 | } |
2185 | 2183 | ||
2186 | status = nfserr_stale_stateid; | ||
2187 | if (STALE_STATEID(stateid)) | 2184 | if (STALE_STATEID(stateid)) |
2188 | goto out; | 2185 | return nfserr_stale_stateid; |
2189 | /* | 2186 | /* |
2190 | * We return BAD_STATEID if filehandle doesn't match stateid, | 2187 | * We return BAD_STATEID if filehandle doesn't match stateid, |
2191 | * the confirmed flag is incorrecly set, or the generation | 2188 | * the confirmed flag is incorrecly set, or the generation |
@@ -2204,8 +2201,6 @@ nfs4_preprocess_seqid_op(struct svc_fh *current_fh, u32 seqid, stateid_t *statei | |||
2204 | goto check_replay; | 2201 | goto check_replay; |
2205 | } | 2202 | } |
2206 | 2203 | ||
2207 | status = nfserr_bad_stateid; | ||
2208 | |||
2209 | /* for new lock stateowners: | 2204 | /* for new lock stateowners: |
2210 | * check that the lock->v.new.open_stateid | 2205 | * check that the lock->v.new.open_stateid |
2211 | * refers to an open stateowner | 2206 | * refers to an open stateowner |
@@ -2218,14 +2213,14 @@ nfs4_preprocess_seqid_op(struct svc_fh *current_fh, u32 seqid, stateid_t *statei | |||
2218 | struct nfs4_client *clp = sop->so_client; | 2213 | struct nfs4_client *clp = sop->so_client; |
2219 | 2214 | ||
2220 | if (!sop->so_is_open_owner) | 2215 | if (!sop->so_is_open_owner) |
2221 | goto out; | 2216 | return nfserr_bad_stateid; |
2222 | if (!cmp_clid(&clp->cl_clientid, lockclid)) | 2217 | if (!cmp_clid(&clp->cl_clientid, lockclid)) |
2223 | goto out; | 2218 | return nfserr_bad_stateid; |
2224 | } | 2219 | } |
2225 | 2220 | ||
2226 | if ((flags & CHECK_FH) && nfs4_check_fh(current_fh, stp)) { | 2221 | if ((flags & CHECK_FH) && nfs4_check_fh(current_fh, stp)) { |
2227 | printk("NFSD: preprocess_seqid_op: fh-stateid mismatch!\n"); | 2222 | printk("NFSD: preprocess_seqid_op: fh-stateid mismatch!\n"); |
2228 | goto out; | 2223 | return nfserr_bad_stateid; |
2229 | } | 2224 | } |
2230 | 2225 | ||
2231 | *stpp = stp; | 2226 | *stpp = stp; |
@@ -2239,45 +2234,38 @@ nfs4_preprocess_seqid_op(struct svc_fh *current_fh, u32 seqid, stateid_t *statei | |||
2239 | if (seqid != sop->so_seqid) | 2234 | if (seqid != sop->so_seqid) |
2240 | goto check_replay; | 2235 | goto check_replay; |
2241 | 2236 | ||
2242 | if (sop->so_confirmed) { | 2237 | if (sop->so_confirmed && flags & CONFIRM) { |
2243 | if (flags & CONFIRM) { | 2238 | printk("NFSD: preprocess_seqid_op: expected" |
2244 | printk("NFSD: preprocess_seqid_op: expected unconfirmed stateowner!\n"); | 2239 | " unconfirmed stateowner!\n"); |
2245 | goto out; | 2240 | return nfserr_bad_stateid; |
2246 | } | ||
2247 | } | 2241 | } |
2248 | else { | 2242 | if (!sop->so_confirmed && !(flags & CONFIRM)) { |
2249 | if (!(flags & CONFIRM)) { | 2243 | printk("NFSD: preprocess_seqid_op: stateowner not" |
2250 | printk("NFSD: preprocess_seqid_op: stateowner not confirmed yet!\n"); | 2244 | " confirmed yet!\n"); |
2251 | goto out; | 2245 | return nfserr_bad_stateid; |
2252 | } | ||
2253 | } | 2246 | } |
2254 | if (stateid->si_generation > stp->st_stateid.si_generation) { | 2247 | if (stateid->si_generation > stp->st_stateid.si_generation) { |
2255 | printk("NFSD: preprocess_seqid_op: future stateid?!\n"); | 2248 | printk("NFSD: preprocess_seqid_op: future stateid?!\n"); |
2256 | goto out; | 2249 | return nfserr_bad_stateid; |
2257 | } | 2250 | } |
2258 | 2251 | ||
2259 | status = nfserr_old_stateid; | ||
2260 | if (stateid->si_generation < stp->st_stateid.si_generation) { | 2252 | if (stateid->si_generation < stp->st_stateid.si_generation) { |
2261 | printk("NFSD: preprocess_seqid_op: old stateid!\n"); | 2253 | printk("NFSD: preprocess_seqid_op: old stateid!\n"); |
2262 | goto out; | 2254 | return nfserr_old_stateid; |
2263 | } | 2255 | } |
2264 | renew_client(sop->so_client); | 2256 | renew_client(sop->so_client); |
2265 | status = nfs_ok; | 2257 | return nfs_ok; |
2266 | 2258 | ||
2267 | out: | ||
2268 | return status; | ||
2269 | check_replay: | 2259 | check_replay: |
2270 | if (seqid == sop->so_seqid - 1) { | 2260 | if (seqid == sop->so_seqid - 1) { |
2271 | printk("NFSD: preprocess_seqid_op: retransmission?\n"); | 2261 | printk("NFSD: preprocess_seqid_op: retransmission?\n"); |
2272 | /* indicate replay to calling function */ | 2262 | /* indicate replay to calling function */ |
2273 | status = NFSERR_REPLAY_ME; | 2263 | return NFSERR_REPLAY_ME; |
2274 | } else { | ||
2275 | printk("NFSD: preprocess_seqid_op: bad seqid (expected %d, got %d\n", sop->so_seqid, seqid); | ||
2276 | |||
2277 | *sopp = NULL; | ||
2278 | status = nfserr_bad_seqid; | ||
2279 | } | 2264 | } |
2280 | goto out; | 2265 | printk("NFSD: preprocess_seqid_op: bad seqid (expected %d, got %d)\n", |
2266 | sop->so_seqid, seqid); | ||
2267 | *sopp = NULL; | ||
2268 | return nfserr_bad_seqid; | ||
2281 | } | 2269 | } |
2282 | 2270 | ||
2283 | int | 2271 | int |