• Michal Nazarewicz's avatar
    usb: f_mass_storage: test whether thread is running before starting another · f5a300ce
    Michal Nazarewicz authored
    [ Upstream commit f78bbcae ]
    
    When binding the function to usb_configuration, check whether the thread
    is running before starting another one.  Without that, when function
    instance is added to multiple configurations, fsg_bing starts multiple
    threads with all but the latest one being forgotten by the driver.  This
    leads to obvious thread leaks, possible lockups when trying to halt the
    machine and possible more issues.
    
    This fixes issues with legacy/multi¹ gadget as well as configfs gadgets
    when mass_storage function is added to multiple configurations.
    
    This change also simplifies API since the legacy gadgets no longer need
    to worry about starting the thread by themselves (which was where bug
    in legacy/multi was in the first place).
    
    N.B., this patch doesn’t address adding single mass_storage function
    instance to a single configuration twice.  Thankfully, there’s no
    legitimate reason for such setup plus, if I’m not mistaken, configfs
    gadget doesn’t even allow it to be expressed.
    
    ¹ I have no example failure though.  Conclusion that legacy/multi has
      a bug is based purely on me reading the code.
    Acked-by: default avatarAlan Stern <stern@rowland.harvard.edu>
    Signed-off-by: default avatarMichal Nazarewicz <mina86@mina86.com>
    Tested-by: default avatarIvaylo Dimitrov <ivo.g.dimitrov.75@gmail.com>
    Cc: Alan Stern <stern@rowland.harvard.edu>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarFelipe Balbi <felipe.balbi@linux.intel.com>
    Signed-off-by: default avatarSasha Levin <sasha.levin@oracle.com>
    f5a300ce
f_mass_storage.c 95.9 KB