diff options
| -rw-r--r-- | fs/nfsd/nfs4state.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c index 3e3d605d3e73..581a5d01b005 100644 --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c | |||
| @@ -218,6 +218,15 @@ static void nfs4_file_put_access(struct nfs4_file *fp, int oflag) | |||
| 218 | __nfs4_file_put_access(fp, oflag); | 218 | __nfs4_file_put_access(fp, oflag); |
| 219 | } | 219 | } |
| 220 | 220 | ||
| 221 | static inline void hash_stid(struct nfs4_stid *stid) | ||
| 222 | { | ||
| 223 | stateid_t *s = &stid->sc_stateid; | ||
| 224 | unsigned int hashval; | ||
| 225 | |||
| 226 | hashval = stateid_hashval(s->si_stateownerid, s->si_fileid); | ||
| 227 | list_add(&stid->sc_hash, &stateid_hashtbl[hashval]); | ||
| 228 | } | ||
| 229 | |||
| 221 | static struct nfs4_delegation * | 230 | static struct nfs4_delegation * |
| 222 | alloc_init_deleg(struct nfs4_client *clp, struct nfs4_ol_stateid *stp, struct svc_fh *current_fh, u32 type) | 231 | alloc_init_deleg(struct nfs4_client *clp, struct nfs4_ol_stateid *stp, struct svc_fh *current_fh, u32 type) |
| 223 | { | 232 | { |
| @@ -2316,10 +2325,8 @@ alloc_init_open_stateowner(unsigned int strhashval, struct nfs4_client *clp, str | |||
| 2316 | static inline void | 2325 | static inline void |
| 2317 | init_open_stateid(struct nfs4_ol_stateid *stp, struct nfs4_file *fp, struct nfsd4_open *open) { | 2326 | init_open_stateid(struct nfs4_ol_stateid *stp, struct nfs4_file *fp, struct nfsd4_open *open) { |
| 2318 | struct nfs4_openowner *oo = open->op_openowner; | 2327 | struct nfs4_openowner *oo = open->op_openowner; |
| 2319 | unsigned int hashval = stateid_hashval(oo->oo_owner.so_id, fp->fi_id); | ||
| 2320 | 2328 | ||
| 2321 | INIT_LIST_HEAD(&stp->st_lockowners); | 2329 | INIT_LIST_HEAD(&stp->st_lockowners); |
| 2322 | list_add(&stp->st_stid.sc_hash, &stateid_hashtbl[hashval]); | ||
| 2323 | list_add(&stp->st_perstateowner, &oo->oo_owner.so_stateids); | 2330 | list_add(&stp->st_perstateowner, &oo->oo_owner.so_stateids); |
| 2324 | list_add(&stp->st_perfile, &fp->fi_stateids); | 2331 | list_add(&stp->st_perfile, &fp->fi_stateids); |
| 2325 | stp->st_stid.sc_type = NFS4_OPEN_STID; | 2332 | stp->st_stid.sc_type = NFS4_OPEN_STID; |
| @@ -2331,6 +2338,7 @@ init_open_stateid(struct nfs4_ol_stateid *stp, struct nfs4_file *fp, struct nfsd | |||
| 2331 | stp->st_stid.sc_stateid.si_fileid = fp->fi_id; | 2338 | stp->st_stid.sc_stateid.si_fileid = fp->fi_id; |
| 2332 | /* note will be incremented before first return to client: */ | 2339 | /* note will be incremented before first return to client: */ |
| 2333 | stp->st_stid.sc_stateid.si_generation = 0; | 2340 | stp->st_stid.sc_stateid.si_generation = 0; |
| 2341 | hash_stid(&stp->st_stid); | ||
| 2334 | stp->st_access_bmap = 0; | 2342 | stp->st_access_bmap = 0; |
| 2335 | stp->st_deny_bmap = 0; | 2343 | stp->st_deny_bmap = 0; |
| 2336 | __set_bit(open->op_share_access & ~NFS4_SHARE_WANT_MASK, | 2344 | __set_bit(open->op_share_access & ~NFS4_SHARE_WANT_MASK, |
| @@ -3866,12 +3874,10 @@ static struct nfs4_ol_stateid * | |||
| 3866 | alloc_init_lock_stateid(struct nfs4_lockowner *lo, struct nfs4_file *fp, struct nfs4_ol_stateid *open_stp) | 3874 | alloc_init_lock_stateid(struct nfs4_lockowner *lo, struct nfs4_file *fp, struct nfs4_ol_stateid *open_stp) |
| 3867 | { | 3875 | { |
| 3868 | struct nfs4_ol_stateid *stp; | 3876 | struct nfs4_ol_stateid *stp; |
| 3869 | unsigned int hashval = stateid_hashval(lo->lo_owner.so_id, fp->fi_id); | ||
| 3870 | 3877 | ||
| 3871 | stp = nfs4_alloc_stateid(); | 3878 | stp = nfs4_alloc_stateid(); |
| 3872 | if (stp == NULL) | 3879 | if (stp == NULL) |
| 3873 | goto out; | 3880 | goto out; |
| 3874 | list_add(&stp->st_stid.sc_hash, &stateid_hashtbl[hashval]); | ||
| 3875 | list_add(&stp->st_perfile, &fp->fi_stateids); | 3881 | list_add(&stp->st_perfile, &fp->fi_stateids); |
| 3876 | list_add(&stp->st_perstateowner, &lo->lo_owner.so_stateids); | 3882 | list_add(&stp->st_perstateowner, &lo->lo_owner.so_stateids); |
| 3877 | stp->st_stateowner = &lo->lo_owner; | 3883 | stp->st_stateowner = &lo->lo_owner; |
| @@ -3883,6 +3889,7 @@ alloc_init_lock_stateid(struct nfs4_lockowner *lo, struct nfs4_file *fp, struct | |||
| 3883 | stp->st_stid.sc_stateid.si_fileid = fp->fi_id; | 3889 | stp->st_stid.sc_stateid.si_fileid = fp->fi_id; |
| 3884 | /* note will be incremented before first return to client: */ | 3890 | /* note will be incremented before first return to client: */ |
| 3885 | stp->st_stid.sc_stateid.si_generation = 0; | 3891 | stp->st_stid.sc_stateid.si_generation = 0; |
| 3892 | hash_stid(&stp->st_stid); | ||
| 3886 | stp->st_access_bmap = 0; | 3893 | stp->st_access_bmap = 0; |
| 3887 | stp->st_deny_bmap = open_stp->st_deny_bmap; | 3894 | stp->st_deny_bmap = open_stp->st_deny_bmap; |
| 3888 | stp->st_openstp = open_stp; | 3895 | stp->st_openstp = open_stp; |
