• Hans de Goede's avatar
    watchdog: Add support for dynamically allocated watchdog_device structs · e907df32
    Hans de Goede authored
    If a driver's watchdog_device struct is part of a dynamically allocated
    struct (which it often will be), merely locking the module is not enough,
    even with a drivers module locked, the driver can be unbound from the device,
    examples:
    1) The root user can unbind it through sysfd
    2) The i2c bus master driver being unloaded for an i2c watchdog
    
    I will gladly admit that these are corner cases, but we still need to handle
    them correctly.
    
    The fix for this consists of 2 parts:
    1) Add ref / unref operations, so that the driver can refcount the struct
       holding the watchdog_device struct and delay freeing it until any
       open filehandles referring to it are closed
    2) Most driver operations will do IO on the device and the driver should not
       do any IO on the device after it has been unbound. Rather then letting each
       driver deal with this internally, it is better to ensure at the watchdog
       core level that no operations (other then unref) will get called after
       the driver has called watchdog_unregister_device(). This actually is the
       bulk of this patch.
    Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
    Signed-off-by: default avatarWim Van Sebroeck <wim@iguana.be>
    e907df32
watchdog_dev.c 14.3 KB