int blkif_schedule(void *arg)
{
- blkif_t *blkif = arg;
+ blkif_t *blkif = arg;
blkif_get(blkif);
+
if (debug_lvl)
printk(KERN_DEBUG "%s: started\n", current->comm);
- for (;;) {
- if (kthread_should_stop()) {
- /* asked to quit? */
- if (!atomic_read(&blkif->io_pending))
- break;
- if (debug_lvl)
- printk(KERN_DEBUG "%s: I/O pending, "
- "delaying exit\n", current->comm);
- }
-
- if (!atomic_read(&blkif->io_pending)) {
- /* Wait for work to do. */
- wait_event_interruptible(
- blkif->wq,
- (atomic_read(&blkif->io_pending) ||
- kthread_should_stop()));
- } else if (list_empty(&pending_free)) {
- /* Wait for pending_req becoming available. */
- wait_event_interruptible(
- pending_free_wq,
- !list_empty(&pending_free));
- }
- if (blkif->status != CONNECTED) {
- /* make sure we are connected */
- if (debug_lvl)
- printk(KERN_DEBUG "%s: not connected "
- "(%d pending)\n",
- current->comm,
- atomic_read(&blkif->io_pending));
- wait_event_interruptible(
- blkif->wq,
- (blkif->status == CONNECTED ||
- kthread_should_stop()));
- continue;
- }
+ while (!kthread_should_stop()) {
+ wait_event_interruptible(
+ blkif->wq,
+ (atomic_read(&blkif->io_pending) &&
+ !list_empty(&pending_free)) ||
+ kthread_should_stop());
- /* Schedule I/O */
atomic_set(&blkif->io_pending, 0);
if (do_block_io_op(blkif))
atomic_inc(&blkif->io_pending);
print_stats(blkif);
if (debug_lvl)
printk(KERN_DEBUG "%s: exiting\n", current->comm);
+
blkif->xenblkd = NULL;
blkif_put(blkif);
+
return 0;
}