* [PATCH v4] sg: relax 16 byte cdb restriction
@ 2013-12-01 16:13 Douglas Gilbert
2013-12-17 20:21 ` James Bottomley
0 siblings, 1 reply; 3+ messages in thread
From: Douglas Gilbert @ 2013-12-01 16:13 UTC (permalink / raw)
To: SCSI development list, James Bottomley
[-- Attachment #1: Type: text/plain, Size: 462 bytes --]
ChangeLog:
- remove the 16 byte CDB (SCSI command) length limit
from the sg driver by handling longer CDBs the same
way as the bsg driver. Remove comment from sg.h
public interface about the cmd_len field being
limited to 16 bytes.
- remove some dead code caused by this change
- cleanup comment block at the top of sg.h, fix urls
Signed-off-by: Douglas Gilbert <dgilbert@interlog.com>
[-- Attachment #2: sg_cdb_dg4.patch --]
[-- Type: text/x-patch, Size: 8085 bytes --]
diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c
index 843c66e..2e99a4e 100644
--- a/drivers/scsi/sg.c
+++ b/drivers/scsi/sg.c
@@ -73,6 +73,9 @@ static void sg_proc_cleanup(void);
#define SG_MAX_DEVS 32768
+#define SG_MAX_CDB_SIZE 255 /* ideally should be 260 (spc4r36i 3.1.30)
+ * but limited to unsigned char */
+
/*
* Suppose you want to calculate the formula muldiv(x,m,d)=int(x * m / d)
* Then when using 32 bit integers x * m may overflow during the calculation.
@@ -159,7 +162,7 @@ typedef struct sg_fd { /* holds the state of a file descriptor */
char low_dma; /* as in parent but possibly overridden to 1 */
char force_packid; /* 1 -> pack_id input to read(), 0 -> ignored */
char cmd_q; /* 1 -> allow command queuing, 0 -> don't */
- char next_cmd_len; /* 0 -> automatic (def), >0 -> use on next write() */
+ unsigned char next_cmd_len; /* 0: automatic, >0: use on next write() */
char keep_orphan; /* 0 -> drop orphan (def), 1 -> keep for read() */
char mmap_called; /* 0 -> mmap() never called on this fd */
struct kref f_ref;
@@ -571,7 +574,7 @@ sg_write(struct file *filp, const char __user *buf, size_t count, loff_t * ppos)
Sg_request *srp;
struct sg_header old_hdr;
sg_io_hdr_t *hp;
- unsigned char cmnd[MAX_COMMAND_SIZE];
+ unsigned char cmnd[SG_MAX_CDB_SIZE];
if ((!(sfp = (Sg_fd *) filp->private_data)) || (!(sdp = sfp->parentdp)))
return -ENXIO;
@@ -603,13 +606,6 @@ sg_write(struct file *filp, const char __user *buf, size_t count, loff_t * ppos)
buf += SZ_SG_HEADER;
__get_user(opcode, buf);
if (sfp->next_cmd_len > 0) {
- if (sfp->next_cmd_len > MAX_COMMAND_SIZE) {
- SG_LOG(1, pr_info("%s: command length too long\n",
- __func__));
- sfp->next_cmd_len = 0;
- sg_remove_request(sfp, srp);
- return -EIO;
- }
cmd_size = sfp->next_cmd_len;
sfp->next_cmd_len = 0; /* reset so only this write() effected */
} else {
@@ -681,7 +677,7 @@ sg_new_write(Sg_fd *sfp, struct file *file, const char __user *buf,
int k;
Sg_request *srp;
sg_io_hdr_t *hp;
- unsigned char cmnd[MAX_COMMAND_SIZE];
+ unsigned char cmnd[SG_MAX_CDB_SIZE];
int timeout;
unsigned long ul_timeout;
@@ -1657,13 +1653,23 @@ static int sg_start_req(Sg_request *srp, unsigned char *cmd)
struct request_queue *q = sfp->parentdp->device->request_queue;
struct rq_map_data *md, map_data;
int rw = hp->dxfer_direction == SG_DXFER_TO_DEV ? WRITE : READ;
+ unsigned char *long_cmdp = NULL;
SG_LOG(4, pr_info("%s: dxfer_len=%d\n", __func__, dxfer_len));
+ if (hp->cmd_len > BLK_MAX_CDB) {
+ long_cmdp = kzalloc(hp->cmd_len, GFP_KERNEL);
+ if (!long_cmdp)
+ return -ENOMEM;
+ }
rq = blk_get_request(q, rw, GFP_ATOMIC);
- if (!rq)
+ if (!rq) {
+ kfree(long_cmdp);
return -ENOMEM;
+ }
+ if (hp->cmd_len > BLK_MAX_CDB)
+ rq->cmd = long_cmdp;
memcpy(rq->cmd, cmd, hp->cmd_len);
rq->cmd_len = hp->cmd_len;
@@ -1750,6 +1756,8 @@ static int sg_finish_rem_req(Sg_request * srp)
if (srp->bio)
ret = blk_rq_unmap_user(srp->bio);
+ if (srp->rq->cmd != srp->rq->__cmd)
+ kfree(srp->rq->cmd);
blk_put_request(srp->rq);
}
diff --git a/include/scsi/sg.h b/include/scsi/sg.h
index a9f3c6f..425eda96 100644
--- a/include/scsi/sg.h
+++ b/include/scsi/sg.h
@@ -4,77 +4,34 @@
#include <linux/compiler.h>
/*
- History:
- Started: Aug 9 by Lawrence Foard (entropy@world.std.com), to allow user
- process control of SCSI devices.
- Development Sponsored by Killy Corp. NY NY
-Original driver (sg.h):
-* Copyright (C) 1992 Lawrence Foard
-Version 2 and 3 extensions to driver:
-* Copyright (C) 1998 - 2006 Douglas Gilbert
-
- Version: 3.5.34 (20060920)
- This version is for 2.6 series kernels.
-
- For a full changelog see http://www.torque.net/sg
-
-Map of SG verions to the Linux kernels in which they appear:
- ---------- ----------------------------------
- original all kernels < 2.2.6
- 2.1.40 2.2.20
- 3.0.x optional version 3 sg driver for 2.2 series
- 3.1.17++ 2.4.0++
- 3.5.30++ 2.6.0++
-
-Major new features in SG 3.x driver (cf SG 2.x drivers)
- - SG_IO ioctl() combines function if write() and read()
- - new interface (sg_io_hdr_t) but still supports old interface
- - scatter/gather in user space, direct IO, and mmap supported
-
- The normal action of this driver is to use the adapter (HBA) driver to DMA
- data into kernel buffers and then use the CPU to copy the data into the
- user space (vice versa for writes). That is called "indirect" IO due to
- the double handling of data. There are two methods offered to remove the
- redundant copy: 1) direct IO and 2) using the mmap() system call to map
- the reserve buffer (this driver has one reserve buffer per fd) into the
- user space. Both have their advantages.
- In terms of absolute speed mmap() is faster. If speed is not a concern,
- indirect IO should be fine. Read the documentation for more information.
-
- ** N.B. To use direct IO 'echo 1 > /proc/scsi/sg/allow_dio' or
- 'echo 1 > /sys/module/sg/parameters/allow_dio' is needed.
- That attribute is 0 by default. **
-
- Historical note: this SCSI pass-through driver has been known as "sg" for
- a decade. In broader kernel discussions "sg" is used to refer to scatter
- gather techniques. The context should clarify which "sg" is referred to.
-
- Documentation
- =============
- A web site for the SG device driver can be found at:
- http://www.torque.net/sg [alternatively check the MAINTAINERS file]
- The documentation for the sg version 3 driver can be found at:
- http://www.torque.net/sg/p/sg_v3_ho.html
- This is a rendering from DocBook source [change the extension to "sgml"
- or "xml"]. There are renderings in "ps", "pdf", "rtf" and "txt" (soon).
- The SG_IO ioctl is now found in other parts kernel (e.g. the block layer).
- For more information see http://www.torque.net/sg/sg_io.html
-
- The older, version 2 documents discuss the original sg interface in detail:
- http://www.torque.net/sg/p/scsi-generic.txt
- http://www.torque.net/sg/p/scsi-generic_long.txt
- Also available: <kernel_source>/Documentation/scsi/scsi-generic.txt
-
- Utility and test programs are available at the sg web site. They are
- packaged as sg3_utils (for the lk 2.4 and 2.6 series) and sg_utils
- (for the lk 2.2 series).
-*/
+ * History:
+ * Started: Aug 9 by Lawrence Foard (entropy@world.std.com), to allow user
+ * process control of SCSI devices.
+ * Development Sponsored by Killy Corp. NY NY
+ *
+ * Original driver (sg.h):
+ * Copyright (C) 1992 Lawrence Foard
+ * Version 2 and 3 extensions to driver:
+ * Copyright (C) 1998 - 2013 Douglas Gilbert
+ *
+ * Version: 3.5.35 (20131111)
+ * This version is for 2.6 and 3 series kernels.
+ *
+ * Documentation
+ * =============
+ * A web site for the SG device driver can be found at:
+ * http://sg.danny.cz/sg [alternatively check the MAINTAINERS file]
+ * The documentation for the sg version 3 driver can be found at:
+ * http://sg.danny.cz/sg/p/sg_v3_ho.html
+ * Also see: <kernel_source>/Documentation/scsi/scsi-generic.txt
+ *
+ * For utility and test programs see: http://sg.danny.cz/sg/sg3_utils.html
+ */
#ifdef __KERNEL__
extern int sg_big_buff; /* for sysctl */
#endif
-/* New interface introduced in the 3.x SG drivers follows */
typedef struct sg_iovec /* same structure as used by readv() Linux system */
{ /* call. It defines one scatter-gather element. */
@@ -87,7 +44,7 @@ typedef struct sg_io_hdr
{
int interface_id; /* [i] 'S' for SCSI generic (required) */
int dxfer_direction; /* [i] data transfer direction */
- unsigned char cmd_len; /* [i] SCSI command length ( <= 16 bytes) */
+ unsigned char cmd_len; /* [i] SCSI command length */
unsigned char mx_sb_len; /* [i] max length to write to sbp */
unsigned short iovec_count; /* [i] 0 implies no scatter gather */
unsigned int dxfer_len; /* [i] byte count of data transfer */
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH v4] sg: relax 16 byte cdb restriction
2013-12-01 16:13 [PATCH v4] sg: relax 16 byte cdb restriction Douglas Gilbert
@ 2013-12-17 20:21 ` James Bottomley
2013-12-17 21:53 ` Douglas Gilbert
0 siblings, 1 reply; 3+ messages in thread
From: James Bottomley @ 2013-12-17 20:21 UTC (permalink / raw)
To: dgilbert; +Cc: SCSI development list
On Sun, 2013-12-01 at 17:13 +0100, Douglas Gilbert wrote:
> ChangeLog:
> - remove the 16 byte CDB (SCSI command) length limit
> from the sg driver by handling longer CDBs the same
> way as the bsg driver. Remove comment from sg.h
> public interface about the cmd_len field being
> limited to 16 bytes.
> - remove some dead code caused by this change
> - cleanup comment block at the top of sg.h, fix urls
>
> Signed-off-by: Douglas Gilbert <dgilbert@interlog.com>
This doesn't apply:
patching file drivers/scsi/sg.c
Hunk #1 succeeded at 74 (offset 1 line).
Hunk #2 succeeded at 164 (offset 2 lines).
Hunk #3 succeeded at 569 (offset -5 lines).
Hunk #4 FAILED at 606.
Hunk #5 succeeded at 678 (offset -6 lines).
Hunk #6 FAILED at 1660.
Hunk #7 succeeded at 1742 (offset -11 lines).
2 out of 7 hunks FAILED -- saving rejects to file drivers/scsi/sg.c.rej
It looks like there's a missing intermediate patch changing the way
logging is done within the driver ... I don't recall seeing such a patch
on the list.
James
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH v4] sg: relax 16 byte cdb restriction
2013-12-17 20:21 ` James Bottomley
@ 2013-12-17 21:53 ` Douglas Gilbert
0 siblings, 0 replies; 3+ messages in thread
From: Douglas Gilbert @ 2013-12-17 21:53 UTC (permalink / raw)
To: James Bottomley; +Cc: SCSI development list
On 13-12-17 03:21 PM, James Bottomley wrote:
> On Sun, 2013-12-01 at 17:13 +0100, Douglas Gilbert wrote:
>> ChangeLog:
>> - remove the 16 byte CDB (SCSI command) length limit
>> from the sg driver by handling longer CDBs the same
>> way as the bsg driver. Remove comment from sg.h
>> public interface about the cmd_len field being
>> limited to 16 bytes.
>> - remove some dead code caused by this change
>> - cleanup comment block at the top of sg.h, fix urls
>>
>> Signed-off-by: Douglas Gilbert <dgilbert@interlog.com>
>
> This doesn't apply:
>
> patching file drivers/scsi/sg.c
> Hunk #1 succeeded at 74 (offset 1 line).
> Hunk #2 succeeded at 164 (offset 2 lines).
> Hunk #3 succeeded at 569 (offset -5 lines).
> Hunk #4 FAILED at 606.
> Hunk #5 succeeded at 678 (offset -6 lines).
> Hunk #6 FAILED at 1660.
> Hunk #7 succeeded at 1742 (offset -11 lines).
> 2 out of 7 hunks FAILED -- saving rejects to file drivers/scsi/sg.c.rej
>
> It looks like there's a missing intermediate patch changing the way
> logging is done within the driver ... I don't recall seeing such a patch
> on the list.
It based on this patch:
http://www.spinics.net/lists/linux-scsi/msg69957.html
sent to the list on 12 November titled:
[PATCH v3] sg: O_EXCL and other lock handling
and it was followed in the same day by:
[PATCH v3] sg: relax 16 byte cdb restriction
which you commented on, hence "v4" that started this thread.
The vagueness in the "O_EXCL" post about the reported failure
in the vicinity of sg_remove() was cleared up a few days later
by this post:
http://www.spinics.net/lists/linux-scsi/msg70006.html
You might check if the fix to the st driver for this matter has
made it into your tree or further.
I'm told the "O_EXCL" patch has been tested by a major vendor
with help from another frequent correspondent to this list.
Doug Gilbert
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2013-12-17 21:53 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-12-01 16:13 [PATCH v4] sg: relax 16 byte cdb restriction Douglas Gilbert
2013-12-17 20:21 ` James Bottomley
2013-12-17 21:53 ` Douglas Gilbert
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).