- long pid;
- int rc;
-
- CDEBUG(D_NET, "Starting listener\n");
-
- /* Called holding kra_nid_mutex: listener stopped */
- LASSERT (kranal_data.kra_listener_sock == NULL);
-
- kranal_data.kra_listener_shutdown = 0;
- pid = kernel_thread(kranal_listener, NULL, 0);
- if (pid < 0) {
- CERROR("Can't spawn listener: %ld\n", pid);
- return (int)pid;
- }
-
- /* Block until listener has started up. */
- down(&kranal_data.kra_listener_signal);
-
- rc = kranal_data.kra_listener_shutdown;
- LASSERT ((rc != 0) == (kranal_data.kra_listener_sock == NULL));
-
- CDEBUG(D_NET, "Listener %ld started OK\n", pid);
- return rc;
-}
-
-void
-kranal_stop_listener(int clear_acceptq)
-{
- struct list_head zombie_accepts;
- unsigned long flags;
- kra_acceptsock_t *ras;
-
- CDEBUG(D_NET, "Stopping listener\n");
-
- /* Called holding kra_nid_mutex: listener running */
- LASSERT (kranal_data.kra_listener_sock != NULL);
-
- kranal_data.kra_listener_shutdown = 1;
- wake_up_all(kranal_data.kra_listener_sock->sk->sk_sleep);
-
- /* Block until listener has torn down. */
- down(&kranal_data.kra_listener_signal);
-
- LASSERT (kranal_data.kra_listener_sock == NULL);
- CDEBUG(D_NET, "Listener stopped\n");
-
- if (!clear_acceptq)
- return;
-
- /* Close any unhandled accepts */
- spin_lock_irqsave(&kranal_data.kra_connd_lock, flags);
-
- list_add(&zombie_accepts, &kranal_data.kra_connd_acceptq);
- list_del_init(&kranal_data.kra_connd_acceptq);
-
- spin_unlock_irqrestore(&kranal_data.kra_connd_lock, flags);
-
- while (!list_empty(&zombie_accepts)) {
- ras = list_entry(zombie_accepts.next,
- kra_acceptsock_t, ras_list);
- list_del(&ras->ras_list);
- kranal_free_acceptsock(ras);
- }
-}
-
-int
-kranal_listener_procint(ctl_table *table, int write, struct file *filp,
- void *buffer, size_t *lenp)
-{
- int *tunable = (int *)table->data;
- int old_val;
- int rc;
-
- /* No race with nal initialisation since the nal is setup all the time
- * it's loaded. When that changes, change this! */
- LASSERT (kranal_data.kra_init == RANAL_INIT_ALL);
-
- down(&kranal_data.kra_nid_mutex);
-
- LASSERT (tunable == &kranal_tunables.kra_port ||
- tunable == &kranal_tunables.kra_backlog);
- old_val = *tunable;
-
- rc = proc_dointvec(table, write, filp, buffer, lenp);
-
- if (write &&
- (*tunable != old_val ||
- kranal_data.kra_listener_sock == NULL)) {