Messages in this thread Patch in this message | | | Subject | Re: regression: CD burning (k3b) went broke | From | Mike Galbraith <> | Date | Wed, 27 Feb 2008 07:00:10 +0100 |
| |
On Wed, 2008-02-27 at 03:24 +0100, Mike Galbraith wrote: > On Tue, 2008-02-26 at 15:08 -0800, Andrew Morton wrote:
> > So this change fixes a bug? Can we have a recap of how it does this? > > Yeah, it fixes the problem. (wrt recap, if I could write it, it would > be a changelog;)
Hm. After rummaging around some more in both kernel and userland, I think this patchlet is not only functional, but (random accident) technically correct. What the heck, let's see if it flies...
snippet from userland: /* * Return the residual DMA count for last command. * If this count is < 0, then a DMA overrun occured. */ EXPORT int scg_getresid(scgp) SCSI *scgp; { return (scgp->scmd->resid); }
This function is used all over the place in cdrecord to determine transfer size.
(patchlet takes wing, and... goes splat?) Fix CD burning regression introduced by 6b00769fe1502b4ad97bb327ef7ac971b208bfb5. raw_data_len must be updated to reflect residual data upon IO completion because it is used by blk_complete_sghdr_rq() to set hdr->resid which eventually becomes visible to userland.
Signed-off-by: Mike Galbraith <efault@gmx.de>
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index ba21d97..7a6f784 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c @@ -871,7 +871,7 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes) scsi_end_bidi_request(cmd); return; } - req->data_len = scsi_get_resid(cmd); + req->data_len = req->raw_data_len = scsi_get_resid(cmd); } BUG_ON(blk_bidi_rq(req)); /* bidi not support for !blk_pc_request yet */
-Mike
| |