Lines Matching refs:cell

50 	struct afs_cell *cell = NULL;  in afs_lookup_cell_rcu()  local
66 if (cell) in afs_lookup_cell_rcu()
67 afs_put_cell(net, cell); in afs_lookup_cell_rcu()
68 cell = NULL; in afs_lookup_cell_rcu()
74 cell = rcu_dereference_raw(net->ws_cell); in afs_lookup_cell_rcu()
75 if (cell) { in afs_lookup_cell_rcu()
76 afs_get_cell(cell); in afs_lookup_cell_rcu()
86 cell = rb_entry(p, struct afs_cell, net_node); in afs_lookup_cell_rcu()
88 n = strncasecmp(cell->name, name, in afs_lookup_cell_rcu()
89 min_t(size_t, cell->name_len, namesz)); in afs_lookup_cell_rcu()
91 n = cell->name_len - namesz; in afs_lookup_cell_rcu()
97 if (atomic_inc_not_zero(&cell->usage)) { in afs_lookup_cell_rcu()
105 cell = NULL; in afs_lookup_cell_rcu()
112 if (ret != 0 && cell) in afs_lookup_cell_rcu()
113 afs_put_cell(net, cell); in afs_lookup_cell_rcu()
115 return ret == 0 ? cell : ERR_PTR(ret); in afs_lookup_cell_rcu()
127 struct afs_cell *cell; in afs_alloc_cell() local
142 cell = kzalloc(sizeof(struct afs_cell), GFP_KERNEL); in afs_alloc_cell()
143 if (!cell) { in afs_alloc_cell()
148 cell->net = net; in afs_alloc_cell()
149 cell->name_len = namelen; in afs_alloc_cell()
151 cell->name[i] = tolower(name[i]); in afs_alloc_cell()
153 atomic_set(&cell->usage, 2); in afs_alloc_cell()
154 INIT_WORK(&cell->manager, afs_manage_cell); in afs_alloc_cell()
155 INIT_LIST_HEAD(&cell->proc_volumes); in afs_alloc_cell()
156 rwlock_init(&cell->proc_lock); in afs_alloc_cell()
157 rwlock_init(&cell->vl_servers_lock); in afs_alloc_cell()
173 cell->dns_expiry = TIME64_MAX; in afs_alloc_cell()
181 cell->dns_expiry = ktime_get_real_seconds(); in afs_alloc_cell()
184 rcu_assign_pointer(cell->vl_servers, vllist); in afs_alloc_cell()
186 cell->dns_source = vllist->source; in afs_alloc_cell()
187 cell->dns_status = vllist->status; in afs_alloc_cell()
188 smp_store_release(&cell->dns_lookup_count, 1); /* vs source/status */ in afs_alloc_cell()
190 _leave(" = %p", cell); in afs_alloc_cell()
191 return cell; in afs_alloc_cell()
197 kfree(cell); in afs_alloc_cell()
219 struct afs_cell *cell, *candidate, *cursor; in afs_lookup_cell() local
228 cell = afs_lookup_cell_rcu(net, name, namesz); in afs_lookup_cell()
230 if (!IS_ERR(cell)) in afs_lookup_cell()
270 cell = candidate; in afs_lookup_cell()
272 rb_link_node_rcu(&cell->net_node, parent, pp); in afs_lookup_cell()
273 rb_insert_color(&cell->net_node, &net->cells); in afs_lookup_cell()
277 queue_work(afs_wq, &cell->manager); in afs_lookup_cell()
281 wait_var_event(&cell->state, in afs_lookup_cell()
283 state = smp_load_acquire(&cell->state); /* vs error */ in afs_lookup_cell()
289 ret = cell->error; in afs_lookup_cell()
293 _leave(" = %p [cell]", cell); in afs_lookup_cell()
294 return cell; in afs_lookup_cell()
298 cell = cursor; in afs_lookup_cell()
311 afs_put_cell(net, cell); in afs_lookup_cell()
372 static int afs_update_cell(struct afs_cell *cell) in afs_update_cell() argument
380 _enter("%s", cell->name); in afs_update_cell()
382 vllist = afs_dns_query(cell, &expiry); in afs_update_cell()
386 _debug("%s: fail %d", cell->name, ret); in afs_update_cell()
410 _debug("%s: got list %d %d", cell->name, vllist->source, vllist->status); in afs_update_cell()
411 cell->dns_status = vllist->status; in afs_update_cell()
421 _debug("%s: status %d", cell->name, vllist->status); in afs_update_cell()
428 cell->dns_expiry = expiry; in afs_update_cell()
436 cell->dns_expiry = now + 10; in afs_update_cell()
440 cell->dns_expiry = expiry; in afs_update_cell()
446 write_lock(&cell->vl_servers_lock); in afs_update_cell()
447 p = rcu_dereference_protected(cell->vl_servers, true); in afs_update_cell()
449 rcu_assign_pointer(cell->vl_servers, vllist); in afs_update_cell()
450 cell->dns_source = vllist->source; in afs_update_cell()
453 write_unlock(&cell->vl_servers_lock); in afs_update_cell()
454 afs_put_vlserverlist(cell->net, old); in afs_update_cell()
457 smp_store_release(&cell->dns_lookup_count, in afs_update_cell()
458 cell->dns_lookup_count + 1); /* vs source/status */ in afs_update_cell()
459 wake_up_var(&cell->dns_lookup_count); in afs_update_cell()
469 struct afs_cell *cell = container_of(rcu, struct afs_cell, rcu); in afs_cell_destroy() local
471 _enter("%p{%s}", cell, cell->name); in afs_cell_destroy()
473 ASSERTCMP(atomic_read(&cell->usage), ==, 0); in afs_cell_destroy()
475 afs_put_vlserverlist(cell->net, rcu_access_pointer(cell->vl_servers)); in afs_cell_destroy()
476 key_put(cell->anonymous_key); in afs_cell_destroy()
477 kfree(cell); in afs_cell_destroy()
511 struct afs_cell *afs_get_cell(struct afs_cell *cell) in afs_get_cell() argument
513 atomic_inc(&cell->usage); in afs_get_cell()
514 return cell; in afs_get_cell()
520 void afs_put_cell(struct afs_net *net, struct afs_cell *cell) in afs_put_cell() argument
524 if (!cell) in afs_put_cell()
527 _enter("%s", cell->name); in afs_put_cell()
530 cell->last_inactive = now; in afs_put_cell()
532 if (cell->vl_servers->nr_servers) in afs_put_cell()
535 if (atomic_dec_return(&cell->usage) > 1) in afs_put_cell()
545 static int afs_alloc_anon_key(struct afs_cell *cell) in afs_alloc_anon_key() argument
553 cp = cell->name; in afs_alloc_anon_key()
562 cell->anonymous_key = key; in afs_alloc_anon_key()
565 cell->anonymous_key, key_serial(cell->anonymous_key)); in afs_alloc_anon_key()
572 static int afs_activate_cell(struct afs_net *net, struct afs_cell *cell) in afs_activate_cell() argument
578 if (!cell->anonymous_key) { in afs_activate_cell()
579 ret = afs_alloc_anon_key(cell); in afs_activate_cell()
585 cell->cache = fscache_acquire_cookie(afs_cache_netfs.primary_index, in afs_activate_cell()
587 cell->name, strlen(cell->name), in afs_activate_cell()
589 cell, 0, true); in afs_activate_cell()
591 ret = afs_proc_cell_setup(cell); in afs_activate_cell()
598 if (strcmp(cell->name, pcell->name) < 0) in afs_activate_cell()
602 cell->proc_link.pprev = p; in afs_activate_cell()
603 cell->proc_link.next = *p; in afs_activate_cell()
604 rcu_assign_pointer(*p, &cell->proc_link.next); in afs_activate_cell()
605 if (cell->proc_link.next) in afs_activate_cell()
606 cell->proc_link.next->pprev = &cell->proc_link.next; in afs_activate_cell()
608 afs_dynroot_mkdir(net, cell); in afs_activate_cell()
616 static void afs_deactivate_cell(struct afs_net *net, struct afs_cell *cell) in afs_deactivate_cell() argument
618 _enter("%s", cell->name); in afs_deactivate_cell()
620 afs_proc_cell_remove(cell); in afs_deactivate_cell()
623 hlist_del_rcu(&cell->proc_link); in afs_deactivate_cell()
624 afs_dynroot_rmdir(net, cell); in afs_deactivate_cell()
628 fscache_relinquish_cookie(cell->cache, NULL, false); in afs_deactivate_cell()
629 cell->cache = NULL; in afs_deactivate_cell()
641 struct afs_cell *cell = container_of(work, struct afs_cell, manager); in afs_manage_cell() local
642 struct afs_net *net = cell->net; in afs_manage_cell()
646 _enter("%s", cell->name); in afs_manage_cell()
649 _debug("state %u", cell->state); in afs_manage_cell()
650 switch (cell->state) { in afs_manage_cell()
655 deleted = atomic_try_cmpxchg_relaxed(&cell->usage, &usage, 0); in afs_manage_cell()
657 rb_erase(&cell->net_node, &net->cells); in afs_manage_cell()
661 if (cell->state == AFS_CELL_FAILED) in afs_manage_cell()
663 smp_store_release(&cell->state, AFS_CELL_UNSET); in afs_manage_cell()
664 wake_up_var(&cell->state); in afs_manage_cell()
668 smp_store_release(&cell->state, AFS_CELL_ACTIVATING); in afs_manage_cell()
669 wake_up_var(&cell->state); in afs_manage_cell()
673 ret = afs_activate_cell(net, cell); in afs_manage_cell()
677 smp_store_release(&cell->state, AFS_CELL_ACTIVE); in afs_manage_cell()
678 wake_up_var(&cell->state); in afs_manage_cell()
682 if (atomic_read(&cell->usage) > 1) { in afs_manage_cell()
683 if (test_and_clear_bit(AFS_CELL_FL_DO_LOOKUP, &cell->flags)) { in afs_manage_cell()
684 ret = afs_update_cell(cell); in afs_manage_cell()
686 cell->error = ret; in afs_manage_cell()
690 smp_store_release(&cell->state, AFS_CELL_DEACTIVATING); in afs_manage_cell()
691 wake_up_var(&cell->state); in afs_manage_cell()
695 if (atomic_read(&cell->usage) > 1) in afs_manage_cell()
697 afs_deactivate_cell(net, cell); in afs_manage_cell()
698 smp_store_release(&cell->state, AFS_CELL_INACTIVE); in afs_manage_cell()
699 wake_up_var(&cell->state); in afs_manage_cell()
705 _debug("bad state %u", cell->state); in afs_manage_cell()
709 cell->error = ret; in afs_manage_cell()
710 afs_deactivate_cell(net, cell); in afs_manage_cell()
712 smp_store_release(&cell->state, AFS_CELL_FAILED); /* vs error */ in afs_manage_cell()
713 wake_up_var(&cell->state); in afs_manage_cell()
717 smp_store_release(&cell->state, AFS_CELL_ACTIVE); in afs_manage_cell()
718 wake_up_var(&cell->state); in afs_manage_cell()
723 _leave(" [done %u]", cell->state); in afs_manage_cell()
727 call_rcu(&cell->rcu, afs_cell_destroy); in afs_manage_cell()
761 struct afs_cell *cell = in afs_manage_cells() local
766 usage = atomic_read(&cell->usage); in afs_manage_cells()
767 _debug("manage %s %u", cell->name, usage); in afs_manage_cells()
772 if (test_and_clear_bit(AFS_CELL_FL_NO_GC, &cell->flags)) in afs_manage_cells()
773 usage = atomic_dec_return(&cell->usage); in afs_manage_cells()
779 time64_t expire_at = cell->last_inactive; in afs_manage_cells()
781 read_lock(&cell->vl_servers_lock); in afs_manage_cells()
783 cell->vl_servers, in afs_manage_cells()
784 lockdep_is_held(&cell->vl_servers_lock)); in afs_manage_cells()
787 read_unlock(&cell->vl_servers_lock); in afs_manage_cells()
795 if (test_bit(AFS_CELL_FL_DO_LOOKUP, &cell->flags)) in afs_manage_cells()
800 queue_work(afs_wq, &cell->manager); in afs_manage_cells()