• Liu Bo's avatar
    Btrfs: clarify do_chunk_alloc()'s return value · 28b737f6
    Liu Bo authored
    Function start_transaction() can return ERR_PTR(1) when flush is
    BTRFS_RESERVE_FLUSH_LIMIT, so the call graph is
    
    start_transaction (return ERR_PTR(1))
      -> btrfs_block_rsv_add (return 1)
         -> reserve_metadata_bytes (return 1)
            -> flush_space (return 1)
               -> do_chunk_alloc  (return 1)
    
    With BTRFS_RESERVE_FLUSH_LIMIT, if flush_space is already on the
    flush_state of ALLOC_CHUNK and it successfully allocates a new
    chunk, then instead of trying to reserve space again,
    reserve_metadata_bytes returns 1 immediately.
    
    Eventually the callers who call start_transaction() usually just
    do the IS_ERR() check which ERR_PTR(1) can pass, then it'll get
    a panic when dereferencing a pointer which is ERR_PTR(1).
    
    The following patch fixes the above problem.
    "btrfs: flush_space: treat return value of do_chunk_alloc properly"
    https://patchwork.kernel.org/patch/7778651/
    
    This add comments to clarify do_chunk_alloc()'s return value.
    Signed-off-by: default avatarLiu Bo <bo.li.liu@oracle.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    Signed-off-by: default avatarChris Mason <clm@fb.com>
    28b737f6
extent-tree.c 304 KB