Skip to content

Commit 7757875

Browse files
author
Robert Breker
committed
Fix none native request decoding (to be squashed)
This commit moves the protocol-dependant decoding to where it belongs - directly after request are taken from the ring and before the wrong message format is asserted. Prio to this fix, discard did not work properly for x86-guests, as discard requests got corrupted during decoding. Signed-off-by: Robert Breker <[email protected]>
1 parent 0b08a09 commit 7757875

File tree

2 files changed

+60
-35
lines changed

2 files changed

+60
-35
lines changed

drivers/td-ctx.c

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,17 @@ xenio_pending_blkif(struct td_xenio_ctx * const ctx)
125125
dst->seg[i] = src->seg[i]; \
126126
}
127127

128+
#define blkif_get_req_discard(dst, discard_src) \
129+
{ \
130+
/* assert(sizeof(blkif_request_discard_t)<sizeof(blkif_request_t)) */ \
131+
blkif_request_discard_t *discard_dst = (blkif_request_discard_t *) dst; \
132+
discard_dst->operation = src->operation; \
133+
discard_dst->flag = discard_src->flag; \
134+
discard_dst->id = discard_src->id; \
135+
discard_dst->sector_number = discard_src->sector_number; \
136+
discard_dst->nr_sectors = discard_src->nr_sectors; \
137+
}
138+
128139
/**
129140
* Utility function that retrieves a request using @idx as the ring index,
130141
* copying it to the @dst in a H/W independent way.
@@ -149,6 +160,7 @@ xenio_blkif_get_request(struct td_xenblkif * const blkif,
149160
{
150161
blkif_request_t *src;
151162
src = RING_GET_REQUEST(&rings->native, idx);
163+
// sizeof(blkif_request_t)>sizeof(blkif_request_discard_t)
152164
memcpy(dst, src, sizeof(blkif_request_t));
153165
break;
154166
}
@@ -157,15 +169,27 @@ xenio_blkif_get_request(struct td_xenblkif * const blkif,
157169
{
158170
blkif_x86_32_request_t *src;
159171
src = RING_GET_REQUEST(&rings->x86_32, idx);
160-
blkif_get_req(dst, src);
172+
if (src->operation==BLKIF_OP_DISCARD) {
173+
blkif_x86_32_request_discard_t * discard_src;
174+
discard_src = (blkif_x86_32_request_discard_t *) src;
175+
blkif_get_req_discard(dst, discard_src);
176+
} else {
177+
blkif_get_req(dst, src);
178+
}
161179
break;
162180
}
163181

164182
case BLKIF_PROTOCOL_X86_64:
165183
{
166184
blkif_x86_64_request_t *src;
167185
src = RING_GET_REQUEST(&rings->x86_64, idx);
168-
blkif_get_req(dst, src);
186+
if (src->operation==BLKIF_OP_DISCARD) {
187+
blkif_x86_64_request_discard_t * discard_src;
188+
discard_src = (blkif_x86_64_request_discard_t *) src;
189+
blkif_get_req_discard(dst, discard_src);
190+
} else {
191+
blkif_get_req(dst, src);
192+
}
169193
break;
170194
}
171195

drivers/td-req.c

Lines changed: 34 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -569,10 +569,6 @@ tapdisk_xenblkif_parse_request(struct td_xenblkif * const blkif,
569569
void *page, *next, *last;
570570
int err = 0;
571571
unsigned nr_sect = 0;
572-
blkif_request_discard_t * request_discard_native_msg;
573-
blkif_x86_32_request_discard_t * request_discard_x86_32_msg;
574-
blkif_x86_64_request_discard_t * request_discard_x86_64_msg;
575-
576572

577573
ASSERT(blkif);
578574
ASSERT(req);
@@ -640,33 +636,6 @@ tapdisk_xenblkif_parse_request(struct td_xenblkif * const blkif,
640636
vreq->iovcnt = iov - req->iov + 1;
641637
vreq->sec = req->msg.sector_number;
642638

643-
if(req->msg.operation == BLKIF_OP_DISCARD) {
644-
switch (blkif->proto) {
645-
case BLKIF_PROTOCOL_NATIVE:
646-
request_discard_native_msg = (blkif_request_discard_t*)&req->msg;
647-
vreq->discard_nr_sectors = request_discard_native_msg->nr_sectors;
648-
vreq->sec = request_discard_native_msg->sector_number;
649-
break;
650-
case BLKIF_PROTOCOL_X86_32:
651-
request_discard_x86_32_msg = (blkif_x86_32_request_discard_t*)&req->msg;
652-
vreq->discard_nr_sectors = request_discard_x86_32_msg->nr_sectors;
653-
vreq->sec = request_discard_x86_32_msg->sector_number;
654-
break;
655-
case BLKIF_PROTOCOL_X86_64:
656-
request_discard_x86_64_msg = (blkif_x86_64_request_discard_t*)&req->msg;
657-
vreq->discard_nr_sectors = request_discard_x86_64_msg->nr_sectors;
658-
vreq->sec = request_discard_x86_64_msg->sector_number;
659-
break;
660-
default:
661-
ASSERT(0);
662-
break;
663-
}
664-
nr_sect = 0;
665-
}
666-
667-
vreq->iov = req->iov;
668-
vreq->iovcnt = iov - req->iov + 1;
669-
670639
if (blkif_rq_wr(&req->msg)) {
671640
err = guest_copy2(blkif, req);
672641
if (err) {
@@ -693,6 +662,37 @@ tapdisk_xenblkif_parse_request(struct td_xenblkif * const blkif,
693662
return err;
694663
}
695664

665+
static inline int
666+
tapdisk_xenblkif_parse_request_discard(struct td_xenblkif * const blkif,
667+
struct td_xenblkif_req * const req)
668+
{
669+
int err = 0;
670+
td_vbd_request_t *vreq;
671+
blkif_request_discard_t * request_discard_msg;
672+
673+
vreq = &req->vreq;
674+
ASSERT(vreq);
675+
676+
vreq->iov = 0;
677+
vreq->iovcnt = 0;
678+
vreq->sec = 0;
679+
680+
request_discard_msg = (blkif_request_discard_t*)&req->msg;
681+
vreq->discard_nr_sectors = request_discard_msg->nr_sectors;
682+
vreq->sec = request_discard_msg->sector_number;
683+
684+
/*
685+
* TODO Isn't this kind of expensive to do for each requests? Why does
686+
* the tapdisk need this in the first place?
687+
*/
688+
snprintf(req->name, sizeof(req->name), "xenvbd-%d-%d.%"SCNx64"",
689+
blkif->domid, blkif->devid, request_discard_msg->id);
690+
vreq->name = req->name;
691+
vreq->token = blkif;
692+
vreq->cb = __tapdisk_xenblkif_request_cb;
693+
694+
return err;
695+
}
696696

697697
/**
698698
* Initialises the standard tapdisk request (td_vbd_request_t) from the
@@ -757,8 +757,9 @@ tapdisk_xenblkif_make_vbd_request(struct td_xenblkif * const blkif,
757757
goto out;
758758
}
759759

760-
if (likely(tapreq->msg.nr_segments ||
761-
tapreq->msg.operation == BLKIF_OP_DISCARD))
760+
if (unlikely(tapreq->msg.operation == BLKIF_OP_DISCARD))
761+
err = tapdisk_xenblkif_parse_request_discard(blkif, tapreq);
762+
else if (likely(tapreq->msg.nr_segments))
762763
err = tapdisk_xenblkif_parse_request(blkif, tapreq);
763764
/*
764765
* If we only got one request from the ring and that was a barrier one,

0 commit comments

Comments
 (0)