Commit 16070cc1 authored by Douglas Gilbert's avatar Douglas Gilbert Committed by Christoph Hellwig

sg: add SG_FLAG_Q_AT_TAIL flag

When the SG_IO ioctl was copied into the block layer and
later into the bsg driver, subtle differences emerged.

One difference is the way injected commands are queued through
the block layer (i.e. this is not SCSI device queueing nor SATA
NCQ). Summarizing:
   - SG_IO in the block layer: blk_exec*(at_head=false)
   - sg SG_IO: at_head=true
   - bsg SG_IO: at_head=true

Some time ago Boaz Harrosh introduced a sg v4 flag called
BSG_FLAG_Q_AT_TAIL to override the bsg driver default.
This patch does the equivalent for the sg driver.

ChangeLog:
     Introduce SG_FLAG_Q_AT_TAIL flag to cause commands
     to be injected into the block layer with
     at_head=false.
Signed-off-by: default avatarDouglas Gilbert <dgilbert@interlog.com>
Reviewed-by: default avatarMike Christie <michaelc@cs.wisc.edu>
Reviewed-by: default avatarEwan D. Milne <emilne@redhat.com>
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
parent 65c26a0f
...@@ -741,7 +741,7 @@ static int ...@@ -741,7 +741,7 @@ static int
sg_common_write(Sg_fd * sfp, Sg_request * srp, sg_common_write(Sg_fd * sfp, Sg_request * srp,
unsigned char *cmnd, int timeout, int blocking) unsigned char *cmnd, int timeout, int blocking)
{ {
int k, data_dir; int k, data_dir, at_head;
Sg_device *sdp = sfp->parentdp; Sg_device *sdp = sfp->parentdp;
sg_io_hdr_t *hp = &srp->header; sg_io_hdr_t *hp = &srp->header;
...@@ -785,11 +785,16 @@ sg_common_write(Sg_fd * sfp, Sg_request * srp, ...@@ -785,11 +785,16 @@ sg_common_write(Sg_fd * sfp, Sg_request * srp,
break; break;
} }
hp->duration = jiffies_to_msecs(jiffies); hp->duration = jiffies_to_msecs(jiffies);
if (hp->interface_id != '\0' && /* v3 (or later) interface */
(SG_FLAG_Q_AT_TAIL & hp->flags))
at_head = 0;
else
at_head = 1;
srp->rq->timeout = timeout; srp->rq->timeout = timeout;
kref_get(&sfp->f_ref); /* sg_rq_end_io() does kref_put(). */ kref_get(&sfp->f_ref); /* sg_rq_end_io() does kref_put(). */
blk_execute_rq_nowait(sdp->device->request_queue, sdp->disk, blk_execute_rq_nowait(sdp->device->request_queue, sdp->disk,
srp->rq, 1, sg_rq_end_io); srp->rq, at_head, sg_rq_end_io);
return 0; return 0;
} }
......
...@@ -86,6 +86,7 @@ typedef struct sg_io_hdr ...@@ -86,6 +86,7 @@ typedef struct sg_io_hdr
#define SG_FLAG_MMAP_IO 4 /* request memory mapped IO */ #define SG_FLAG_MMAP_IO 4 /* request memory mapped IO */
#define SG_FLAG_NO_DXFER 0x10000 /* no transfer of kernel buffers to/from */ #define SG_FLAG_NO_DXFER 0x10000 /* no transfer of kernel buffers to/from */
/* user space (debug indirect IO) */ /* user space (debug indirect IO) */
#define SG_FLAG_Q_AT_TAIL 0x10 /* default is Q_AT_HEAD */
/* following 'info' values are "or"-ed together */ /* following 'info' values are "or"-ed together */
#define SG_INFO_OK_MASK 0x1 #define SG_INFO_OK_MASK 0x1
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment