diff options
-rw-r--r-- | block/bsg.c | 9 | ||||
-rw-r--r-- | include/linux/bsg.h | 8 |
2 files changed, 15 insertions, 2 deletions
diff --git a/block/bsg.c b/block/bsg.c index 0ce8806dd0c..0f63b91d0af 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))) |
diff --git a/include/linux/bsg.h b/include/linux/bsg.h index cf0303a6061..3f0c64ace42 100644 --- a/include/linux/bsg.h +++ b/include/linux/bsg.h | |||
@@ -7,6 +7,14 @@ | |||
7 | #define BSG_SUB_PROTOCOL_SCSI_TMF 1 | 7 | #define BSG_SUB_PROTOCOL_SCSI_TMF 1 |
8 | #define BSG_SUB_PROTOCOL_SCSI_TRANSPORT 2 | 8 | #define BSG_SUB_PROTOCOL_SCSI_TRANSPORT 2 |
9 | 9 | ||
10 | /* | ||
11 | * For flags member below | ||
12 | * sg.h sg_io_hdr also has bits defined for it's flags member. However | ||
13 | * none of these bits are implemented/used by bsg. The bits below are | ||
14 | * allocated to not conflict with sg.h ones anyway. | ||
15 | */ | ||
16 | #define BSG_FLAG_Q_AT_TAIL 0x10 /* default, == 0 at this bit, is Q_AT_HEAD */ | ||
17 | |||
10 | struct sg_io_v4 { | 18 | struct sg_io_v4 { |
11 | __s32 guard; /* [i] 'Q' to differentiate from v3 */ | 19 | __s32 guard; /* [i] 'Q' to differentiate from v3 */ |
12 | __u32 protocol; /* [i] 0 -> SCSI , .... */ | 20 | __u32 protocol; /* [i] 0 -> SCSI , .... */ |