- /* unblock waiting parent */
- LASSERT (kranal_data.kra_listener_shutdown == 0);
- up(&kranal_data.kra_listener_signal);
-
- /* Wake me any time something happens on my socket */
- add_wait_queue(sock->sk->sk_sleep, &wait);
- ras = NULL;
-
- while (kranal_data.kra_listener_shutdown == 0) {
-
- if (ras == NULL) {
- PORTAL_ALLOC(ras, sizeof(*ras));
- if (ras == NULL) {
- CERROR("Out of Memory: pausing...\n");
- kranal_pause(HZ);
- continue;
- }
- ras->ras_sock = NULL;
- }
-
- if (ras->ras_sock == NULL) {
- ras->ras_sock = sock_alloc();
- if (ras->ras_sock == NULL) {
- CERROR("Can't allocate socket: pausing...\n");
- kranal_pause(HZ);
- continue;
- }
- /* XXX this should add a ref to sock->ops->owner, if
- * TCP could be a module */
- ras->ras_sock->type = sock->type;
- ras->ras_sock->ops = sock->ops;
- }
-
- set_current_state(TASK_INTERRUPTIBLE);
-
- rc = sock->ops->accept(sock, ras->ras_sock, O_NONBLOCK);
-
- /* Sleep for socket activity? */
- if (rc == -EAGAIN &&
- kranal_data.kra_listener_shutdown == 0)
- schedule();
-
- set_current_state(TASK_RUNNING);
-
- if (rc == 0) {
- spin_lock_irqsave(&kranal_data.kra_connd_lock, flags);
-
- list_add_tail(&ras->ras_list,
- &kranal_data.kra_connd_acceptq);
-
- spin_unlock_irqrestore(&kranal_data.kra_connd_lock, flags);
- wake_up(&kranal_data.kra_connd_waitq);
-
- ras = NULL;
- continue;
- }
-
- if (rc != -EAGAIN) {
- CERROR("Accept failed: %d, pausing...\n", rc);
- kranal_pause(HZ);
- }
- }
-
- if (ras != NULL) {
- if (ras->ras_sock != NULL)
- sock_release(ras->ras_sock);
- PORTAL_FREE(ras, sizeof(*ras));
- }
-
- rc = 0;
- remove_wait_queue(sock->sk->sk_sleep, &wait);
- out_1:
- sock_release(sock);
- kranal_data.kra_listener_sock = NULL;
- out_0:
- /* set completion status and unblock thread waiting for me
- * (parent on startup failure, executioner on normal shutdown) */
- kranal_data.kra_listener_shutdown = rc;
- up(&kranal_data.kra_listener_signal);
-
- return 0;
-}
-
-int
-kranal_start_listener (void)
-{
- 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;