All of lore.kernel.org
 help / color / mirror / Atom feed
From: Boaz Harrosh <bharrosh@panasas.com>
To: James Bottomley <James.Bottomley@HansenPartnership.com>
Cc: Jens Axboe <jens.axboe@oracle.com>,
	Christoph Hellwig <hch@infradead.org>,
	linux-scsi <linux-scsi@vger.kernel.org>,
	Andrew Morton <akpm@linux-foundation.org>
Subject: [PATCH 2/3 ver2] block layer extended-cdb support
Date: Thu, 03 Apr 2008 21:32:06 +0300	[thread overview]
Message-ID: <47F522A6.3080806@panasas.com> (raw)
In-Reply-To: <1207240982.3048.45.camel@localhost.localdomain>

James Bottomley wrote:
> On Tue, 2008-03-25 at 18:32 +0200, Boaz Harrosh wrote:
>> - add varlen_cdb and varlen_cdb_len to hold a large user cdb
>>   if needed. They start as empty. Allocation of buffer must
>>   be done by user and held until request execution is done.
>> - Since there can be either a fix_length command up to 16 bytes
>>   or a variable_length, larger then 16 bytes, commands but never
>>   both, we hold the two types in a union to save space. The
>>   presence of varlen_cdb_len and cmd_len==0 signals a varlen_cdb
>>   mode.
>> - Please use added rq_{set,get}_varlen_cdb() to set every thing
>>   up in a way that will not confuse drivers that do not support
>>   varlen_cdb's.
>> - Note that this patch does not add any size to struct request
>>   since the unsigned cmd_len is split here to 2 ushorts, which
>>   is more then enough.
> 
> My first observation is that the block stuff all looks a bit
> misnamed ... it's not about variable length commands it's about getting
> block to accept packet commands larger than BLK_MAX_CDB, be they SCSI
> OSD commands or ATA taskfiles.
> 
>> Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
>> ---
>>  block/blk-core.c       |    2 ++
>>  include/linux/blkdev.h |   27 +++++++++++++++++++++++++--
>>  2 files changed, 27 insertions(+), 2 deletions(-)
>>
>> diff --git a/block/blk-core.c b/block/blk-core.c
>> index 2a438a9..70d32f7 100644
>> --- a/block/blk-core.c
>> +++ b/block/blk-core.c
>> @@ -141,6 +141,8 @@ void rq_init(struct request_queue *q, struct request *rq)
>>  	rq->end_io = NULL;
>>  	rq->end_io_data = NULL;
>>  	rq->next_rq = NULL;
>> +	rq->varlen_cdb_len = 0;
>> +	rq->varlen_cdb = NULL;
> 
> possibly s/varlen/large/
> 
>>  }
>>  
>>  static void req_bio_endio(struct request *rq, struct bio *bio,
>> diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
>> index 6f79d40..f829571 100644
>> --- a/include/linux/blkdev.h
>> +++ b/include/linux/blkdev.h
>> @@ -213,8 +213,15 @@ struct request {
>>  	/*
>>  	 * when request is used as a packet command carrier
>>  	 */
>> -	unsigned int cmd_len;
>> -	unsigned char cmd[BLK_MAX_CDB];
>> +	unsigned short cmd_len;
>> +	unsigned short varlen_cdb_len;  /* length of varlen_cdb buffer */
>> +	union {
>> +		unsigned char cmd[BLK_MAX_CDB];
>> +		unsigned char *varlen_cdb;/* an optional variable-length cdb.
>> +	                                   * points to a user buffer that must
>> +	                                   * be valid until end of request
>> +	                                   */
> 
> again s/varlen/large/
> 
>> +	};
>>  
>>  	unsigned int data_len;
>>  	unsigned int extra_len;	/* length of alignment and padding */
>> @@ -484,6 +491,22 @@ enum {
>>  #define rq_is_sync(rq)		(rq_data_dir((rq)) == READ || (rq)->cmd_flags & REQ_RW_SYNC)
>>  #define rq_is_meta(rq)		((rq)->cmd_flags & REQ_RW_META)
>>  
>> +static inline void rq_set_varlen_cdb(struct request *rq, u8 *cdb, short cdb_len)
>> +{
>> +	rq->cmd_len = 0; /* Make sure legacy drivers don't get confused */
>> +	rq->varlen_cdb_len = cdb_len;
>> +	rq->varlen_cdb = cdb;
>> +}
>> +
>> +/* If ! a varlen_cdb than return NULL */
>> +static inline u8 *rq_get_varlen_cdb(struct request *rq)
>> +{
>> +	if (!rq->cmd_len && rq->varlen_cdb_len)
>> +		return rq->varlen_cdb;
>> +	else
>> +		return NULL;
>> +}
> 
> These accessors look wrong ... I think what we want is rq_get_cdb and
> rq_set_cdb that handles both <= BLK_MAX_CDB by simply a memcpy and >
> BLK_MAX_CDB by setting up the large_cdb pointer.  That way we can
> accessorize the whole lot and the drivers don't have to care about what
> BLK_MAX_CDB is set to (it simply becomes an internal convenience of
> block ... and possibly allows us to eliminate the request carries
> command data entirely).
> 
>>  static inline int blk_queue_full(struct request_queue *q, int rw)
>>  {
>>  	if (rw == READ)
> 
> James
> 
> 

Thanks James for your review.

With taking Benny's comments into account also, perhaps this is what you meant
(untested, for review, third patch is missing still)

Boaz
---
>From 1da591a5ef9697f37604721bfe437a2609bb8217 Mon Sep 17 00:00:00 2001
From: Boaz Harrosh <bharrosh@panasas.com>
Date: Wed, 31 Oct 2007 14:56:09 +0200
Subject: [PATCH] block layer extended-cdb support

  - add ext_cdb and ext_cdb_len to hold a large external cdb
    if needed. They start as empty. Allocation of buffer must
    be done by user and held until request execution is done.
  - Since there can be either a fix_length command up to 16 bytes
    or an external extended command but never both, we hold the two
    types in a union to save space. The presence of ext_cdb_len!=0
    and cmd_len==0 signals an ext_cdb mode.
  - Use new rq_set_cdb() to set everything up in a way that will
    not confuse drivers that do not support extended cdb's.
  - Use rq_get_cdb()/rq_get_cdb_len() to retrieve command and length
    in a generic way.
  - Once all drivers and users convert to the new accessors the cmd[]
    16 bytes buffer can be discarded.
  - Note that this patch does not add any size to struct request
    since the unsigned cmd_len is split here to 2 ushorts, which
    is more then enough.

Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
---
 block/blk-core.c       |    2 ++
 include/linux/blkdev.h |   41 +++++++++++++++++++++++++++++++++++++++--
 2 files changed, 41 insertions(+), 2 deletions(-)

diff --git a/block/blk-core.c b/block/blk-core.c
index 2a438a9..cc9a790 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -141,6 +141,8 @@ void rq_init(struct request_queue *q, struct request *rq)
 	rq->end_io = NULL;
 	rq->end_io_data = NULL;
 	rq->next_rq = NULL;
+	rq->ext_cdb_len = 0;
+	rq->ext_cdb = NULL;
 }
 
 static void req_bio_endio(struct request *rq, struct bio *bio,
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
index 6f79d40..2f87c9d 100644
--- a/include/linux/blkdev.h
+++ b/include/linux/blkdev.h
@@ -213,8 +213,15 @@ struct request {
 	/*
 	 * when request is used as a packet command carrier
 	 */
-	unsigned int cmd_len;
-	unsigned char cmd[BLK_MAX_CDB];
+	unsigned short cmd_len;
+	unsigned short ext_cdb_len;  /* length of ext_cdb buffer */
+	union {
+		unsigned char cmd[BLK_MAX_CDB];
+		unsigned char *ext_cdb;/* an optional extended cdb.
+	                                   * points to a user buffer that must
+	                                   * be valid until end of request
+	                                   */
+	};
 
 	unsigned int data_len;
 	unsigned int extra_len;	/* length of alignment and padding */
@@ -484,6 +491,36 @@ enum {
 #define rq_is_sync(rq)		(rq_data_dir((rq)) == READ || (rq)->cmd_flags & REQ_RW_SYNC)
 #define rq_is_meta(rq)		((rq)->cmd_flags & REQ_RW_META)
 
+static inline void rq_set_cdb(struct request *rq, u8 *cdb, short cdb_len)
+{
+	if (cdb_len <= BLK_MAX_CDB) {
+		memcpy(rq->cmd, cdb, cdb_len);
+		rq->cmd_len = cdb_len;
+		rq->ext_cdb_len = 0;
+	}
+	else {
+		rq->cmd_len = 0; /*Make sure legacy drivers don't get confused*/
+		rq->ext_cdb_len = cdb_len;
+		rq->ext_cdb = cdb;
+	}
+}
+
+static inline u8 *rq_get_cdb(struct request *rq)
+{
+	if (!rq->cmd_len && rq->ext_cdb_len)
+		return rq->ext_cdb;
+	else
+		return rq->cmd;
+}
+
+static inline unsigned short rq_get_cdb_len(struct request *rq)
+{
+	if (!rq->cmd_len && rq->ext_cdb_len)
+		return rq->ext_cdb_len;
+	else
+		return rq->cmd_len;
+}
+
 static inline int blk_queue_full(struct request_queue *q, int rw)
 {
 	if (rw == READ)
-- 
1.5.3.3


  parent reply	other threads:[~2008-04-03 18:33 UTC|newest]

Thread overview: 76+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-03-25 16:21 [PATCHSET 0/3] Is it time for varlen extended and vendor-specific cdbs Boaz Harrosh
2008-03-25 16:22 ` [PATCH] Let scsi_cmnd->cmnd use request->cmd buffer Boaz Harrosh
2008-03-25 16:32 ` [PATCH 2/3] block layer varlen-cdb Boaz Harrosh
2008-04-03 16:43   ` James Bottomley
2008-04-03 17:26     ` Benny Halevy
2008-04-03 18:32     ` Boaz Harrosh [this message]
2008-04-04 11:46       ` [PATCH 2/3 ver2] block layer extended-cdb support Jens Axboe
2008-04-06  9:35         ` Boaz Harrosh
2008-04-06 11:05           ` Boaz Harrosh
2008-04-07  8:31             ` Jens Axboe
2008-04-12  5:52           ` FUJITA Tomonori
2008-04-13  9:13             ` Boaz Harrosh
2008-04-13 16:17               ` FUJITA Tomonori
2008-04-13 16:50                 ` Boaz Harrosh
2008-04-14  9:49                   ` [PATCH 2/3 ver3] " Boaz Harrosh
2008-04-14 11:04                     ` FUJITA Tomonori
2008-04-14 11:28                       ` Boaz Harrosh
2008-04-14 12:08                         ` FUJITA Tomonori
2008-04-14 12:22                           ` Boaz Harrosh
2008-04-14 11:04                   ` [PATCH 2/3 ver2] " FUJITA Tomonori
2008-04-14 10:50                 ` [PATCH 0/4] add large command support to the block layer FUJITA Tomonori
2008-04-14 10:50                   ` [PATCH 1/4] block: no need to initialize rq->cmd in prepare_flush_fn hook FUJITA Tomonori
2008-04-14 10:50                     ` [PATCH 2/4] block: no need to initialize rq->cmd with blk_get_request FUJITA Tomonori
2008-04-14 10:50                       ` [PATCH 3/4] block: replace sizeof(rq->cmd) with BLK_MAX_CDB FUJITA Tomonori
2008-04-14 10:50                         ` [PATCH 4/4] block: add large command support FUJITA Tomonori
2008-04-14 11:29                           ` Jens Axboe
2008-04-14 12:08                             ` FUJITA Tomonori
2008-04-15 22:50                             ` Bartlomiej Zolnierkiewicz
2008-04-15 22:57                               ` FUJITA Tomonori
2008-04-16  0:22                                 ` Bartlomiej Zolnierkiewicz
2008-04-16  8:33                                 ` Jens Axboe
2008-04-16  9:08                                   ` Boaz Harrosh
2008-04-16  9:42                                     ` Jens Axboe
2008-04-16 22:28                                       ` Bartlomiej Zolnierkiewicz
2008-04-17  3:59                                     ` FUJITA Tomonori
2008-04-17  7:07                                       ` Jens Axboe
2008-04-17 11:55                                         ` Bartlomiej Zolnierkiewicz
2008-04-17 11:58                                           ` Bartlomiej Zolnierkiewicz
2008-04-17 12:07                                         ` FUJITA Tomonori
2008-04-17  4:02                                   ` FUJITA Tomonori
2008-04-14 14:41                           ` Pete Wyckoff
2008-04-14 22:33                             ` FUJITA Tomonori
2008-04-15 13:44                               ` Pete Wyckoff
2008-04-15  7:45                             ` Boaz Harrosh
2008-04-15 10:05                               ` FUJITA Tomonori
2008-04-15  7:29                           ` Jens Axboe
2008-04-14 11:21                   ` [PATCH 0/4] add large command support to the block layer FUJITA Tomonori
2008-04-14 11:38                   ` Boaz Harrosh
2008-04-14 12:36                     ` Boaz Harrosh
2008-04-14 13:06                       ` FUJITA Tomonori
2008-04-15 12:24                   ` [PATCH 0/3] scsi: variable-length CDBs support Boaz Harrosh
2008-04-15 12:30                     ` [PATCH 1/3] Let scsi_cmnd->cmnd use request->cmd buffer Boaz Harrosh
2008-04-15 12:34                     ` [PATCH 2/3] scsi: varlen extended and vendor-specific cdbs Boaz Harrosh
2008-04-16  2:09                       ` FUJITA Tomonori
2008-04-16  6:40                         ` Boaz Harrosh
2008-04-16  6:49                           ` [PATCH 2/3 ver2] " Boaz Harrosh
2008-04-17  4:01                           ` [PATCH 2/3] " FUJITA Tomonori
2008-04-17 12:25                             ` [PATCH 2/3 ver3] " Boaz Harrosh
2008-04-17 12:49                               ` Boaz Harrosh
2008-04-17 13:04                               ` FUJITA Tomonori
2008-04-17 13:29                                 ` Boaz Harrosh
2008-04-15 12:37                     ` [PATCH 3/3] iscsi_tcp: Enable large commands Boaz Harrosh
2008-04-15 13:08                       ` James Smart
2008-04-15 13:38                         ` Boaz Harrosh
2008-04-15 13:57                           ` Benny Halevy
2008-04-15 13:46                         ` FUJITA Tomonori
2008-04-13 14:07             ` [PATCH 2/3 ver2] block layer extended-cdb support James Bottomley
2008-04-13 16:17               ` FUJITA Tomonori
2008-03-25 16:36 ` [PATCH 3/3] scsi: varlen extended and vendor-specific cdbs Boaz Harrosh
2008-04-03 16:07 ` [PATCHSET 0/3] Is it time for " Boaz Harrosh
2008-04-13 16:30 ` [PATCHSET 0/4 ver2] " Boaz Harrosh
2008-04-13 16:37   ` [PATCH 1/4] Let scsi_cmnd->cmnd use request->cmd buffer Boaz Harrosh
2008-04-13 16:39   ` [PATCH 2/4] block layer extended-cdb support Boaz Harrosh
2008-04-13 16:39   ` [PATCH 3/4] scsi: varlen extended and vendor-specific cdbs Boaz Harrosh
2008-04-13 16:41   ` [PATCH 4/4] iscsi_tcp: Enable large command Boaz Harrosh
2008-04-18 17:11     ` Mike Christie

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=47F522A6.3080806@panasas.com \
    --to=bharrosh@panasas.com \
    --cc=James.Bottomley@HansenPartnership.com \
    --cc=akpm@linux-foundation.org \
    --cc=hch@infradead.org \
    --cc=jens.axboe@oracle.com \
    --cc=linux-scsi@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.