• Al Viro's avatar
    ufs: avoid grabbing ->truncate_mutex if possible · 09bf4f5b
    Al Viro authored
    tail unpacking is done in a wrong place; the deadlocks galore
    is best dealt with by doing that in ->write_iter() (and switching
    to iomap, while we are at it), but that's rather painful to
    backport.  The trouble comes from grabbing pages that cover
    the beginning of tail from inside of ufs_new_fragments(); ongoing
    pageout of any of those is going to deadlock on ->truncate_mutex
    with process that got around to extending the tail holding that
    and waiting for page to get unlocked, while ->writepage() on
    that page is waiting on ->truncate_mutex.
    
    The thing is, we don't need ->truncate_mutex when the fragment
    we are trying to map is within the tail - the damn thing is
    allocated (tail can't contain holes).
    
    Let's do a plain lookup and if the fragment is present, we can
    just pretend that we'd won the race in almost all cases.  The
    only exception is a fragment between the end of tail and the
    end of block containing tail.
    
    Protect ->i_lastfrag with ->meta_lock - read_seqlock_excl() is
    sufficient.
    Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
    09bf4f5b
inode.c 32.9 KB