• Eric W. Biederman's avatar
    Driver-core: Always create class directories for classses that support namespaces. · 24b1442d
    Eric W. Biederman authored
    This fixes the regression in 2.6.35-rcX where bluetooth network devices
    would fail to be deleted from sysfs, causing their destruction and
    recreation to fail.  In addition this fixes the mac80211_hwsim driver
    where it would leave around sysfs files when the driver was removed.
    
    This problem is discussed at
      https://bugzilla.kernel.org/show_bug.cgi?id=16257
    
    The reason for the regression is that the network namespace support
    added to sysfs expects and requires that network devices be put in
    directories that can contain only network devices.
    
    Today get_device_parent almost provides that guarantee for all class
    devices, except for a specific exception when the parent of a class
    devices is a class device.  It would be nice to simply remove that
    arguably incorrect special case, but apparently the input devices depend
    on it being there.  So I have only removed it for class devices with
    network namespace support.  Which today are the network devices.
    
    It has been suggested that a better fix would be to change the parent
    device from a class device to a bus device, which in the case of the
    bluetooth driver would change /sys/class/bluetooth to /sys/bus/bluetoth,
    I can not see how we would avoid significant userspace breakage if we
    were to make that change.
    
    Adding an extra directory in the path to the device will also be
    userspace visible but it is much less likely to break things.
    Everything is still accessible from /sys/class (for example), and it
    fixes two bugs.  Adding an extra directory fixes a 3 year old regression
    introduced with the new sysfs layout that makes it impossible to rename
    bnep0 network devices to names that conflict with hci device attributes
    like hci_revsion.  Adding an additional directory removes the new
    failure modes introduced by the network namespace code.
    
    If it weren't for the regession in the renaming of network devices I
    would figure out how to just make the sysfs code deal with this
    configuration of devices.
    
    In summary this patch fixes regressions by changing:
    "/sys/class/bluetooth/hci0/bnep0" to "/sys/class/bluetooth/hci0/net/bnep0".
    Reported-by: default avatarJohannes Berg <johannes@sipsolutions.net>
    Reported-by: default avatarJanusz Krzysztofik <jkrzyszt@tis.icnet.pl>
    Signed-off-by: default avatarEric W. Biederman <ebiederm@xmission.com>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    24b1442d
core.c 45.5 KB