Correct blkback handling of the BLKIF_OP_FLUSH_DISKCACHE opcode.
Properly round-trip the "operation code" for client requests. sys/dev/xen/blkback/blkback.c: In xbb_dispatch_dev() when processing a flush request, correctly set bio->bio_caller1 to the request list (not bare request) for the operation, as is expected by the completion handler xbb_bio_done(). In xbb_get_resources(), initialize "operation" in the driver's internal request object from the client's "ring request", so it is correct when used to populate the reply when this operation completes. Submitted by: Roger Pau Monné Sponsored by: Citrix Systems R&D Reviewed by: gibbs
This commit is contained in:
parent
23ba68da73
commit
ceb5fa1b16
@ -230,7 +230,7 @@ struct xbb_xen_reqlist {
|
||||
int num_children;
|
||||
|
||||
/**
|
||||
* Number of I/O requests dispatched to the backend.
|
||||
* Number of I/O requests still pending on the backend.
|
||||
*/
|
||||
int pendcnt;
|
||||
|
||||
@ -326,13 +326,6 @@ struct xbb_xen_req {
|
||||
*/
|
||||
int nr_512b_sectors;
|
||||
|
||||
/**
|
||||
* The number of struct bio requests still outstanding for this
|
||||
* request on the backend device. This field is only used for
|
||||
* device (rather than file) backed I/O.
|
||||
*/
|
||||
int pendcnt;
|
||||
|
||||
/**
|
||||
* BLKIF_OP code for this request.
|
||||
*/
|
||||
@ -1240,6 +1233,7 @@ xbb_get_resources(struct xbb_softc *xbb, struct xbb_xen_reqlist **reqlist,
|
||||
nreq->reqlist = *reqlist;
|
||||
nreq->req_ring_idx = ring_idx;
|
||||
nreq->id = ring_req->id;
|
||||
nreq->operation = ring_req->operation;
|
||||
|
||||
if (xbb->abi != BLKIF_PROTOCOL_NATIVE) {
|
||||
bcopy(ring_req, &nreq->ring_req_storage, sizeof(*ring_req));
|
||||
@ -2062,7 +2056,6 @@ xbb_dispatch_dev(struct xbb_softc *xbb, struct xbb_xen_reqlist *reqlist,
|
||||
{
|
||||
struct xbb_dev_data *dev_data;
|
||||
struct bio *bios[XBB_MAX_SEGMENTS_PER_REQLIST];
|
||||
struct xbb_xen_req *nreq;
|
||||
off_t bio_offset;
|
||||
struct bio *bio;
|
||||
struct xbb_sg *xbb_sg;
|
||||
@ -2080,7 +2073,6 @@ xbb_dispatch_dev(struct xbb_softc *xbb, struct xbb_xen_reqlist *reqlist,
|
||||
bio_idx = 0;
|
||||
|
||||
if (operation == BIO_FLUSH) {
|
||||
nreq = STAILQ_FIRST(&reqlist->contig_req_list);
|
||||
bio = g_new_bio();
|
||||
if (__predict_false(bio == NULL)) {
|
||||
DPRINTF("Unable to allocate bio for BIO_FLUSH\n");
|
||||
@ -2094,10 +2086,10 @@ xbb_dispatch_dev(struct xbb_softc *xbb, struct xbb_xen_reqlist *reqlist,
|
||||
bio->bio_offset = 0;
|
||||
bio->bio_data = 0;
|
||||
bio->bio_done = xbb_bio_done;
|
||||
bio->bio_caller1 = nreq;
|
||||
bio->bio_caller1 = reqlist;
|
||||
bio->bio_pblkno = 0;
|
||||
|
||||
nreq->pendcnt = 1;
|
||||
reqlist->pendcnt = 1;
|
||||
|
||||
SDT_PROBE1(xbb, kernel, xbb_dispatch_dev, flush,
|
||||
device_get_unit(xbb->dev));
|
||||
|
Loading…
x
Reference in New Issue
Block a user