+static int __wait_exit(struct vx_info *vxi)
+{
+ DECLARE_WAITQUEUE(wait, current);
+ int ret = 0;
+
+ add_wait_queue(&vxi->vx_wait, &wait);
+ set_current_state(TASK_INTERRUPTIBLE);
+
+wait:
+ if (vx_info_state(vxi, VXS_SHUTDOWN|VXS_HASHED) == VXS_SHUTDOWN)
+ goto out;
+ if (signal_pending(current)) {
+ ret = -ERESTARTSYS;
+ goto out;
+ }
+ schedule();
+ goto wait;
+
+out:
+ set_current_state(TASK_RUNNING);
+ remove_wait_queue(&vxi->vx_wait, &wait);
+ return ret;
+}
+
+
+
+int vc_wait_exit(uint32_t id, void __user *data)
+{
+ struct vx_info *vxi;
+ int ret;
+
+ vxi = locate_vx_info(id);
+ if (!vxi)
+ return -ESRCH;
+
+ ret = __wait_exit(vxi);
+ put_vx_info(vxi);
+ return ret;
+}
+