Commit e7569c18 authored by Paolo Bonzini's avatar Paolo Bonzini Committed by Fam Zheng
Browse files

qed: move tail of qed_aio_write_main to qed_aio_write_{cow, alloc}



This part is never called for in-place writes, move it away to avoid
the "backwards" coding style typical of callback-based code.

Reviewed-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: default avatarFam Zheng <famz@redhat.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
Message-Id: <20170629132749.997-7-pbonzini@redhat.com>
Signed-off-by: default avatarFam Zheng <famz@redhat.com>
parent 254aee4d
Loading
Loading
Loading
Loading
+32 −38
Original line number Diff line number Diff line
@@ -982,40 +982,12 @@ static int coroutine_fn qed_aio_write_main(QEDAIOCB *acb)
    BDRVQEDState *s = acb_to_s(acb);
    uint64_t offset = acb->cur_cluster +
                      qed_offset_into_cluster(s, acb->cur_pos);
    int ret;

    trace_qed_aio_write_main(s, acb, 0, offset, acb->cur_qiov.size);

    BLKDBG_EVENT(s->bs->file, BLKDBG_WRITE_AIO);
    ret = bdrv_co_pwritev(s->bs->file, offset, acb->cur_qiov.size,
    return bdrv_co_pwritev(s->bs->file, offset, acb->cur_qiov.size,
                           &acb->cur_qiov, 0);
    if (ret < 0) {
        return ret;
    }

    if (acb->find_cluster_ret != QED_CLUSTER_FOUND) {
        if (s->bs->backing) {
            /*
             * Flush new data clusters before updating the L2 table
             *
             * This flush is necessary when a backing file is in use.  A crash
             * during an allocating write could result in empty clusters in the
             * image.  If the write only touched a subregion of the cluster,
             * then backing image sectors have been lost in the untouched
             * region.  The solution is to flush after writing a new data
             * cluster and before updating the L2 table.
             */
            ret = bdrv_co_flush(s->bs->file->bs);
            if (ret < 0) {
                return ret;
            }
        }
        ret = qed_aio_write_l2_update(acb, acb->cur_cluster);
        if (ret < 0) {
            return ret;
        }
    }
    return 0;
}

/**
@@ -1050,7 +1022,29 @@ static int coroutine_fn qed_aio_write_cow(QEDAIOCB *acb)
        return ret;
    }

    return qed_aio_write_main(acb);
    ret = qed_aio_write_main(acb);
    if (ret < 0) {
        return ret;
    }

    if (s->bs->backing) {
        /*
         * Flush new data clusters before updating the L2 table
         *
         * This flush is necessary when a backing file is in use.  A crash
         * during an allocating write could result in empty clusters in the
         * image.  If the write only touched a subregion of the cluster,
         * then backing image sectors have been lost in the untouched
         * region.  The solution is to flush after writing a new data
         * cluster and before updating the L2 table.
         */
        ret = bdrv_co_flush(s->bs->file->bs);
        if (ret < 0) {
            return ret;
        }
    }

    return 0;
}

/**
@@ -1103,6 +1097,7 @@ static int coroutine_fn qed_aio_write_alloc(QEDAIOCB *acb, size_t len)
        if (acb->find_cluster_ret == QED_CLUSTER_ZERO) {
            return 0;
        }
        acb->cur_cluster = 1;
    } else {
        acb->cur_cluster = qed_alloc_clusters(s, acb->cur_nclusters);
    }
@@ -1115,15 +1110,14 @@ static int coroutine_fn qed_aio_write_alloc(QEDAIOCB *acb, size_t len)
        }
    }

    if (acb->flags & QED_AIOCB_ZERO) {
        ret = qed_aio_write_l2_update(acb, 1);
    } else {
    if (!(acb->flags & QED_AIOCB_ZERO)) {
        ret = qed_aio_write_cow(acb);
    }
        if (ret < 0) {
            return ret;
        }
    return 0;
    }

    return qed_aio_write_l2_update(acb, acb->cur_cluster);
}

/**