static void __kaio_queue_fsync_req(struct ploop_request * preq, int prio) { struct ploop_device * plo = preq->plo; struct ploop_delta * delta = ploop_top_delta(plo); struct ploop_io * io = &delta->io; if (prio) list_add(&preq->list, &io->fsync_queue); else list_add_tail(&preq->list, &io->fsync_queue); io->fsync_qlen++; if (waitqueue_active(&io->fsync_waitq)) wake_up_interruptible(&io->fsync_waitq); }
static void resubmit(struct ploop_request * preq) { struct ploop_delta * delta = ploop_top_delta(preq->plo); unsigned long sec; switch (preq->eng_state) { case PLOOP_E_INDEX_WB: delta = map_writable_delta(preq); map_index(delta, preq, &sec); nfsio_write_page(&delta->io, preq, preq->sinfo.wi.tpage, sec, 0); break; case PLOOP_E_DATA_WBI: if (preq->aux_bio) { struct bio_list tbl; tbl.head = tbl.tail = preq->aux_bio; nfsio_submit_write_pad(&delta->io, preq, &tbl, preq->iblock, 1<<preq->plo->cluster_log); } else { nfsio_submit_write_pad(&delta->io, preq, &preq->bl, preq->iblock, preq->req_size); } break; case PLOOP_E_COMPLETE: case PLOOP_E_RELOC_NULLIFY: if (preq->aux_bio) { struct bio_list tbl; tbl.head = tbl.tail = preq->aux_bio; nfsio_submit_write(&delta->io, preq, &tbl, preq->iblock, 1<<preq->plo->cluster_log); } else { nfsio_submit_write(&delta->io, preq, &preq->bl, preq->iblock, preq->req_size); } break; default: printk("Resubmit bad state %lu\n\n", preq->eng_state); BUG(); } }
/* returns non-zero if and only if preq was resubmitted */ static int kaio_resubmit(struct ploop_request * preq) { struct ploop_delta * delta = ploop_top_delta(preq->plo); switch (preq->eng_state) { case PLOOP_E_ENTRY: return 0; case PLOOP_E_COMPLETE: case PLOOP_E_RELOC_NULLIFY: case PLOOP_E_DATA_WBI: if (preq->aux_bio) { struct bio_list tbl; tbl.head = tbl.tail = preq->aux_bio; kaio_submit(&delta->io, preq, preq->req_rw, &tbl, preq->iblock, 1<<preq->plo->cluster_log); } else { kaio_submit(&delta->io, preq, preq->req_rw, &preq->bl, preq->iblock, preq->req_size); } break; case PLOOP_E_TRANS_DELTA_READ: /* BUG_ON below guarantees that 'case PLOOP_E_DELTA_COPIED' * is equivalent to the part of 'case PLOOP_E_TRANS_DELTA_READ' * after bio_bcopy(). This is not trivial. */ BUG_ON(!test_bit(PLOOP_REQ_TRANS, &preq->state)); /* Fall through ... */ case PLOOP_E_DELTA_READ: preq->eng_state = PLOOP_E_DELTA_COPIED; /* skip bcopy() */ return 0; default: printk("Resubmit bad state %lu\n", preq->eng_state); BUG(); } return 1; }