Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932312AbYCDSeo (ORCPT ); Tue, 4 Mar 2008 13:34:44 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1765696AbYCDSeQ (ORCPT ); Tue, 4 Mar 2008 13:34:16 -0500 Received: from bzq-219-195-70.pop.bezeqint.net ([62.219.195.70]:51585 "EHLO bh-buildlin2.bhalevy.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1765437AbYCDSeO (ORCPT ); Tue, 4 Mar 2008 13:34:14 -0500 Message-ID: <47CD9457.3090203@panasas.com> Date: Tue, 04 Mar 2008 20:26:31 +0200 From: Boaz Harrosh User-Agent: Thunderbird 2.0.0.9 (X11/20071031) MIME-Version: 1.0 To: Tejun Heo CC: FUJITA Tomonori , efault@gmx.de, jens.axboe@oracle.com, fujita.tomonori@lab.ntt.co.jp, James.Bottomley@HansenPartnership.com, akpm@linux-foundation.org, linux-kernel@vger.kernel.org, linux-ide@vger.kernel.org, linux-scsi@vger.kernel.org, jgarzik@pobox.com, bzolnier@gmail.com Subject: Re: [PATCH] block: fix residual byte count handling References: <20080304093536.GH6704@kernel.dk> <1204634238.5997.5.camel@homer.simson.net> <47CD4355.4050401@gmail.com> <20080304223006A.tomof@acm.org> <47CD53BA.5040908@gmail.com> <47CD7611.2030606@gmail.com> <47CD7C05.1080707@gmail.com> In-Reply-To: <47CD7C05.1080707@gmail.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2924 Lines: 67 On Tue, Mar 04 2008 at 18:42 +0200, Tejun Heo wrote: > Tejun Heo wrote: >> Tejun Heo wrote: >>> FUJITA Tomonori wrote: >>>>> Aiee... device going down after timing out on READ_DISC_INFO. That's >>>>> gruesome. Can you please try the other patches? >>>> Tejun, I thought that libata needs a fix for sum(sg) != rq->data_len. No? >>> The extra_len you added to qc->nbytes should be it. The only other >>> place to pay attention is the ATAPI transfer chunk size and your patch >>> seems to get it right. >>> >>>> Now Jens' git tree should work with all the non libata stuff, ide, >>>> firewire, bsg, etc. But I'm not sure about libata. >>> With the second patch, all others should be fine no matter what. I'll >>> go check libata part again. >> I can reproduce the problem here and it's very weird. I'll report back >> when I know more. > > Okay, I got it. Heh, it turns out SCSI and/or block layer is not > ready for rq->data_len != sum(sg). When adjusted command completes, > SCSI midlayer completes the command with rq->data_len for PC commands > which eventually ends up in __end_that_request_first(). As there are > extra sg area left after completing rq->data_len, blk layer says so to > SCSI layer and SCSI layer retries the command only with the appended > area. > > The following patch gets the writing going. I really think it's a > serious mistake to break rq->data_len == sum(sg). If we break > rq->data_len == requested size, the worst bugs are giving wrong size > when issuing commands to application layer of devices which is > relatively easy to spot and not all that command anyway. Breaking > rq->data_len == sum(sg), bugs will be in internal mechanics, DMA > engine programming and transport layer. Oh well... > > diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c > index fecba05..32439ac 100644 > --- a/drivers/scsi/scsi.c > +++ b/drivers/scsi/scsi.c > @@ -757,7 +757,7 @@ void scsi_finish_command(struct scsi_cmnd *cmd) > "Notifying upper driver of completion " > "(result %x)\n", cmd->result)); > > - good_bytes = scsi_bufflen(cmd); > + good_bytes = scsi_bufflen(cmd) + cmd->request->data_len; Are you sure? is it not: + good_bytes = scsi_bufflen(cmd) + cmd->request->extra_len > if (cmd->request->cmd_type != REQ_TYPE_BLOCK_PC) { > drv = scsi_cmd_to_driver(cmd); > if (drv->done) > > I hate this patch. I wish you could maybe take the extra_len into account inside blk_end_request. The padding should be transparent to all concerned but the requesting LLD and the internals of the block layer. If block layer added padding it should take that into account on completion. My $0.2. Boaz -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/