]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - fs/btrfs/transaction.c
Btrfs: Throttle file_write when data=ordered is flushing the inode
[karo-tx-linux.git] / fs / btrfs / transaction.c
index 5e9f69244f9f018775ef64e5c5ea08075b78bda0..c85cb48d95ee3dcd2aa1c8dbb1ad46971202563a 100644 (file)
@@ -512,8 +512,11 @@ int btrfs_write_ordered_inodes(struct btrfs_trans_handle *trans,
                mutex_unlock(&root->fs_info->trans_mutex);
                mutex_unlock(&root->fs_info->fs_mutex);
 
-               if (S_ISREG(inode->i_mode))
+               if (S_ISREG(inode->i_mode)) {
+                       atomic_inc(&BTRFS_I(inode)->ordered_writeback);
                        filemap_fdatawrite(inode->i_mapping);
+                       atomic_dec(&BTRFS_I(inode)->ordered_writeback);
+               }
                iput(inode);
 
                mutex_lock(&root->fs_info->fs_mutex);
@@ -530,8 +533,11 @@ int btrfs_write_ordered_inodes(struct btrfs_trans_handle *trans,
                mutex_unlock(&root->fs_info->trans_mutex);
                mutex_unlock(&root->fs_info->fs_mutex);
 
-               if (S_ISREG(inode->i_mode))
+               if (S_ISREG(inode->i_mode)) {
+                       atomic_inc(&BTRFS_I(inode)->ordered_writeback);
                        filemap_write_and_wait(inode->i_mapping);
+                       atomic_dec(&BTRFS_I(inode)->ordered_writeback);
+               }
                atomic_dec(&inode->i_count);
                iput(inode);
 
@@ -843,7 +849,7 @@ void btrfs_transaction_flush_work(struct btrfs_root *root)
 
 void __init btrfs_init_transaction_sys(void)
 {
-       trans_wq = create_workqueue("btrfs");
+       trans_wq = create_workqueue("btrfs-transaction");
 }
 
 void btrfs_exit_transaction_sys(void)