usb/150401: [umass] [usb8] Errors from USB drives mixed between
UFS and ZFS
CDP
dr.clau at gmail.com
Wed Jan 26 18:10:10 UTC 2011
The following reply was made to PR usb/150401; it has been noted by GNATS.
From: CDP <dr.clau at gmail.com>
To: bug-followup at FreeBSD.org, decibel at decibel.org, jim at nasby.net
Cc:
Subject: Re: usb/150401: [umass] [usb8] Errors from USB drives mixed between
UFS and ZFS
Date: Wed, 26 Jan 2011 18:44:11 +0200
This is a multi-part message in MIME format.
--------------010404030104040904000001
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
I've had my share of problems with USB external HDD's since I upgraded
to 8.x. I believe the root of your problems is the same as in my case.
Please take a look at this thread:
http://lists.freebsd.org/pipermail/freebsd-usb/2011-January/009894.html
I've also attached the patch that fixes the problem in my case. Note
that it is intended for 8.2-RC2.
Regards,
Claudiu Dragalina-Paraipan
--------------010404030104040904000001
Content-Type: text/plain;
name="cam_periph.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
filename="cam_periph.patch"
--- sys/cam/cam_periph.c.orig 2011-01-26 09:38:21.000000000 +0200
+++ sys/cam/cam_periph.c 2011-01-26 09:38:02.000000000 +0200
@@ -1024,7 +1024,9 @@
int frozen = 0;
u_int sense_key;
int depth = done_ccb->ccb_h.recovery_depth;
+ int xpt_done_ccb;
+ xpt_done_ccb = FALSE;
status = done_ccb->ccb_h.status;
if (status & CAM_DEV_QFRZN) {
frozen = 1;
@@ -1049,14 +1051,22 @@
if (sense_key != SSD_KEY_NO_SENSE) {
saved_ccb->ccb_h.status |=
CAM_AUTOSNS_VALID;
- } else {
+
+ xpt_done_ccb = TRUE;
+ } /*else {
saved_ccb->ccb_h.status &=
~CAM_STATUS_MASK;
saved_ccb->ccb_h.status |=
CAM_AUTOSENSE_FAIL;
- }
+ }*/
bcopy(saved_ccb, done_ccb, sizeof(union ccb));
xpt_free_ccb(saved_ccb);
+
+ periph->flags &= ~CAM_PERIPH_RECOVERY_INPROG;
+
+ if (xpt_done_ccb == FALSE)
+ xpt_action(done_ccb);
+
break;
}
default:
@@ -1084,7 +1094,9 @@
*/
if (frozen != 0)
done_ccb->ccb_h.status |= CAM_DEV_QFRZN;
- (*done_ccb->ccb_h.cbfcnp)(periph, done_ccb);
+
+ if (xpt_done_ccb == TRUE)
+ (*done_ccb->ccb_h.cbfcnp)(periph, done_ccb);
}
static void
--------------010404030104040904000001--
More information about the freebsd-usb
mailing list