From 5f9d594b626bdbab6a2eab36aa6ae95108efb561 Mon Sep 17 00:00:00 2001 From: Pete Zaitcev Date: Sat, 19 Apr 2008 14:42:49 -0700 Subject: [PATCH] --- yaml --- r: 95784 b: refs/heads/master c: 0da13c8c3dfb1ab6c56f2a70fadfddd57e0d7c42 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/block/ub.c | 22 ++++++++++++++-------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/[refs] b/[refs] index 5fdaf0ea2bd2..b18439c337bf 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 82fe26ba7a21d9bcc77e6142c941683eede32940 +refs/heads/master: 0da13c8c3dfb1ab6c56f2a70fadfddd57e0d7c42 diff --git a/trunk/drivers/block/ub.c b/trunk/drivers/block/ub.c index 5c6a6e89d2fb..e2c3ebd8db22 100644 --- a/trunk/drivers/block/ub.c +++ b/trunk/drivers/block/ub.c @@ -319,6 +319,7 @@ struct ub_dev { int openc; /* protected by ub_lock! */ /* kref is too implicit for our taste */ int reset; /* Reset is running */ + int bad_resid; unsigned int tagcnt; char name[12]; struct usb_device *dev; @@ -1265,14 +1266,19 @@ static void ub_scsi_urb_compl(struct ub_dev *sc, struct ub_scsi_cmd *cmd) return; } - len = le32_to_cpu(bcs->Residue); - if (len != cmd->len - cmd->act_len) { - /* - * It is all right to transfer less, the caller has - * to check. But it's not all right if the device - * counts disagree with our counts. - */ - goto Bad_End; + if (!sc->bad_resid) { + len = le32_to_cpu(bcs->Residue); + if (len != cmd->len - cmd->act_len) { + /* + * Only start ignoring if this cmd ended well. + */ + if (cmd->len == cmd->act_len) { + printk(KERN_NOTICE "%s: " + "bad residual %d of %d, ignoring\n", + sc->name, len, cmd->len); + sc->bad_resid = 1; + } + } } switch (bcs->Status) {