Lines Matching refs:permits
78 * Dispose of a list of permits.
82 struct afs_permits *permits =
86 for (i = 0; i < permits->nr_permits; i++)
87 key_put(permits->permits[i].key);
88 kfree(permits);
94 void afs_put_permits(struct afs_permits *permits)
96 if (permits && refcount_dec_and_test(&permits->usage)) {
98 hash_del_rcu(&permits->hash_node);
100 call_rcu(&permits->rcu, afs_permits_rcu);
109 struct afs_permits *permits;
112 permits = rcu_dereference_protected(vnode->permit_cache,
117 afs_put_permits(permits);
121 * Hash a list of permits. Use simple addition to make it easy to add an extra
124 static void afs_hash_permits(struct afs_permits *permits)
126 unsigned long h = permits->nr_permits;
129 for (i = 0; i < permits->nr_permits; i++) {
130 h += (unsigned long)permits->permits[i].key / sizeof(void *);
131 h += permits->permits[i].access;
134 permits->h = h;
146 struct afs_permits *permits, *xpermits, *replacement, *zap, *new = NULL;
160 permits = rcu_dereference(vnode->permit_cache);
161 if (permits) {
162 if (!permits->invalidated) {
163 for (i = 0; i < permits->nr_permits; i++) {
164 if (permits->permits[i].key < key)
166 if (permits->permits[i].key > key)
168 if (permits->permits[i].access != caller_access) {
184 changed |= permits->invalidated;
185 size = permits->nr_permits;
187 /* If this set of permits is now wrong, clear the permits
192 if (permits != rcu_access_pointer(vnode->permit_cache))
197 afs_put_permits(permits);
198 permits = NULL;
206 /* We need a ref on any permits list we want to copy as we'll have to
209 if (permits && !refcount_inc_not_zero(&permits->usage))
222 new = kzalloc(struct_size(new, permits, size), GFP_NOFS);
229 if (permits) {
230 for (i = 0; i < permits->nr_permits; i++) {
231 if (j == i && permits->permits[i].key > key) {
232 new->permits[j].key = key;
233 new->permits[j].access = caller_access;
236 new->permits[j].key = permits->permits[i].key;
237 new->permits[j].access = permits->permits[i].access;
243 new->permits[j].key = key;
244 new->permits[j].access = caller_access;
256 memcmp(xpermits->permits, new->permits,
269 key_get(new->permits[i].key);
282 if (!afs_cb_is_broken(cb_break, vnode) && zap == permits)
290 afs_put_permits(permits);
306 const struct afs_permits *permits;
312 /* check the permits to see if we've got one yet */
319 permits = rcu_dereference(vnode->permit_cache);
320 if (permits) {
321 for (i = 0; i < permits->nr_permits; i++) {
322 if (permits->permits[i].key < key)
324 if (permits->permits[i].key > key)
327 *_access = permits->permits[i].access;
328 _leave(" = %u [perm %x]", !permits->invalidated, *_access);
329 return !permits->invalidated;
345 struct afs_permits *permits;
352 /* check the permits to see if we've got one yet */
359 permits = rcu_dereference(vnode->permit_cache);
360 if (permits) {
361 for (i = 0; i < permits->nr_permits; i++) {
362 if (permits->permits[i].key < key)
364 if (permits->permits[i].key > key)
367 *_access = permits->permits[i].access;
368 valid = !permits->invalidated;
429 /* check the permits to see if we've got one yet */