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))
230 if (permits) {
231 for (i = 0; i < permits->nr_permits; i++) {
232 if (j == i && permits->permits[i].key > key) {
233 new->permits[j].key = key;
234 new->permits[j].access = caller_access;
237 new->permits[j].key = permits->permits[i].key;
238 new->permits[j].access = permits->permits[i].access;
244 new->permits[j].key = key;
245 new->permits[j].access = caller_access;
257 memcmp(xpermits->permits, new->permits,
270 key_get(new->permits[i].key);
283 if (!afs_cb_is_broken(cb_break, vnode) && zap == permits)
291 afs_put_permits(permits);
307 const struct afs_permits *permits;
313 /* check the permits to see if we've got one yet */
320 permits = rcu_dereference(vnode->permit_cache);
321 if (permits) {
322 for (i = 0; i < permits->nr_permits; i++) {
323 if (permits->permits[i].key < key)
325 if (permits->permits[i].key > key)
328 *_access = permits->permits[i].access;
329 _leave(" = %u [perm %x]", !permits->invalidated, *_access);
330 return !permits->invalidated;
346 struct afs_permits *permits;
353 /* check the permits to see if we've got one yet */
360 permits = rcu_dereference(vnode->permit_cache);
361 if (permits) {
362 for (i = 0; i < permits->nr_permits; i++) {
363 if (permits->permits[i].key < key)
365 if (permits->permits[i].key > key)
368 *_access = permits->permits[i].access;
369 valid = !permits->invalidated;
429 /* check the permits to see if we've got one yet */