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

Commit 21ad10cf authored by Chris Mason's avatar Chris Mason
Browse files

Btrfs: Add flush barriers on commit

parent bcd987fe
Loading
Loading
Loading
Loading
+3 −2
Original line number Original line Diff line number Diff line
@@ -440,8 +440,9 @@ struct btrfs_root {
 */
 */
#define BTRFS_STRING_ITEM_KEY	253
#define BTRFS_STRING_ITEM_KEY	253


#define BTRFS_MOUNT_NODATASUM		0x1
#define BTRFS_MOUNT_NODATASUM		(1 << 0)
#define BTRFS_MOUNT_NODATACOW		0x2
#define BTRFS_MOUNT_NODATACOW		(1 << 1)
#define BTRFS_MOUNT_NOBARRIER		(1 << 2)


#define btrfs_clear_opt(o, opt)		((o) &= ~BTRFS_MOUNT_##opt)
#define btrfs_clear_opt(o, opt)		((o) &= ~BTRFS_MOUNT_##opt)
#define btrfs_set_opt(o, opt)		((o) |= BTRFS_MOUNT_##opt)
#define btrfs_set_opt(o, opt)		((o) |= BTRFS_MOUNT_##opt)
+5 −0
Original line number Original line Diff line number Diff line
@@ -762,10 +762,15 @@ int write_ctree_super(struct btrfs_trans_handle *trans, struct btrfs_root
	int ret;
	int ret;
	struct extent_buffer *super = root->fs_info->sb_buffer;
	struct extent_buffer *super = root->fs_info->sb_buffer;
	struct inode *btree_inode = root->fs_info->btree_inode;
	struct inode *btree_inode = root->fs_info->btree_inode;
	struct super_block *sb = root->fs_info->sb;


	if (!btrfs_test_opt(root, NOBARRIER))
		blkdev_issue_flush(sb->s_bdev, NULL);
	set_extent_buffer_dirty(&BTRFS_I(btree_inode)->extent_tree, super);
	set_extent_buffer_dirty(&BTRFS_I(btree_inode)->extent_tree, super);
	ret = sync_page_range_nolock(btree_inode, btree_inode->i_mapping,
	ret = sync_page_range_nolock(btree_inode, btree_inode->i_mapping,
				     super->start, super->len);
				     super->start, super->len);
	if (!btrfs_test_opt(root, NOBARRIER))
		blkdev_issue_flush(sb->s_bdev, NULL);
	return ret;
	return ret;
}
}


+8 −1
Original line number Original line Diff line number Diff line
@@ -64,13 +64,14 @@ static void btrfs_put_super (struct super_block * sb)


enum {
enum {
	Opt_subvol, Opt_nodatasum, Opt_nodatacow, Opt_max_extent,
	Opt_subvol, Opt_nodatasum, Opt_nodatacow, Opt_max_extent,
	Opt_alloc_start, Opt_err,
	Opt_alloc_start, Opt_nobarrier, Opt_err,
};
};


static match_table_t tokens = {
static match_table_t tokens = {
	{Opt_subvol, "subvol=%s"},
	{Opt_subvol, "subvol=%s"},
	{Opt_nodatasum, "nodatasum"},
	{Opt_nodatasum, "nodatasum"},
	{Opt_nodatacow, "nodatacow"},
	{Opt_nodatacow, "nodatacow"},
	{Opt_nobarrier, "nobarrier"},
	{Opt_max_extent, "max_extent=%s"},
	{Opt_max_extent, "max_extent=%s"},
	{Opt_alloc_start, "alloc_start=%s"},
	{Opt_alloc_start, "alloc_start=%s"},
	{Opt_err, NULL}
	{Opt_err, NULL}
@@ -148,6 +149,12 @@ static int parse_options (char * options,
				btrfs_set_opt(info->mount_opt, NODATASUM);
				btrfs_set_opt(info->mount_opt, NODATASUM);
			}
			}
			break;
			break;
		case Opt_nobarrier:
			if (info) {
				printk("btrfs: turning off barriers\n");
				btrfs_set_opt(info->mount_opt, NOBARRIER);
			}
			break;
		case Opt_max_extent:
		case Opt_max_extent:
			if (info) {
			if (info) {
				char *num = match_strdup(&args[0]);
				char *num = match_strdup(&args[0]);