Commit 16070cc189c5e343696c29c8cff779e692cfcb8d

Authored by Douglas Gilbert
Committed by Christoph Hellwig
1 parent 65c26a0f39

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: Douglas Gilbert <dgilbert@interlog.com>
Reviewed-by: Mike Christie <michaelc@cs.wisc.edu>
Reviewed-by: Ewan D. Milne <emilne@redhat.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>

Showing 2 changed files with 8 additions and 2 deletions Side-by-side Diff

... ... @@ -741,7 +741,7 @@
741 741 sg_common_write(Sg_fd * sfp, Sg_request * srp,
742 742 unsigned char *cmnd, int timeout, int blocking)
743 743 {
744   - int k, data_dir;
  744 + int k, data_dir, at_head;
745 745 Sg_device *sdp = sfp->parentdp;
746 746 sg_io_hdr_t *hp = &srp->header;
747 747  
748 748  
... ... @@ -785,11 +785,16 @@
785 785 break;
786 786 }
787 787 hp->duration = jiffies_to_msecs(jiffies);
  788 + if (hp->interface_id != '\0' && /* v3 (or later) interface */
  789 + (SG_FLAG_Q_AT_TAIL & hp->flags))
  790 + at_head = 0;
  791 + else
  792 + at_head = 1;
788 793  
789 794 srp->rq->timeout = timeout;
790 795 kref_get(&sfp->f_ref); /* sg_rq_end_io() does kref_put(). */
791 796 blk_execute_rq_nowait(sdp->device->request_queue, sdp->disk,
792   - srp->rq, 1, sg_rq_end_io);
  797 + srp->rq, at_head, sg_rq_end_io);
793 798 return 0;
794 799 }
795 800  
... ... @@ -86,6 +86,7 @@
86 86 #define SG_FLAG_MMAP_IO 4 /* request memory mapped IO */
87 87 #define SG_FLAG_NO_DXFER 0x10000 /* no transfer of kernel buffers to/from */
88 88 /* user space (debug indirect IO) */
  89 +#define SG_FLAG_Q_AT_TAIL 0x10 /* default is Q_AT_HEAD */
89 90  
90 91 /* following 'info' values are "or"-ed together */
91 92 #define SG_INFO_OK_MASK 0x1