Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
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();
	}
}
Exemplo n.º 3
0
/* 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;
}