diff options
Diffstat (limited to 'block')
-rw-r--r-- | block/bsg.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/block/bsg.c b/block/bsg.c index 0ce8806dd0c1..0f63b91d0af6 100644 --- a/block/bsg.c +++ b/block/bsg.c | |||
@@ -353,6 +353,8 @@ static void bsg_rq_end_io(struct request *rq, int uptodate) | |||
353 | static void bsg_add_command(struct bsg_device *bd, struct request_queue *q, | 353 | static void bsg_add_command(struct bsg_device *bd, struct request_queue *q, |
354 | struct bsg_command *bc, struct request *rq) | 354 | struct bsg_command *bc, struct request *rq) |
355 | { | 355 | { |
356 | int at_head = (0 == (bc->hdr.flags & BSG_FLAG_Q_AT_TAIL)); | ||
357 | |||
356 | /* | 358 | /* |
357 | * add bc command to busy queue and submit rq for io | 359 | * add bc command to busy queue and submit rq for io |
358 | */ | 360 | */ |
@@ -368,7 +370,7 @@ static void bsg_add_command(struct bsg_device *bd, struct request_queue *q, | |||
368 | dprintk("%s: queueing rq %p, bc %p\n", bd->name, rq, bc); | 370 | dprintk("%s: queueing rq %p, bc %p\n", bd->name, rq, bc); |
369 | 371 | ||
370 | rq->end_io_data = bc; | 372 | rq->end_io_data = bc; |
371 | blk_execute_rq_nowait(q, NULL, rq, 1, bsg_rq_end_io); | 373 | blk_execute_rq_nowait(q, NULL, rq, at_head, bsg_rq_end_io); |
372 | } | 374 | } |
373 | 375 | ||
374 | static struct bsg_command *bsg_next_done_cmd(struct bsg_device *bd) | 376 | static struct bsg_command *bsg_next_done_cmd(struct bsg_device *bd) |
@@ -924,6 +926,7 @@ static long bsg_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | |||
924 | struct request *rq; | 926 | struct request *rq; |
925 | struct bio *bio, *bidi_bio = NULL; | 927 | struct bio *bio, *bidi_bio = NULL; |
926 | struct sg_io_v4 hdr; | 928 | struct sg_io_v4 hdr; |
929 | int at_head; | ||
927 | u8 sense[SCSI_SENSE_BUFFERSIZE]; | 930 | u8 sense[SCSI_SENSE_BUFFERSIZE]; |
928 | 931 | ||
929 | if (copy_from_user(&hdr, uarg, sizeof(hdr))) | 932 | if (copy_from_user(&hdr, uarg, sizeof(hdr))) |
@@ -936,7 +939,9 @@ static long bsg_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | |||
936 | bio = rq->bio; | 939 | bio = rq->bio; |
937 | if (rq->next_rq) | 940 | if (rq->next_rq) |
938 | bidi_bio = rq->next_rq->bio; | 941 | bidi_bio = rq->next_rq->bio; |
939 | blk_execute_rq(bd->queue, NULL, rq, 0); | 942 | |
943 | at_head = (0 == (hdr.flags & BSG_FLAG_Q_AT_TAIL)); | ||
944 | blk_execute_rq(bd->queue, NULL, rq, at_head); | ||
940 | ret = blk_complete_sgv4_hdr_rq(rq, &hdr, bio, bidi_bio); | 945 | ret = blk_complete_sgv4_hdr_rq(rq, &hdr, bio, bidi_bio); |
941 | 946 | ||
942 | if (copy_to_user(uarg, &hdr, sizeof(hdr))) | 947 | if (copy_to_user(uarg, &hdr, sizeof(hdr))) |