On Thu, Nov 08 2007 at 5:14 +0200, FUJITA Tomonori <[EMAIL PROTECTED]> wrote:
> On Tue, 06 Nov 2007 20:19:32 +0200
> Boaz Harrosh <[EMAIL PROTECTED]> wrote:
>
<snip>
>
> Hmm, checkpatch.pl complains reasonably:
>
> ./scripts/checkpatch.pl ~/Mail/kernel/scsi/28815
> ERROR: use tabs not spaces
> #177: FILE: drivers/scsi/scsi_error.c:629:
> +^I^I scmd->sdb.length);$
>
> ERROR: use tabs not spaces
> #237: FILE: drivers/scsi/scsi_lib.c:741:
> + unsigned short sg_count, gfp_t
> gfp_mask)$
>
> WARNING: no space between function name and open parenthesis '('
> #487: FILE: drivers/scsi/sr.c:377:
> + scsi_for_each_sg (SCpnt, sg, sg_count, i)
>
> ERROR: "foo* bar" should be "foo *bar"
> #563: FILE: include/scsi/scsi_cmnd.h:20:
> + struct scatterlist* sglist;
>
> total: 3 errors, 1 warnings, 482 lines checked
I think that checkpatch is wrong in two accounts.
1. Tabs are used for "Indents" not "align-to-the-right".
All above have 0 indent and are right aligned for
readability.
2. check patch should be fixed that if a macro is followed
by a "{" it means a control block and not a function-call/
macro-expansion, and a space is recommended.
(Like: for, if, while ...)
But I don't mind. I'll change all in a fixing patch.
>
>
<snip>
>> @@ -821,24 +820,24 @@ enomem:
>>
>> mempool_free(prev, sgp->pool);
>> }
>> - return NULL;
>> + return -1;
>
> I think that -ENOMEM is better. The other functions in scsi_lib.c
> (even static functions) use proper error values.
>
>
will fix, thanks.
<snip>
>> - /*
>> - * If sg table allocation fails, requeue request later.
>> - */
>> - cmd->request_buffer = scsi_alloc_sgtable(cmd, gfp_mask);
>> - if (unlikely(!cmd->request_buffer)) {
>> + if (scsi_alloc_sgtable(sdb, req->nr_phys_segments, gfp_mask)) {
>
> IIRC, preferable style is:
>
> ret = scsi_alloc_sgtable(sdb, req->nr_phys_segments, gfp_mask);
> if (ret) {
>
>
It is more readable I agree, but I did not want to allocate one more
stack variable just for the if(), since I am returning a BLKPREP_DEFER
any way. I am not using ret for anything else.
>> scsi_unprep_request(req);
>> return BLKPREP_DEFER;
>> }
>>
>> req->buffer = NULL;
>> if (blk_pc_request(req))
>> - cmd->request_bufflen = req->data_len;
>> + sdb->length = req->data_len;
>> else
>> - cmd->request_bufflen = req->nr_sectors << 9;
>> + sdb->length = req->nr_sectors << 9;
>>
>> /*
>> * Next, walk the list, and fill in the addresses and sizes of
>> * each segment.
>> */
>> - count = blk_rq_map_sg(req->q, req, cmd->request_buffer);
>> - if (likely(count <= cmd->use_sg)) {
>> - cmd->use_sg = count;
>> + count = blk_rq_map_sg(req->q, req, sdb->sglist);
>> + if (likely(count <= sdb->sg_count)) {
>> + sdb->sg_count = count;
>> return BLKPREP_OK;
>> }
>>
>> printk(KERN_ERR "Incorrect number of segments after building list\n");
>> - printk(KERN_ERR "counted %d, received %d\n", count, cmd->use_sg);
>> + printk(KERN_ERR "counted %d, received %d\n", count, sdb->sg_count);
>> printk(KERN_ERR "req nr_sec %lu, cur_nr_sec %u\n", req->nr_sectors,
>> req->current_nr_sectors);
>>
>> @@ -1199,9 +1182,7 @@ int scsi_setup_blk_pc_cmnd(struct scsi_device *sdev,
>> struct request *req)
>> BUG_ON(req->data_len);
>> BUG_ON(req->data);
>>
>> - cmd->request_bufflen = 0;
>> - cmd->request_buffer = NULL;
>> - cmd->use_sg = 0;
>> + memset(&cmd->sdb, 0, sizeof(cmd->sdb));
>> req->buffer = NULL;
>> }
>>
>> diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
>> index 18343a6..28cf6fe 100644
>> --- a/drivers/scsi/sd.c
>> +++ b/drivers/scsi/sd.c
>> @@ -448,9 +448,6 @@ static int sd_prep_fn(struct request_queue *q, struct
>> request *rq)
>> } else if (rq_data_dir(rq) == READ) {
>> SCpnt->cmnd[0] = READ_6;
>> SCpnt->sc_data_direction = DMA_FROM_DEVICE;
>> - } else {
>> - scmd_printk(KERN_ERR, SCpnt, "Unknown command %x\n",
>> rq->cmd_flags);
>> - goto out;
>
> This should go to the bidi patch?
>
>> }
>>
This is just a dead code cleanup. It is got nothing to do with bidi or
scsi_data_buffer
for that matter. It could be in it's own patch, but surly it will not go into
the bidi
patch. I will submit a new patch just for that code. Independent of these.
(I was hoping to save the extra effort)
>> SCSI_LOG_HLQUEUE(2, scmd_printk(KERN_INFO, SCpnt,
>> @@ -510,7 +507,7 @@ static int sd_prep_fn(struct request_queue *q, struct
>> request *rq)
>> SCpnt->cmnd[4] = (unsigned char) this_count;
>> SCpnt->cmnd[5] = 0;
>> }
>> - SCpnt->request_bufflen = this_count * sdp->sector_size;
>> + SCpnt->sdb.length = this_count * sdp->sector_size;
>>
>> /*
>> * We shouldn't disconnect in the middle of a sector, so with a dumb
>> @@ -910,7 +907,7 @@ static struct block_device_operations sd_fops = {
>> static int sd_done(struct scsi_cmnd *SCpnt)
>> {
>> int result = SCpnt->result;
>> - unsigned int xfer_size = SCpnt->request_bufflen;
>> + unsigned int xfer_size = scsi_bufflen(SCpnt);
>> unsigned int good_bytes = result ? 0 : xfer_size;
>> u64 start_lba = SCpnt->request->sector;
>> u64 bad_lba;
>> diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c
>> index 7702681..6d3bf41 100644
>> --- a/drivers/scsi/sr.c
>> +++ b/drivers/scsi/sr.c
>> @@ -226,7 +226,7 @@ out:
>> static int sr_done(struct scsi_cmnd *SCpnt)
>> {
>> int result = SCpnt->result;
>> - int this_count = SCpnt->request_bufflen;
>> + int this_count = scsi_bufflen(SCpnt);
>> int good_bytes = (result == 0 ? this_count : 0);
>> int block_sectors = 0;
>> long error_sector;
>> @@ -368,23 +368,21 @@ static int sr_prep_fn(struct request_queue *q, struct
>> request *rq)
>> } else if (rq_data_dir(rq) == READ) {
>> SCpnt->cmnd[0] = READ_10;
>> SCpnt->sc_data_direction = DMA_FROM_DEVICE;
>> - } else {
>> - blk_dump_rq_flags(rq, "Unknown sr command");
>> - goto out;
>
> Ditto.
>
Ditto
>
>> }
>>
>> {
>> - struct scatterlist *sg = SCpnt->request_buffer;
>> - int i, size = 0;
>> - for (i = 0; i < SCpnt->use_sg; i++)
>> - size += sg[i].length;
>> + struct scatterlist *sg;
>> + int i, size = 0, sg_count = scsi_sg_count(SCpnt);
>> +
>> + scsi_for_each_sg (SCpnt, sg, sg_count, i)
>> + size += sg->length;
>>
>> - if (size != SCpnt->request_bufflen && SCpnt->use_sg) {
>> + if (size != scsi_bufflen(SCpnt)) {
>> scmd_printk(KERN_ERR, SCpnt,
>> "mismatch count %d, bytes %d\n",
>> - size, SCpnt->request_bufflen);
>> - if (SCpnt->request_bufflen > size)
>> - SCpnt->request_bufflen = size;
>> + size, scsi_bufflen(SCpnt));
>> + if (scsi_bufflen(SCpnt) > size)
>> + SCpnt->sdb.length = size;
>> }
>> }
>>
>> @@ -392,12 +390,12 @@ static int sr_prep_fn(struct request_queue *q, struct
>> request *rq)
>> * request doesn't start on hw block boundary, add scatter pads
>> */
>> if (((unsigned int)rq->sector % (s_size >> 9)) ||
>> - (SCpnt->request_bufflen % s_size)) {
>> + (scsi_bufflen(SCpnt) % s_size)) {
>> scmd_printk(KERN_NOTICE, SCpnt, "unaligned transfer\n");
>> goto out;
>> }
>>
>> - this_count = (SCpnt->request_bufflen >> 9) / (s_size >> 9);
>> + this_count = (scsi_bufflen(SCpnt) >> 9) / (s_size >> 9);
>>
>>
>> SCSI_LOG_HLQUEUE(2, printk("%s : %s %d/%ld 512 byte blocks.\n",
>> @@ -411,7 +409,7 @@ static int sr_prep_fn(struct request_queue *q, struct
>> request *rq)
>>
>> if (this_count > 0xffff) {
>> this_count = 0xffff;
>> - SCpnt->request_bufflen = this_count * s_size;
>> + SCpnt->sdb.length = this_count * s_size;
>> }
>>
>> SCpnt->cmnd[2] = (unsigned char) (block >> 24) & 0xff;
>> diff --git a/drivers/usb/storage/isd200.c b/drivers/usb/storage/isd200.c
>> index 178e8c2..2d9a32b 100644
>> --- a/drivers/usb/storage/isd200.c
>> +++ b/drivers/usb/storage/isd200.c
>> @@ -415,14 +415,14 @@ static void isd200_set_srb(struct isd200_info *info,
>> sg_init_one(&info->sg, buff, bufflen);
>>
>> srb->sc_data_direction = dir;
>> - srb->request_buffer = buff ? &info->sg : NULL;
>> - srb->request_bufflen = bufflen;
>> - srb->use_sg = buff ? 1 : 0;
>> + srb->sdb.sglist = buff ? &info->sg : NULL;
>> + srb->sdb.length = bufflen;
>> + srb->sdb.sg_count = buff ? 1 : 0;
>> }
>>
>> static void isd200_srb_set_bufflen(struct scsi_cmnd *srb, unsigned bufflen)
>> {
>> - srb->request_bufflen = bufflen;
>> + srb->sdb.length = bufflen;
>> }
>>
>>
>> diff --git a/include/scsi/scsi_cmnd.h b/include/scsi/scsi_cmnd.h
>> index a7be605..4e3cf43 100644
>> --- a/include/scsi/scsi_cmnd.h
>> +++ b/include/scsi/scsi_cmnd.h
>> @@ -12,6 +12,13 @@ struct scatterlist;
>> struct Scsi_Host;
>> struct scsi_device;
>>
>> +struct scsi_data_buffer {
>> + unsigned length;
>> + int resid;
>> + unsigned short sg_count;
>> + unsigned short alloc_sg_count;
>
> sg_count and alloc_sg_count are a bit lengthy?
>
> My suggestion is using nr_* like the block layer (nr_sg and
> nr_alloc_sg ?).
will not! sg_count is the name you gave to the accessor and it
must be the same. alloc_sg_count is a private member that must only
be used by scsi_lib.c. If the long name is a discouragement of use
than that much better.
>
>
>> + struct scatterlist* sglist;
>> +};
>>
>> /* embedded in scsi_cmnd */
>> struct scsi_pointer {
>> @@ -62,15 +69,10 @@ struct scsi_cmnd {
>> /* These elements define the operation we are about to perform */
>> #define MAX_COMMAND_SIZE 16
>> unsigned char cmnd[MAX_COMMAND_SIZE];
>> - unsigned request_bufflen; /* Actual request size */
>>
>> struct timer_list eh_timeout; /* Used to time out the command. */
>> - void *request_buffer; /* Actual requested buffer */
>>
>> /* These elements define the operation we ultimately want to perform */
>> - unsigned short use_sg; /* Number of pieces of scatter-gather */
>> - unsigned short __use_sg;
>> -
>> unsigned underflow; /* Return error if less than
>> this amount is transferred */
>>
<snip>
Will send two new patches.
Boaz
-
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html