Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

nfsd4: better stateid hashing

First, we shouldn't care here about the structure of the opaque part of
the stateid. Second, this hash is really dumb. (I'm not sure the
replacement is much better, though--to look at it another patch.)

Signed-off-by: J. Bruce Fields <bfields@redhat.com>

+4 -4
+4 -4
fs/nfsd/nfs4state.c
··· 168 168 return hash_ptr(ino, FILE_HASH_BITS); 169 169 } 170 170 171 - static unsigned int stateid_hashval(u32 owner_id, u32 file_id) 171 + static unsigned int stateid_hashval(stateid_t *s) 172 172 { 173 - return (owner_id + file_id) & STATEID_HASH_MASK; 173 + return opaque_hashval(&s->si_opaque, sizeof(stateid_opaque_t)) & STATEID_HASH_MASK; 174 174 } 175 175 176 176 static struct list_head file_hashtbl[FILE_HASH_SIZE]; ··· 221 221 stateid_t *s = &stid->sc_stateid; 222 222 unsigned int hashval; 223 223 224 - hashval = stateid_hashval(s->si_stateownerid, s->si_fileid); 224 + hashval = stateid_hashval(s); 225 225 list_add(&stid->sc_hash, &stateid_hashtbl[hashval]); 226 226 } 227 227 ··· 1083 1083 struct nfs4_stid *s; 1084 1084 unsigned int hashval; 1085 1085 1086 - hashval = stateid_hashval(t->si_stateownerid, t->si_fileid); 1086 + hashval = stateid_hashval(t); 1087 1087 list_for_each_entry(s, &stateid_hashtbl[hashval], sc_hash) 1088 1088 if (same_stateid(&s->sc_stateid, t)) 1089 1089 return s;