Lines Matching refs:permits
57 struct afs_permits *permits = in afs_permits_rcu() local
61 for (i = 0; i < permits->nr_permits; i++) in afs_permits_rcu()
62 key_put(permits->permits[i].key); in afs_permits_rcu()
63 kfree(permits); in afs_permits_rcu()
69 void afs_put_permits(struct afs_permits *permits) in afs_put_permits() argument
71 if (permits && refcount_dec_and_test(&permits->usage)) { in afs_put_permits()
73 hash_del_rcu(&permits->hash_node); in afs_put_permits()
75 call_rcu(&permits->rcu, afs_permits_rcu); in afs_put_permits()
84 struct afs_permits *permits; in afs_clear_permits() local
87 permits = rcu_dereference_protected(vnode->permit_cache, in afs_clear_permits()
93 if (permits) in afs_clear_permits()
94 afs_put_permits(permits); in afs_clear_permits()
101 static void afs_hash_permits(struct afs_permits *permits) in afs_hash_permits() argument
103 unsigned long h = permits->nr_permits; in afs_hash_permits()
106 for (i = 0; i < permits->nr_permits; i++) { in afs_hash_permits()
107 h += (unsigned long)permits->permits[i].key / sizeof(void *); in afs_hash_permits()
108 h += permits->permits[i].access; in afs_hash_permits()
111 permits->h = h; in afs_hash_permits()
123 struct afs_permits *permits, *xpermits, *replacement, *zap, *new = NULL; in afs_cache_permit() local
137 permits = rcu_dereference(vnode->permit_cache); in afs_cache_permit()
138 if (permits) { in afs_cache_permit()
139 if (!permits->invalidated) { in afs_cache_permit()
140 for (i = 0; i < permits->nr_permits; i++) { in afs_cache_permit()
141 if (permits->permits[i].key < key) in afs_cache_permit()
143 if (permits->permits[i].key > key) in afs_cache_permit()
145 if (permits->permits[i].access != caller_access) { in afs_cache_permit()
161 changed |= permits->invalidated; in afs_cache_permit()
162 size = permits->nr_permits; in afs_cache_permit()
169 if (permits != rcu_access_pointer(vnode->permit_cache)) in afs_cache_permit()
174 afs_put_permits(permits); in afs_cache_permit()
175 permits = NULL; in afs_cache_permit()
186 if (permits && !refcount_inc_not_zero(&permits->usage)) in afs_cache_permit()
207 if (permits) { in afs_cache_permit()
208 for (i = 0; i < permits->nr_permits; i++) { in afs_cache_permit()
209 if (j == i && permits->permits[i].key > key) { in afs_cache_permit()
210 new->permits[j].key = key; in afs_cache_permit()
211 new->permits[j].access = caller_access; in afs_cache_permit()
214 new->permits[j].key = permits->permits[i].key; in afs_cache_permit()
215 new->permits[j].access = permits->permits[i].access; in afs_cache_permit()
221 new->permits[j].key = key; in afs_cache_permit()
222 new->permits[j].access = caller_access; in afs_cache_permit()
234 memcmp(xpermits->permits, new->permits, in afs_cache_permit()
247 key_get(new->permits[i].key); in afs_cache_permit()
260 zap == permits) in afs_cache_permit()
267 afs_put_permits(permits); in afs_cache_permit()
288 struct afs_permits *permits; in afs_check_permit() local
302 permits = rcu_dereference(vnode->permit_cache); in afs_check_permit()
303 if (permits) { in afs_check_permit()
304 for (i = 0; i < permits->nr_permits; i++) { in afs_check_permit()
305 if (permits->permits[i].key < key) in afs_check_permit()
307 if (permits->permits[i].key > key) in afs_check_permit()
310 *_access = permits->permits[i].access; in afs_check_permit()
311 valid = !permits->invalidated; in afs_check_permit()