• J
    Btrfs: use the global block reserve if we cannot reserve space · 68a82277
    Josef Bacik 提交于
    We call use_block_rsv right before we make an allocation in order to make sure
    we have enough space.  Now normally people have called btrfs_start_transaction()
    with the appropriate amount of space that we need, so we just use some of that
    pre-reserved space and move along happily.  The problem is where people use
    btrfs_join_transaction(), which doesn't actually reserve any space.  So we try
    and reserve space here, but we cannot flush delalloc, so this forces us to
    return -ENOSPC when in reality we have plenty of space.  The most common symptom
    is seeing a bunch of "couldn't dirty inode" messages in syslog.  With
    xfstests 224 we end up falling back to start_transaction and then doing all the
    flush delalloc stuff which causes to hang for a very long time.
    
    So instead steal from the global reserve, which is what this is meant for
    anyway.  With this patch and the other 2 I have sent xfstests 224 now passes
    successfully.  Thanks,
    Signed-off-by: NJosef Bacik <josef@redhat.com>
    Signed-off-by: NChris Mason <chris.mason@oracle.com>
    68a82277
extent-tree.c 227.3 KB