Lines Matching refs:cell

52 	struct afs_cell *cell = NULL;  in afs_lookup_cell_rcu()  local
68 if (cell) in afs_lookup_cell_rcu()
69 afs_put_cell(net, cell); in afs_lookup_cell_rcu()
70 cell = NULL; in afs_lookup_cell_rcu()
76 cell = rcu_dereference_raw(net->ws_cell); in afs_lookup_cell_rcu()
77 if (cell) { in afs_lookup_cell_rcu()
78 afs_get_cell(cell); in afs_lookup_cell_rcu()
87 cell = rb_entry(p, struct afs_cell, net_node); in afs_lookup_cell_rcu()
89 n = strncasecmp(cell->name, name, in afs_lookup_cell_rcu()
90 min_t(size_t, cell->name_len, namesz)); in afs_lookup_cell_rcu()
92 n = cell->name_len - namesz; in afs_lookup_cell_rcu()
98 if (atomic_inc_not_zero(&cell->usage)) { in afs_lookup_cell_rcu()
106 cell = NULL; in afs_lookup_cell_rcu()
113 return ret == 0 ? cell : ERR_PTR(ret); in afs_lookup_cell_rcu()
124 struct afs_cell *cell; in afs_alloc_cell() local
139 cell = kzalloc(sizeof(struct afs_cell), GFP_KERNEL); in afs_alloc_cell()
140 if (!cell) { in afs_alloc_cell()
145 cell->net = net; in afs_alloc_cell()
146 cell->name_len = namelen; in afs_alloc_cell()
148 cell->name[i] = tolower(name[i]); in afs_alloc_cell()
150 atomic_set(&cell->usage, 2); in afs_alloc_cell()
151 INIT_WORK(&cell->manager, afs_manage_cell); in afs_alloc_cell()
152 cell->flags = ((1 << AFS_CELL_FL_NOT_READY) | in afs_alloc_cell()
154 INIT_LIST_HEAD(&cell->proc_volumes); in afs_alloc_cell()
155 rwlock_init(&cell->proc_lock); in afs_alloc_cell()
156 rwlock_init(&cell->vl_addrs_lock); in afs_alloc_cell()
171 rcu_assign_pointer(cell->vl_addrs, alist); in afs_alloc_cell()
172 cell->dns_expiry = TIME64_MAX; in afs_alloc_cell()
175 _leave(" = %p", cell); in afs_alloc_cell()
176 return cell; in afs_alloc_cell()
181 kfree(cell); in afs_alloc_cell()
203 struct afs_cell *cell, *candidate, *cursor; in afs_lookup_cell() local
211 cell = afs_lookup_cell_rcu(net, name, namesz); in afs_lookup_cell()
213 if (!IS_ERR(cell)) in afs_lookup_cell()
253 cell = candidate; in afs_lookup_cell()
255 rb_link_node_rcu(&cell->net_node, parent, pp); in afs_lookup_cell()
256 rb_insert_color(&cell->net_node, &net->cells); in afs_lookup_cell()
260 queue_work(afs_wq, &cell->manager); in afs_lookup_cell()
264 ret = wait_on_bit(&cell->flags, AFS_CELL_FL_NOT_READY, TASK_INTERRUPTIBLE); in afs_lookup_cell()
267 switch (READ_ONCE(cell->state)) { in afs_lookup_cell()
269 ret = cell->error; in afs_lookup_cell()
272 _debug("weird %u %d", cell->state, cell->error); in afs_lookup_cell()
278 _leave(" = %p [cell]", cell); in afs_lookup_cell()
279 return cell; in afs_lookup_cell()
283 cell = cursor; in afs_lookup_cell()
296 afs_put_cell(net, cell); in afs_lookup_cell()
357 static void afs_update_cell(struct afs_cell *cell) in afs_update_cell() argument
362 _enter("%s", cell->name); in afs_update_cell()
364 alist = afs_dns_query(cell, &expiry); in afs_update_cell()
369 set_bit(AFS_CELL_FL_NOT_FOUND, &cell->flags); in afs_update_cell()
370 clear_bit(AFS_CELL_FL_DNS_FAIL, &cell->flags); in afs_update_cell()
371 cell->dns_expiry = ktime_get_real_seconds() + 61; in afs_update_cell()
377 set_bit(AFS_CELL_FL_DNS_FAIL, &cell->flags); in afs_update_cell()
378 cell->dns_expiry = ktime_get_real_seconds() + 10; in afs_update_cell()
382 cell->error = -EDESTADDRREQ; in afs_update_cell()
384 clear_bit(AFS_CELL_FL_DNS_FAIL, &cell->flags); in afs_update_cell()
385 clear_bit(AFS_CELL_FL_NOT_FOUND, &cell->flags); in afs_update_cell()
390 old = rcu_dereference_protected(cell->vl_addrs, true); in afs_update_cell()
391 rcu_assign_pointer(cell->vl_addrs, alist); in afs_update_cell()
392 cell->dns_expiry = expiry; in afs_update_cell()
398 if (test_and_clear_bit(AFS_CELL_FL_NO_LOOKUP_YET, &cell->flags)) in afs_update_cell()
399 wake_up_bit(&cell->flags, AFS_CELL_FL_NO_LOOKUP_YET); in afs_update_cell()
402 afs_set_cell_timer(cell->net, cell->dns_expiry - now); in afs_update_cell()
411 struct afs_cell *cell = container_of(rcu, struct afs_cell, rcu); in afs_cell_destroy() local
413 _enter("%p{%s}", cell, cell->name); in afs_cell_destroy()
415 ASSERTCMP(atomic_read(&cell->usage), ==, 0); in afs_cell_destroy()
417 afs_put_addrlist(rcu_access_pointer(cell->vl_addrs)); in afs_cell_destroy()
418 key_put(cell->anonymous_key); in afs_cell_destroy()
419 kfree(cell); in afs_cell_destroy()
453 struct afs_cell *afs_get_cell(struct afs_cell *cell) in afs_get_cell() argument
455 atomic_inc(&cell->usage); in afs_get_cell()
456 return cell; in afs_get_cell()
462 void afs_put_cell(struct afs_net *net, struct afs_cell *cell) in afs_put_cell() argument
466 if (!cell) in afs_put_cell()
469 _enter("%s", cell->name); in afs_put_cell()
472 cell->last_inactive = now; in afs_put_cell()
474 if (!test_bit(AFS_CELL_FL_DNS_FAIL, &cell->flags) && in afs_put_cell()
475 !test_bit(AFS_CELL_FL_NOT_FOUND, &cell->flags)) in afs_put_cell()
478 if (atomic_dec_return(&cell->usage) > 1) in afs_put_cell()
488 static int afs_alloc_anon_key(struct afs_cell *cell) in afs_alloc_anon_key() argument
496 cp = cell->name; in afs_alloc_anon_key()
505 cell->anonymous_key = key; in afs_alloc_anon_key()
508 cell->anonymous_key, key_serial(cell->anonymous_key)); in afs_alloc_anon_key()
515 static int afs_activate_cell(struct afs_net *net, struct afs_cell *cell) in afs_activate_cell() argument
521 if (!cell->anonymous_key) { in afs_activate_cell()
522 ret = afs_alloc_anon_key(cell); in afs_activate_cell()
528 cell->cache = fscache_acquire_cookie(afs_cache_netfs.primary_index, in afs_activate_cell()
530 cell->name, strlen(cell->name), in afs_activate_cell()
532 cell, 0, true); in afs_activate_cell()
534 ret = afs_proc_cell_setup(cell); in afs_activate_cell()
541 if (strcmp(cell->name, pcell->name) < 0) in afs_activate_cell()
545 cell->proc_link.pprev = p; in afs_activate_cell()
546 cell->proc_link.next = *p; in afs_activate_cell()
547 rcu_assign_pointer(*p, &cell->proc_link.next); in afs_activate_cell()
548 if (cell->proc_link.next) in afs_activate_cell()
549 cell->proc_link.next->pprev = &cell->proc_link.next; in afs_activate_cell()
551 afs_dynroot_mkdir(net, cell); in afs_activate_cell()
559 static void afs_deactivate_cell(struct afs_net *net, struct afs_cell *cell) in afs_deactivate_cell() argument
561 _enter("%s", cell->name); in afs_deactivate_cell()
563 afs_proc_cell_remove(cell); in afs_deactivate_cell()
566 hlist_del_rcu(&cell->proc_link); in afs_deactivate_cell()
567 afs_dynroot_rmdir(net, cell); in afs_deactivate_cell()
571 fscache_relinquish_cookie(cell->cache, NULL, false); in afs_deactivate_cell()
572 cell->cache = NULL; in afs_deactivate_cell()
584 struct afs_cell *cell = container_of(work, struct afs_cell, manager); in afs_manage_cell() local
585 struct afs_net *net = cell->net; in afs_manage_cell()
589 _enter("%s", cell->name); in afs_manage_cell()
592 _debug("state %u", cell->state); in afs_manage_cell()
593 switch (cell->state) { in afs_manage_cell()
598 deleted = atomic_try_cmpxchg_relaxed(&cell->usage, &usage, 0); in afs_manage_cell()
600 rb_erase(&cell->net_node, &net->cells); in afs_manage_cell()
604 if (cell->state == AFS_CELL_FAILED) in afs_manage_cell()
606 cell->state = AFS_CELL_UNSET; in afs_manage_cell()
610 cell->state = AFS_CELL_ACTIVATING; in afs_manage_cell()
614 ret = afs_activate_cell(net, cell); in afs_manage_cell()
618 cell->state = AFS_CELL_ACTIVE; in afs_manage_cell()
620 clear_bit(AFS_CELL_FL_NOT_READY, &cell->flags); in afs_manage_cell()
621 wake_up_bit(&cell->flags, AFS_CELL_FL_NOT_READY); in afs_manage_cell()
625 if (atomic_read(&cell->usage) > 1) { in afs_manage_cell()
627 if (cell->dns_expiry <= now && net->live) in afs_manage_cell()
628 afs_update_cell(cell); in afs_manage_cell()
631 cell->state = AFS_CELL_DEACTIVATING; in afs_manage_cell()
635 set_bit(AFS_CELL_FL_NOT_READY, &cell->flags); in afs_manage_cell()
636 if (atomic_read(&cell->usage) > 1) in afs_manage_cell()
638 afs_deactivate_cell(net, cell); in afs_manage_cell()
639 cell->state = AFS_CELL_INACTIVE; in afs_manage_cell()
645 _debug("bad state %u", cell->state); in afs_manage_cell()
649 cell->error = ret; in afs_manage_cell()
650 afs_deactivate_cell(net, cell); in afs_manage_cell()
652 cell->state = AFS_CELL_FAILED; in afs_manage_cell()
654 if (test_and_clear_bit(AFS_CELL_FL_NOT_READY, &cell->flags)) in afs_manage_cell()
655 wake_up_bit(&cell->flags, AFS_CELL_FL_NOT_READY); in afs_manage_cell()
659 cell->state = AFS_CELL_ACTIVE; in afs_manage_cell()
661 clear_bit(AFS_CELL_FL_NOT_READY, &cell->flags); in afs_manage_cell()
662 wake_up_bit(&cell->flags, AFS_CELL_FL_NOT_READY); in afs_manage_cell()
667 _leave(" [done %u]", cell->state); in afs_manage_cell()
671 call_rcu(&cell->rcu, afs_cell_destroy); in afs_manage_cell()
705 struct afs_cell *cell = in afs_manage_cells() local
710 usage = atomic_read(&cell->usage); in afs_manage_cells()
711 _debug("manage %s %u", cell->name, usage); in afs_manage_cells()
716 if (test_and_clear_bit(AFS_CELL_FL_NO_GC, &cell->flags)) in afs_manage_cells()
717 usage = atomic_dec_return(&cell->usage); in afs_manage_cells()
722 time64_t expire_at = cell->last_inactive; in afs_manage_cells()
724 if (!test_bit(AFS_CELL_FL_DNS_FAIL, &cell->flags) && in afs_manage_cells()
725 !test_bit(AFS_CELL_FL_NOT_FOUND, &cell->flags)) in afs_manage_cells()
734 if (cell->dns_expiry <= now) in afs_manage_cells()
736 else if (cell->dns_expiry <= next_manage) in afs_manage_cells()
737 next_manage = cell->dns_expiry; in afs_manage_cells()
741 queue_work(afs_wq, &cell->manager); in afs_manage_cells()