• N
    btrfs: Rewrite retry logic in do_chunk_alloc · 2556fbb0
    Nikolay Borisov 提交于
    do_chunk_alloc implements logic to detect whether there is currently
    pending chunk allocation (by means of space_info->chunk_alloc being
    set) and if so it loops around to the 'again' label. Additionally,
    based on the state of the space_info (e.g. whether it's full or not)
    and the return value of should_alloc_chunk() it decides whether this
    is a "hard" error (ENOSPC) or we can just return 0.
    
    This patch refactors all of this:
    
    1. Put order to the scattered ifs handling the various cases in an
    easy-to-read if {} else if{} branches. This makes clear the various
    cases we are interested in handling.
    
    2. Call should_alloc_chunk only once and use the result in the
    if/else if constructs. All of this is done under space_info->lock, so
    even before multiple calls of should_alloc_chunk were unnecessary.
    
    3. Rewrite the "do {} while()" loop currently implemented via label
    into an explicit loop construct.
    
    4. Move the mutex locking for the case where the caller is the one doing
    the allocation. For the case where the caller needs to wait a concurrent
    allocation, introduce a pair of mutex_lock/mutex_unlock to act as a
    barrier and reword the comment.
    
    5. Switch local vars to bool type where pertinent.
    
    All in all this shouldn't introduce any functional changes.
    Signed-off-by: NNikolay Borisov <nborisov@suse.com>
    Reviewed-by: NDavid Sterba <dsterba@suse.com>
    Signed-off-by: NDavid Sterba <dsterba@suse.com>
    2556fbb0
extent-tree.c 297.2 KB