• Parag Warudkar's avatar
    tpm: fix sleep-in-spinlock · 8e39c933
    Parag Warudkar authored
    flush_scheduled_work() can sleep, and we're calling it under spinlock.
    
    AFAICS, moving flush_scheduled_work before spin_lock() should not cause any
    problems.
    
    Reason being - The only thing that can race against tpm_release is tpm_open
    (tpm_release is called when last reference to the file is closed and only
    thing that can happen after that is tpm_open??) and tpm_open acquires
    driver_lock and more over it bails out with EBUSY if chip->num_opens is
    greater than 0.
    
    I also moved chip->num_pending-- to after deleting timer and setting data
    pending as it looks more correct for the paranoid although it probably doesn't
    matter as it is guarded by driver_lock.  None the less this change should not
    cause problems.
    
    While I was at it I noticed a missing NULL check in tpm_register_hardware
    which is fixed with this patch as well.
    Signed-off-by: default avatarParag Warudkar <parag.warudkar@gmail.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    8e39c933
tpm.c 26.7 KB