Lines Matching refs:net
26 static void afs_dec_cells_outstanding(struct afs_net *net) in afs_dec_cells_outstanding() argument
28 if (atomic_dec_and_test(&net->cells_outstanding)) in afs_dec_cells_outstanding()
29 wake_up_var(&net->cells_outstanding); in afs_dec_cells_outstanding()
36 static void afs_set_cell_timer(struct afs_net *net, time64_t delay) in afs_set_cell_timer() argument
38 if (net->live) { in afs_set_cell_timer()
39 atomic_inc(&net->cells_outstanding); in afs_set_cell_timer()
40 if (timer_reduce(&net->cells_timer, jiffies + delay * HZ)) in afs_set_cell_timer()
41 afs_dec_cells_outstanding(net); in afs_set_cell_timer()
49 struct afs_cell *afs_lookup_cell_rcu(struct afs_net *net, in afs_lookup_cell_rcu() argument
69 afs_put_cell(net, cell); in afs_lookup_cell_rcu()
73 read_seqbegin_or_lock(&net->cells_lock, &seq); in afs_lookup_cell_rcu()
76 cell = rcu_dereference_raw(net->ws_cell); in afs_lookup_cell_rcu()
85 p = rcu_dereference_raw(net->cells.rb_node); in afs_lookup_cell_rcu()
109 } while (need_seqretry(&net->cells_lock, seq)); in afs_lookup_cell_rcu()
111 done_seqretry(&net->cells_lock, seq); in afs_lookup_cell_rcu()
120 static struct afs_cell *afs_alloc_cell(struct afs_net *net, in afs_alloc_cell() argument
145 cell->net = net; in afs_alloc_cell()
199 struct afs_cell *afs_lookup_cell(struct afs_net *net, in afs_lookup_cell() argument
211 cell = afs_lookup_cell_rcu(net, name, namesz); in afs_lookup_cell()
224 candidate = afs_alloc_cell(net, name, namesz, vllist); in afs_lookup_cell()
233 write_seqlock(&net->cells_lock); in afs_lookup_cell()
235 pp = &net->cells.rb_node; in afs_lookup_cell()
256 rb_insert_color(&cell->net_node, &net->cells); in afs_lookup_cell()
257 atomic_inc(&net->cells_outstanding); in afs_lookup_cell()
258 write_sequnlock(&net->cells_lock); in afs_lookup_cell()
290 write_sequnlock(&net->cells_lock); in afs_lookup_cell()
296 afs_put_cell(net, cell); in afs_lookup_cell()
307 int afs_cell_init(struct afs_net *net, const char *rootcell) in afs_cell_init() argument
334 new_root = afs_lookup_cell(net, rootcell, len, vllist, false); in afs_cell_init()
344 write_seqlock(&net->cells_lock); in afs_cell_init()
345 old_root = rcu_access_pointer(net->ws_cell); in afs_cell_init()
346 rcu_assign_pointer(net->ws_cell, new_root); in afs_cell_init()
347 write_sequnlock(&net->cells_lock); in afs_cell_init()
349 afs_put_cell(net, old_root); in afs_cell_init()
402 afs_set_cell_timer(cell->net, cell->dns_expiry - now); in afs_update_cell()
427 static void afs_queue_cell_manager(struct afs_net *net) in afs_queue_cell_manager() argument
429 int outstanding = atomic_inc_return(&net->cells_outstanding); in afs_queue_cell_manager()
433 if (!queue_work(afs_wq, &net->cells_manager)) in afs_queue_cell_manager()
434 afs_dec_cells_outstanding(net); in afs_queue_cell_manager()
443 struct afs_net *net = container_of(timer, struct afs_net, cells_timer); in afs_cells_timer() local
446 if (!queue_work(afs_wq, &net->cells_manager)) in afs_cells_timer()
447 afs_dec_cells_outstanding(net); in afs_cells_timer()
462 void afs_put_cell(struct afs_net *net, struct afs_cell *cell) in afs_put_cell() argument
482 afs_set_cell_timer(net, expire_delay); in afs_put_cell()
515 static int afs_activate_cell(struct afs_net *net, struct afs_cell *cell) in afs_activate_cell() argument
538 mutex_lock(&net->proc_cells_lock); in afs_activate_cell()
539 for (p = &net->proc_cells.first; *p; p = &(*p)->next) { in afs_activate_cell()
551 afs_dynroot_mkdir(net, cell); in afs_activate_cell()
552 mutex_unlock(&net->proc_cells_lock); in afs_activate_cell()
559 static void afs_deactivate_cell(struct afs_net *net, struct afs_cell *cell) in afs_deactivate_cell() argument
565 mutex_lock(&net->proc_cells_lock); in afs_deactivate_cell()
567 afs_dynroot_rmdir(net, cell); in afs_deactivate_cell()
568 mutex_unlock(&net->proc_cells_lock); in afs_deactivate_cell()
585 struct afs_net *net = cell->net; in afs_manage_cell() local
596 write_seqlock(&net->cells_lock); in afs_manage_cell()
600 rb_erase(&cell->net_node, &net->cells); in afs_manage_cell()
601 write_sequnlock(&net->cells_lock); in afs_manage_cell()
614 ret = afs_activate_cell(net, cell); in afs_manage_cell()
627 if (cell->dns_expiry <= now && net->live) in afs_manage_cell()
638 afs_deactivate_cell(net, cell); in afs_manage_cell()
650 afs_deactivate_cell(net, cell); in afs_manage_cell()
672 afs_dec_cells_outstanding(net); in afs_manage_cell()
673 _leave(" [destruct %d]", atomic_read(&net->cells_outstanding)); in afs_manage_cell()
691 struct afs_net *net = container_of(work, struct afs_net, cells_manager); in afs_manage_cells() local
694 bool purging = !net->live; in afs_manage_cells()
702 read_seqlock_excl(&net->cells_lock); in afs_manage_cells()
704 for (cursor = rb_first(&net->cells); cursor; cursor = rb_next(cursor)) { in afs_manage_cells()
744 read_sequnlock_excl(&net->cells_lock); in afs_manage_cells()
754 if (queue_work(afs_wq, &net->cells_manager)) in afs_manage_cells()
755 atomic_inc(&net->cells_outstanding); in afs_manage_cells()
757 afs_set_cell_timer(net, next_manage - now); in afs_manage_cells()
761 afs_dec_cells_outstanding(net); in afs_manage_cells()
762 _leave(" [%d]", atomic_read(&net->cells_outstanding)); in afs_manage_cells()
768 void afs_cell_purge(struct afs_net *net) in afs_cell_purge() argument
774 write_seqlock(&net->cells_lock); in afs_cell_purge()
775 ws = rcu_access_pointer(net->ws_cell); in afs_cell_purge()
776 RCU_INIT_POINTER(net->ws_cell, NULL); in afs_cell_purge()
777 write_sequnlock(&net->cells_lock); in afs_cell_purge()
778 afs_put_cell(net, ws); in afs_cell_purge()
781 if (del_timer_sync(&net->cells_timer)) in afs_cell_purge()
782 atomic_dec(&net->cells_outstanding); in afs_cell_purge()
785 afs_queue_cell_manager(net); in afs_cell_purge()
788 wait_var_event(&net->cells_outstanding, in afs_cell_purge()
789 !atomic_read(&net->cells_outstanding)); in afs_cell_purge()