+ kibnal_data.kib_reaper_waketime = jiffies + timeout;
+
+ set_current_state (TASK_INTERRUPTIBLE);
+ add_wait_queue (&kibnal_data.kib_reaper_waitq, &wait);
+
+ schedule_timeout (timeout);
+
+ set_current_state (TASK_RUNNING);
+ remove_wait_queue (&kibnal_data.kib_reaper_waitq, &wait);
+
+ spin_lock_irqsave (&kibnal_data.kib_reaper_lock, flags);
+ }
+
+ spin_unlock_irqrestore (&kibnal_data.kib_reaper_lock, flags);
+
+ kibnal_thread_fini ();
+ return (0);
+}
+
+int
+kibnal_connd (void *arg)
+{
+ long id = (long)arg;
+ char name[16];
+ wait_queue_t wait;
+ unsigned long flags;
+ kib_peer_t *peer;
+ kib_acceptsock_t *as;
+ int did_something;
+
+ snprintf(name, sizeof(name), "kibnal_connd_%02ld", id);
+ kportal_daemonize(name);
+ kportal_blockallsigs();
+
+ init_waitqueue_entry (&wait, current);
+
+ spin_lock_irqsave(&kibnal_data.kib_connd_lock, flags);
+
+ while (!kibnal_data.kib_shutdown) {
+ did_something = 0;
+
+ if (!list_empty (&kibnal_data.kib_connd_acceptq)) {
+ as = list_entry (kibnal_data.kib_connd_acceptq.next,
+ kib_acceptsock_t, ibas_list);
+ list_del (&as->ibas_list);
+
+ spin_unlock_irqrestore (&kibnal_data.kib_connd_lock, flags);
+
+ kibnal_handle_svcqry(as->ibas_sock);
+ sock_release(as->ibas_sock);
+ PORTAL_FREE(as, sizeof(*as));
+
+ spin_lock_irqsave(&kibnal_data.kib_connd_lock, flags);
+ did_something = 1;
+ }
+
+ if (!list_empty (&kibnal_data.kib_connd_peers)) {
+ peer = list_entry (kibnal_data.kib_connd_peers.next,
+ kib_peer_t, ibp_connd_list);
+
+ list_del_init (&peer->ibp_connd_list);
+ spin_unlock_irqrestore (&kibnal_data.kib_connd_lock, flags);
+
+ kibnal_connect_peer (peer);
+ kibnal_put_peer (peer);
+
+ spin_lock_irqsave (&kibnal_data.kib_connd_lock, flags);
+ did_something = 1;
+ }
+
+ if (did_something)
+ continue;