base-manager: avoid events of USB interface from removing MMDevice
When a USB modem is switching its USB configuration, udev may deliver the remove events of USB interfaces associated with the old USB configuration and the add events of USB interfaces associated with the new USB configuration in an interleaved fashion. An interleaved remove event of USB interface could trigger the special case handling code in mm-base-manager.c:device_removed() and incorrectly remove a MMDevice under probing. See https://lists.freedesktop.org/archives/modemmanager-devel/2017-August/005626.html for more details. This patch adds a check to ensure that only remove events of USB device (i.e. not interface) can trigger the special handling code.
This commit is contained in:

committed by
Aleksander Morgado

parent
5a01e54066
commit
76c1a1119c
@@ -240,6 +240,19 @@ device_removed (MMBaseManager *self,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined WITH_UDEV
|
||||||
|
/* When a USB modem is switching its USB configuration, udev may deliver
|
||||||
|
* the remove events of USB interfaces associated with the old USB
|
||||||
|
* configuration and the add events of USB interfaces associated with the
|
||||||
|
* new USB configuration in an interleaved fashion. As we don't want a
|
||||||
|
* remove event of an USB interface trigger the removal of a MMDevice for
|
||||||
|
* the special case being handled here, we ignore any remove event with
|
||||||
|
* DEVTYPE != usb_device.
|
||||||
|
*/
|
||||||
|
if (g_strcmp0 (mm_kernel_device_get_property (kernel_device, "DEVTYPE"), "usb_device") != 0)
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* This case is designed to handle the case where, at least with kernel 2.6.31, unplugging
|
/* This case is designed to handle the case where, at least with kernel 2.6.31, unplugging
|
||||||
* an in-use ttyACMx device results in udev generating remove events for the usb, but the
|
* an in-use ttyACMx device results in udev generating remove events for the usb, but the
|
||||||
* ttyACMx device (subsystem tty) is not removed, since it was in-use. So if we have not
|
* ttyACMx device (subsystem tty) is not removed, since it was in-use. So if we have not
|
||||||
|
Reference in New Issue
Block a user