• Jeff Layton's avatar
    locks: defer freeing locks in locks_delete_lock until after i_lock has been dropped · ed9814d8
    Jeff Layton authored
    In commit 72f98e72 (locks: turn lock_flocks into a spinlock), we
    moved from using the BKL to a global spinlock. With this change, we lost
    the ability to block in the fl_release_private operation.
    
    This is problematic for NFS (and probably some other filesystems as
    well). Add a new list_head argument to locks_delete_lock. If that
    argument is non-NULL, then queue any locks that we want to free to the
    list instead of freeing them.
    
    Then, add a new locks_dispose_list function that will walk such a list
    and call locks_free_lock on them after the i_lock has been dropped.
    
    Finally, change all of the callers of locks_delete_lock to pass in a
    list_head, except for lease_modify. That function can be called long
    after the i_lock has been acquired. Deferring the freeing of a lease
    after unlocking it in that function is non-trivial until we overhaul
    some of the spinlocking in the lease code.
    
    Currently though, no filesystem that sets fl_release_private supports
    leases, so this is not currently a problem. We'll eventually want to
    make the same change in the lease code, but it needs a lot more work
    before we can reasonably do so.
    Acked-by: default avatarJ. Bruce Fields <bfields@fieldses.org>
    Signed-off-by: default avatarJeff Layton <jlayton@primarydata.com>
    ed9814d8
locks.c 69.5 KB