aboutsummaryrefslogtreecommitdiff
path: root/drivers/block/ub.c
diff options
context:
space:
mode:
authorPaul Mackerras <paulus@samba.org>2008-11-19 16:10:32 +1100
committerPaul Mackerras <paulus@samba.org>2008-11-19 16:10:32 +1100
commitcea555d384b85271035814c5adad23e6c7fc5d2a (patch)
tree1181b6333a69a135293ec75f8a48c849ee32c015 /drivers/block/ub.c
parent78608dd32ce46789e970d6c3c423cd668c138d6c (diff)
parent7f0f598a0069d1ab072375965a4b69137233169c (diff)
Merge branch 'linux-2.6' into next
Diffstat (limited to 'drivers/block/ub.c')
-rw-r--r--drivers/block/ub.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/drivers/block/ub.c b/drivers/block/ub.c
index fccac18d311..048d71d244d 100644
--- a/drivers/block/ub.c
+++ b/drivers/block/ub.c
@@ -1546,8 +1546,6 @@ static void ub_top_sense_done(struct ub_dev *sc, struct ub_scsi_cmd *scmd)
/*
* Reset management
- * XXX Move usb_reset_device to khubd. Hogging kevent is not a good thing.
- * XXX Make usb_sync_reset asynchronous.
*/
static void ub_reset_enter(struct ub_dev *sc, int try)
@@ -1633,6 +1631,22 @@ static void ub_reset_task(struct work_struct *work)
}
/*
+ * XXX Reset brackets are too much hassle to implement, so just stub them
+ * in order to prevent forced unbinding (which deadlocks solid when our
+ * ->disconnect method waits for the reset to complete and this kills keventd).
+ *
+ * XXX Tell Alan to move usb_unlock_device inside of usb_reset_device,
+ * or else the post_reset is invoked, and restats I/O on a locked device.
+ */
+static int ub_pre_reset(struct usb_interface *iface) {
+ return 0;
+}
+
+static int ub_post_reset(struct usb_interface *iface) {
+ return 0;
+}
+
+/*
* This is called from a process context.
*/
static void ub_revalidate(struct ub_dev *sc, struct ub_lun *lun)
@@ -2446,6 +2460,8 @@ static struct usb_driver ub_driver = {
.probe = ub_probe,
.disconnect = ub_disconnect,
.id_table = ub_usb_ids,
+ .pre_reset = ub_pre_reset,
+ .post_reset = ub_post_reset,
};
static int __init ub_init(void)