diff options
author | Chris Mason <clm@fb.com> | 2015-04-06 12:46:08 -0700 |
---|---|---|
committer | Chris Mason <clm@fb.com> | 2015-04-10 14:07:22 -0700 |
commit | 1bbc621ef28462456131c035eaeb5567a1a2a2fe (patch) | |
tree | d2c9e87e9cef8884a440bc9b6a5bf6574eff9fc7 /fs/btrfs/transaction.h | |
parent | 2b108268006e06d57ec9810f4ccf5d99d7e5b598 (diff) | |
download | lwn-1bbc621ef28462456131c035eaeb5567a1a2a2fe.tar.gz lwn-1bbc621ef28462456131c035eaeb5567a1a2a2fe.zip |
Btrfs: allow block group cache writeout outside critical section in commit
We loop through all of the dirty block groups during commit and write
the free space cache. In order to make sure the cache is currect, we do
this while no other writers are allowed in the commit.
If a large number of block groups are dirty, this can introduce long
stalls during the final stages of the commit, which can block new procs
trying to change the filesystem.
This commit changes the block group cache writeout to take appropriate
locks and allow it to run earlier in the commit. We'll still have to
redo some of the block groups, but it means we can get most of the work
out of the way without blocking the entire FS.
Signed-off-by: Chris Mason <clm@fb.com>
Diffstat (limited to 'fs/btrfs/transaction.h')
-rw-r--r-- | fs/btrfs/transaction.h | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/fs/btrfs/transaction.h b/fs/btrfs/transaction.h index 4cb0ae264534..0b24755596ba 100644 --- a/fs/btrfs/transaction.h +++ b/fs/btrfs/transaction.h @@ -64,10 +64,19 @@ struct btrfs_transaction { struct list_head pending_ordered; struct list_head switch_commits; struct list_head dirty_bgs; + struct list_head io_bgs; u64 num_dirty_bgs; + + /* + * we need to make sure block group deletion doesn't race with + * free space cache writeout. This mutex keeps them from stomping + * on each other + */ + struct mutex cache_write_mutex; spinlock_t dirty_bgs_lock; struct btrfs_delayed_ref_root delayed_refs; int aborted; + int dirty_bg_run; }; #define __TRANS_FREEZABLE (1U << 0) |