On Wed, Mar 05 2008 at 2:26 +0200, FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> wrote:No this commit is a serious bug, and the only fix is like you suggested in __end_that_request_first. This is because it breaks that scsi-ml loop where scsi_bufflen() can be less then blk_rq_bytes(). In that case this commit is a data corruption. Submitted is the right fix to this problem, as pointed out by TOMO. Please test it solves the CD burning problem. (The patch includes the revert of commit e97a294e) --- From: Boaz Harrosh <bharrosh@panasas.com> Date: Wed, 5 Mar 2008 12:07:12 +0200 Subject: [PATCH] blk: missing add of padded bytes to io completion byte count the commit e97a294ef6938512b655b1abf17656cf2b26f709 was very wrong. This is because scsi-ml supports the ability to split a request into smaller chunks, in which case scsi_bufflen() is smaller then request length. Then at completion time the remainder can be issued as a new scsi command. In that case the above commit is a data corruption. Also in this fix all users of block layer are taken care of, and not only scsi devices. Signed-off-by: Boaz Harrosh <bharrosh@panasas.com> Signed-off-by: Benny Halevy <bhalevy@panasas.com> --- block/blk-core.c | 4 ++++ drivers/scsi/scsi.c | 2 +- 2 files changed, 5 insertions(+), 1 deletions(-) diff --git a/block/blk-core.c b/block/blk-core.c index 2a438a9..37fcccc 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -1549,6 +1549,9 @@ static int __end_that_request_first(struct request *req, int error, nr_bytes >> 9, req->sector); } + if (nr_bytes >= blk_rq_bytes(req)) + nr_bytes += req->extra_len; + total_bytes = bio_nbytes = 0; while ((bio = req->bio) != NULL) { int nbytes; @@ -1616,6 +1619,7 @@ static int __end_that_request_first(struct request *req, int error, if (!req->bio) return 0; + BUG_ON(total_bytes >= blk_rq_bytes(req)); /* * if the request wasn't completed, update state */ diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c index e5c6f6a..fecba05 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) + cmd->request->extra_len; + good_bytes = scsi_bufflen(cmd); if (cmd->request->cmd_type != REQ_TYPE_BLOCK_PC) { drv = scsi_cmd_to_driver(cmd); if (drv->done) -- 1.5.3.3 --
| Tarkan Erimer | Re: Dual-Licensing Linux Kernel with GPL V2 and GPL V3 |
| David Woodhouse | [PATCH 1/3] firmware: allow firmware files to be built into kernel image |
| Linus Torvalds | Linux 2.6.21 |
| Parag Warudkar | BUG: soft lockup - CPU#1 stuck for 15s! [swapper:0] |
git: | |
| David Miller | [GIT]: Networking |
| Rick Jones | Re: Network latency regressions from 2.6.22 to 2.6.29 |
| Gerrit Renker | [PATCH 18/37] dccp: Support for Mandatory options |
| David Miller | Re: [PATCH] pkt_sched: Destroy gen estimators under rtnl_lock(). |
