return false;
        }
 
-       WARN_ON_ONCE(req->rq_flags & RQF_SPECIAL_PAYLOAD);
-
        req->__data_len -= total_bytes;
 
        /* update sector only for requests with clear definition of sector */
                req->cmd_flags |= req->bio->bi_opf & REQ_FAILFAST_MASK;
        }
 
-       /*
-        * If total number of sectors is less than the first segment
-        * size, something has gone terribly wrong.
-        */
-       if (blk_rq_bytes(req) < blk_rq_cur_bytes(req)) {
-               blk_dump_rq_flags(req, "request botched");
-               req->__data_len = blk_rq_cur_bytes(req);
-       }
+       if (!(req->rq_flags & RQF_SPECIAL_PAYLOAD)) {
+               /*
+                * If total number of sectors is less than the first segment
+                * size, something has gone terribly wrong.
+                */
+               if (blk_rq_bytes(req) < blk_rq_cur_bytes(req)) {
+                       blk_dump_rq_flags(req, "request botched");
+                       req->__data_len = blk_rq_cur_bytes(req);
+               }
 
-       /* recalculate the number of segments */
-       blk_recalc_rq_segments(req);
+               /* recalculate the number of segments */
+               blk_recalc_rq_segments(req);
+       }
 
        return true;
 }