From 8669602e7b677e75a5271226ac7e965549d8aaef Mon Sep 17 00:00:00 2001 From: Alan Stern Date: Wed, 29 Oct 2008 15:16:58 -0400 Subject: [PATCH] --- yaml --- r: 118961 b: refs/heads/master c: 352d026338378b1f13f044e33c1047da6e470056 h: refs/heads/master i: 118959: 40f69820d82da244e7d9a08a35fdaf418cef6afb v: v3 --- [refs] | 2 +- trunk/drivers/usb/core/message.c | 1 + trunk/drivers/usb/core/sysfs.c | 2 +- trunk/include/linux/usb.h | 2 ++ 4 files changed, 5 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 4f5b16c87970..2837244cbe70 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 0047ca0a45c6a481abd467fb52d2a480ffc8c6b9 +refs/heads/master: 352d026338378b1f13f044e33c1047da6e470056 diff --git a/trunk/drivers/usb/core/message.c b/trunk/drivers/usb/core/message.c index 887738577b28..6d1048faf08e 100644 --- a/trunk/drivers/usb/core/message.c +++ b/trunk/drivers/usb/core/message.c @@ -1091,6 +1091,7 @@ void usb_disable_device(struct usb_device *dev, int skip_ep0) continue; dev_dbg(&dev->dev, "unregistering interface %s\n", dev_name(&interface->dev)); + interface->unregistering = 1; usb_remove_sysfs_intf_files(interface); device_del(&interface->dev); } diff --git a/trunk/drivers/usb/core/sysfs.c b/trunk/drivers/usb/core/sysfs.c index f66fba11fbd5..4fb65fdc9dc3 100644 --- a/trunk/drivers/usb/core/sysfs.c +++ b/trunk/drivers/usb/core/sysfs.c @@ -840,7 +840,7 @@ int usb_create_sysfs_intf_files(struct usb_interface *intf) struct usb_host_interface *alt = intf->cur_altsetting; int retval; - if (intf->sysfs_files_created) + if (intf->sysfs_files_created || intf->unregistering) return 0; /* The interface string may be present in some altsettings diff --git a/trunk/include/linux/usb.h b/trunk/include/linux/usb.h index 8fa973bede5e..f72aa51f7bcd 100644 --- a/trunk/include/linux/usb.h +++ b/trunk/include/linux/usb.h @@ -108,6 +108,7 @@ enum usb_interface_condition { * (in probe()), bound to a driver, or unbinding (in disconnect()) * @is_active: flag set when the interface is bound and not suspended. * @sysfs_files_created: sysfs attributes exist + * @unregistering: flag set when the interface is being unregistered * @needs_remote_wakeup: flag set when the driver requires remote-wakeup * capability during autosuspend. * @needs_altsetting0: flag set when a set-interface request for altsetting 0 @@ -163,6 +164,7 @@ struct usb_interface { enum usb_interface_condition condition; /* state of binding */ unsigned is_active:1; /* the interface is not suspended */ unsigned sysfs_files_created:1; /* the sysfs attributes exist */ + unsigned unregistering:1; /* unregistration is in progress */ unsigned needs_remote_wakeup:1; /* driver requires remote wakeup */ unsigned needs_altsetting0:1; /* switch to altsetting 0 is pending */ unsigned needs_binding:1; /* needs delayed unbind/rebind */