Lines Matching refs:permits
115 struct afs_permits *permits = in afs_permits_rcu() local
119 for (i = 0; i < permits->nr_permits; i++) in afs_permits_rcu()
120 key_put(permits->permits[i].key); in afs_permits_rcu()
121 kfree(permits); in afs_permits_rcu()
127 void afs_put_permits(struct afs_permits *permits) in afs_put_permits() argument
129 if (permits && refcount_dec_and_test(&permits->usage)) { in afs_put_permits()
131 hash_del_rcu(&permits->hash_node); in afs_put_permits()
133 call_rcu(&permits->rcu, afs_permits_rcu); in afs_put_permits()
142 struct afs_permits *permits; in afs_clear_permits() local
145 permits = rcu_dereference_protected(vnode->permit_cache, in afs_clear_permits()
150 afs_put_permits(permits); in afs_clear_permits()
157 static void afs_hash_permits(struct afs_permits *permits) in afs_hash_permits() argument
159 unsigned long h = permits->nr_permits; in afs_hash_permits()
162 for (i = 0; i < permits->nr_permits; i++) { in afs_hash_permits()
163 h += (unsigned long)permits->permits[i].key / sizeof(void *); in afs_hash_permits()
164 h += permits->permits[i].access; in afs_hash_permits()
167 permits->h = h; in afs_hash_permits()
179 struct afs_permits *permits, *xpermits, *replacement, *zap, *new = NULL; in afs_cache_permit() local
193 permits = rcu_dereference(vnode->permit_cache); in afs_cache_permit()
194 if (permits) { in afs_cache_permit()
195 if (!permits->invalidated) { in afs_cache_permit()
196 for (i = 0; i < permits->nr_permits; i++) { in afs_cache_permit()
197 if (permits->permits[i].key < key) in afs_cache_permit()
199 if (permits->permits[i].key > key) in afs_cache_permit()
201 if (permits->permits[i].access != caller_access) { in afs_cache_permit()
217 changed |= permits->invalidated; in afs_cache_permit()
218 size = permits->nr_permits; in afs_cache_permit()
225 if (permits != rcu_access_pointer(vnode->permit_cache)) in afs_cache_permit()
230 afs_put_permits(permits); in afs_cache_permit()
231 permits = NULL; in afs_cache_permit()
242 if (permits && !refcount_inc_not_zero(&permits->usage)) in afs_cache_permit()
255 new = kzalloc_flex(*new, permits, size, GFP_NOFS); in afs_cache_permit()
262 if (permits) { in afs_cache_permit()
263 for (i = 0; i < permits->nr_permits; i++) { in afs_cache_permit()
264 if (j == i && permits->permits[i].key > key) { in afs_cache_permit()
265 new->permits[j].key = key; in afs_cache_permit()
266 new->permits[j].access = caller_access; in afs_cache_permit()
269 new->permits[j].key = permits->permits[i].key; in afs_cache_permit()
270 new->permits[j].access = permits->permits[i].access; in afs_cache_permit()
276 new->permits[j].key = key; in afs_cache_permit()
277 new->permits[j].access = caller_access; in afs_cache_permit()
289 memcmp(xpermits->permits, new->permits, in afs_cache_permit()
302 key_get(new->permits[i].key); in afs_cache_permit()
315 if (!afs_cb_is_broken(cb_break, vnode) && zap == permits) in afs_cache_permit()
323 afs_put_permits(permits); in afs_cache_permit()
339 const struct afs_permits *permits; in afs_check_permit_rcu() local
352 permits = rcu_dereference(vnode->permit_cache); in afs_check_permit_rcu()
353 if (permits) { in afs_check_permit_rcu()
354 for (i = 0; i < permits->nr_permits; i++) { in afs_check_permit_rcu()
355 if (permits->permits[i].key < key) in afs_check_permit_rcu()
357 if (permits->permits[i].key > key) in afs_check_permit_rcu()
360 *_access = permits->permits[i].access; in afs_check_permit_rcu()
361 _leave(" = %u [perm %x]", !permits->invalidated, *_access); in afs_check_permit_rcu()
362 return !permits->invalidated; in afs_check_permit_rcu()
378 struct afs_permits *permits; in afs_check_permit() local
392 permits = rcu_dereference(vnode->permit_cache); in afs_check_permit()
393 if (permits) { in afs_check_permit()
394 for (i = 0; i < permits->nr_permits; i++) { in afs_check_permit()
395 if (permits->permits[i].key < key) in afs_check_permit()
397 if (permits->permits[i].key > key) in afs_check_permit()
400 *_access = permits->permits[i].access; in afs_check_permit()
401 valid = !permits->invalidated; in afs_check_permit()