• Josef Bacik's avatar
    Btrfs: fix heavy delalloc related deadlock · 9ffba8cd
    Josef Bacik authored
    I added a patch where we started taking the ordered operations mutex when we
    waited on ordered extents.  We need this because we splice the list and process
    it, so if a flusher came in during this scenario it would think the list was
    empty and we'd usually get an early ENOSPC.  The problem with this is that this
    lock is used in transaction committing.  So we end up with something like this
    
    Transaction commit
    	-> wait on writers
    
    Delalloc flusher
    	-> run_ordered_operations (holds mutex)
    		->wait for filemap-flush to do its thing
    
    flush task
    	-> cow_file_range
    		->wait on btrfs_join_transaction because we're commiting
    
    some other task
    	-> commit_transaction because we notice trans->transaction->flush is set
    		-> run_ordered_operations (hang on mutex)
    
    We need to disentangle the ordered operations flushing from the delalloc
    flushing, since they are separate things.  This solves the deadlock issue I was
    seeing.  Thanks,
    Signed-off-by: default avatarJosef Bacik <jbacik@fusionio.com>
    Signed-off-by: default avatarChris Mason <chris.mason@fusionio.com>
    9ffba8cd
ordered-data.c 31.2 KB