Btrfs: Add flush barriers on commit
authorChris Mason <chris.mason@oracle.com>
Wed, 9 Jan 2008 14:23:21 +0000 (09:23 -0500)
committerChris Mason <chris.mason@oracle.com>
Thu, 25 Sep 2008 15:03:59 +0000 (11:03 -0400)
Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/ctree.h
fs/btrfs/disk-io.c
fs/btrfs/super.c

index 7eda51542d17c174a96634dfdd3fafc148bdc3dc..0c0edacbc14c999366e855c000d2eae8d34ec408 100644 (file)
@@ -440,8 +440,9 @@ struct btrfs_root {
  */
 #define BTRFS_STRING_ITEM_KEY  253
 
-#define BTRFS_MOUNT_NODATASUM          0x1
-#define BTRFS_MOUNT_NODATACOW          0x2
+#define BTRFS_MOUNT_NODATASUM          (1 << 0)
+#define BTRFS_MOUNT_NODATACOW          (1 << 1)
+#define BTRFS_MOUNT_NOBARRIER          (1 << 2)
 
 #define btrfs_clear_opt(o, opt)                ((o) &= ~BTRFS_MOUNT_##opt)
 #define btrfs_set_opt(o, opt)          ((o) |= BTRFS_MOUNT_##opt)
index e0940a39ff07800e8c44e2e5bfdfdbc160bca296..a481b970608c4a8d08edbc08fbcc82c166c73328 100644 (file)
@@ -762,10 +762,15 @@ int write_ctree_super(struct btrfs_trans_handle *trans, struct btrfs_root
        int ret;
        struct extent_buffer *super = root->fs_info->sb_buffer;
        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);
        ret = sync_page_range_nolock(btree_inode, btree_inode->i_mapping,
                                     super->start, super->len);
+       if (!btrfs_test_opt(root, NOBARRIER))
+               blkdev_issue_flush(sb->s_bdev, NULL);
        return ret;
 }
 
index f1b56eb77b1d98ec1488bded4becd9c6e62e7065..9ab4086d463c3ee54a7235060a419f855562ffd7 100644 (file)
@@ -64,13 +64,14 @@ static void btrfs_put_super (struct super_block * sb)
 
 enum {
        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 = {
        {Opt_subvol, "subvol=%s"},
        {Opt_nodatasum, "nodatasum"},
        {Opt_nodatacow, "nodatacow"},
+       {Opt_nobarrier, "nobarrier"},
        {Opt_max_extent, "max_extent=%s"},
        {Opt_alloc_start, "alloc_start=%s"},
        {Opt_err, NULL}
@@ -148,6 +149,12 @@ static int parse_options (char * options,
                                btrfs_set_opt(info->mount_opt, NODATASUM);
                        }
                        break;
+               case Opt_nobarrier:
+                       if (info) {
+                               printk("btrfs: turning off barriers\n");
+                               btrfs_set_opt(info->mount_opt, NOBARRIER);
+                       }
+                       break;
                case Opt_max_extent:
                        if (info) {
                                char *num = match_strdup(&args[0]);