@@ -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