void blkfront_sync(struct blkfront_dev *dev) { unsigned long flags; DEFINE_WAIT(w); if (dev->info.mode == O_RDWR) { if (dev->info.barrier == 1) blkfront_push_operation(dev, BLKIF_OP_WRITE_BARRIER, 0); if (dev->info.flush == 1) blkfront_push_operation(dev, BLKIF_OP_FLUSH_DISKCACHE, 0); } /* Note: This won't finish if another thread enqueues requests. */ local_irq_save(flags); while (1) { blkfront_aio_poll(dev); if (RING_FREE_REQUESTS(&dev->ring) == RING_SIZE(&dev->ring)) break; minios_add_waiter(w, blkfront_queue); local_irq_restore(flags); minios_schedule(); local_irq_save(flags); } minios_remove_waiter(w, blkfront_queue); local_irq_restore(flags); }
static struct xenbus_event *await_event(struct xenbus_event_queue *queue) { struct xenbus_event *event; DEFINE_WAIT(w); spin_lock(&xenbus_req_lock); while (!(event = remove_event(queue))) { minios_add_waiter(w, queue->waitq); spin_unlock(&xenbus_req_lock); minios_wait(w); spin_lock(&xenbus_req_lock); } minios_remove_waiter(w, queue->waitq); spin_unlock(&xenbus_req_lock); return event; }
static void blkfront_wait_slot(struct blkfront_dev *dev) { /* Wait for a slot */ if (RING_FULL(&dev->ring)) { unsigned long flags; DEFINE_WAIT(w); local_irq_save(flags); while (1) { blkfront_aio_poll(dev); if (!RING_FULL(&dev->ring)) break; /* Really no slot, go to sleep. */ minios_add_waiter(w, blkfront_queue); local_irq_restore(flags); minios_schedule(); local_irq_save(flags); } minios_remove_waiter(w, blkfront_queue); local_irq_restore(flags); } }
void blkfront_io(struct blkfront_aiocb *aiocbp, int write) { unsigned long flags; DEFINE_WAIT(w); ASSERT(!aiocbp->aio_cb); aiocbp->aio_cb = blkfront_aio_cb; blkfront_aio(aiocbp, write); aiocbp->data = NULL; local_irq_save(flags); while (1) { blkfront_aio_poll(aiocbp->aio_dev); if (aiocbp->data) break; minios_add_waiter(w, blkfront_queue); local_irq_restore(flags); minios_schedule(); local_irq_save(flags); } minios_remove_waiter(w, blkfront_queue); local_irq_restore(flags); }