Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 81d7ed29 authored by Chris Mason's avatar Chris Mason
Browse files

Btrfs: Throttle file_write when data=ordered is flushing the inode

parent bce4eae9
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -31,6 +31,7 @@ struct btrfs_inode {
	struct extent_io_tree io_tree;
	struct extent_io_tree io_tree;
	struct extent_io_tree io_failure_tree;
	struct extent_io_tree io_failure_tree;
	struct inode vfs_inode;
	struct inode vfs_inode;
	atomic_t ordered_writeback;


	u64 ordered_trans;
	u64 ordered_trans;
	/*
	/*
+1 −0
Original line number Original line Diff line number Diff line
@@ -977,6 +977,7 @@ static ssize_t btrfs_file_write(struct file *file, const char __user *buf,
		     (start_pos + num_written - 1) >> PAGE_CACHE_SHIFT);
		     (start_pos + num_written - 1) >> PAGE_CACHE_SHIFT);
	}
	}
	current->backing_dev_info = NULL;
	current->backing_dev_info = NULL;
	btrfs_ordered_throttle(root, inode);
	return num_written ? num_written : err;
	return num_written ? num_written : err;
}
}


+4 −0
Original line number Original line Diff line number Diff line
@@ -1419,6 +1419,7 @@ static int btrfs_init_locked_inode(struct inode *inode, void *p)
			     inode->i_mapping, GFP_NOFS);
			     inode->i_mapping, GFP_NOFS);
	extent_io_tree_init(&BTRFS_I(inode)->io_failure_tree,
	extent_io_tree_init(&BTRFS_I(inode)->io_failure_tree,
			     inode->i_mapping, GFP_NOFS);
			     inode->i_mapping, GFP_NOFS);
	atomic_set(&BTRFS_I(inode)->ordered_writeback, 0);
	return 0;
	return 0;
}
}


@@ -1728,6 +1729,7 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans,
			     inode->i_mapping, GFP_NOFS);
			     inode->i_mapping, GFP_NOFS);
	extent_io_tree_init(&BTRFS_I(inode)->io_failure_tree,
	extent_io_tree_init(&BTRFS_I(inode)->io_failure_tree,
			     inode->i_mapping, GFP_NOFS);
			     inode->i_mapping, GFP_NOFS);
	atomic_set(&BTRFS_I(inode)->ordered_writeback, 0);
	BTRFS_I(inode)->delalloc_bytes = 0;
	BTRFS_I(inode)->delalloc_bytes = 0;
	BTRFS_I(inode)->root = root;
	BTRFS_I(inode)->root = root;


@@ -1956,6 +1958,7 @@ static int btrfs_create(struct inode *dir, struct dentry *dentry,
		extent_io_tree_init(&BTRFS_I(inode)->io_failure_tree,
		extent_io_tree_init(&BTRFS_I(inode)->io_failure_tree,
				     inode->i_mapping, GFP_NOFS);
				     inode->i_mapping, GFP_NOFS);
		BTRFS_I(inode)->delalloc_bytes = 0;
		BTRFS_I(inode)->delalloc_bytes = 0;
		atomic_set(&BTRFS_I(inode)->ordered_writeback, 0);
		BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops;
		BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops;
	}
	}
	dir->i_sb->s_dirt = 1;
	dir->i_sb->s_dirt = 1;
@@ -3292,6 +3295,7 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry,
		extent_io_tree_init(&BTRFS_I(inode)->io_failure_tree,
		extent_io_tree_init(&BTRFS_I(inode)->io_failure_tree,
				     inode->i_mapping, GFP_NOFS);
				     inode->i_mapping, GFP_NOFS);
		BTRFS_I(inode)->delalloc_bytes = 0;
		BTRFS_I(inode)->delalloc_bytes = 0;
		atomic_set(&BTRFS_I(inode)->ordered_writeback, 0);
		BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops;
		BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops;
	}
	}
	dir->i_sb->s_dirt = 1;
	dir->i_sb->s_dirt = 1;
+13 −0
Original line number Original line Diff line number Diff line
@@ -269,3 +269,16 @@ int btrfs_del_ordered_inode(struct inode *inode)
	return ret;
	return ret;
}
}


int btrfs_ordered_throttle(struct btrfs_root *root, struct inode *inode)
{
	struct btrfs_transaction *cur = root->fs_info->running_transaction;
	while(cur == root->fs_info->running_transaction &&
	      atomic_read(&BTRFS_I(inode)->ordered_writeback)) {
#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18)
		congestion_wait(WRITE, HZ/20);
#else
		blk_congestion_wait(WRITE, HZ/20);
#endif
	}
	return 0;
}
+1 −0
Original line number Original line Diff line number Diff line
@@ -39,4 +39,5 @@ int btrfs_find_first_ordered_inode(struct btrfs_ordered_inode_tree *tree,
				       u64 *root_objectid, u64 *objectid,
				       u64 *root_objectid, u64 *objectid,
				       struct inode **inode);
				       struct inode **inode);
int btrfs_del_ordered_inode(struct inode *inode);
int btrfs_del_ordered_inode(struct inode *inode);
int btrfs_ordered_throttle(struct btrfs_root *root, struct inode *inode);
#endif
#endif
Loading