]> bbs.cooldavid.org Git - net-next-2.6.git/commitdiff
btrfs: replace barriers with explicit flush / FUA usage
authorChristoph Hellwig <hch@infradead.org>
Wed, 18 Aug 2010 09:29:12 +0000 (05:29 -0400)
committerJens Axboe <jaxboe@fusionio.com>
Fri, 10 Sep 2010 10:35:39 +0000 (12:35 +0200)
Switch to the WRITE_FLUSH_FUA flag for log writes, remove the EOPNOTSUPP
detection for barriers and stop setting the barrier flag for discards.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Acked-by: Chris Mason <chris.mason@oracle.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
fs/btrfs/disk-io.c
fs/btrfs/extent-tree.c
fs/btrfs/volumes.c
fs/btrfs/volumes.h

index 64f10082f0484274e2987f293a4d6f4d1e313684..5e789f4a3ed0f0da401526d6a86de10db5c74f67 100644 (file)
@@ -2063,7 +2063,7 @@ static void btrfs_end_buffer_write_sync(struct buffer_head *bh, int uptodate)
        if (uptodate) {
                set_buffer_uptodate(bh);
        } else {
-               if (!buffer_eopnotsupp(bh) && printk_ratelimit()) {
+               if (printk_ratelimit()) {
                        printk(KERN_WARNING "lost page write due to "
                                        "I/O error on %s\n",
                                       bdevname(bh->b_bdev, b));
@@ -2200,21 +2200,10 @@ static int write_dev_supers(struct btrfs_device *device,
                        bh->b_end_io = btrfs_end_buffer_write_sync;
                }
 
-               if (i == last_barrier && do_barriers && device->barriers) {
-                       ret = submit_bh(WRITE_BARRIER, bh);
-                       if (ret == -EOPNOTSUPP) {
-                               printk("btrfs: disabling barriers on dev %s\n",
-                                      device->name);
-                               set_buffer_uptodate(bh);
-                               device->barriers = 0;
-                               /* one reference for submit_bh */
-                               get_bh(bh);
-                               lock_buffer(bh);
-                               ret = submit_bh(WRITE_SYNC, bh);
-                       }
-               } else {
+               if (i == last_barrier && do_barriers)
+                       ret = submit_bh(WRITE_FLUSH_FUA, bh);
+               else
                        ret = submit_bh(WRITE_SYNC, bh);
-               }
 
                if (ret)
                        errors++;
index 32d094002a57132b2113e9e8f02303f6a8b16052..43dc9ea9aef6d7ccc55e127754e1d9767cac37b3 100644 (file)
@@ -1696,7 +1696,7 @@ static void btrfs_issue_discard(struct block_device *bdev,
                                u64 start, u64 len)
 {
        blkdev_issue_discard(bdev, start >> 9, len >> 9, GFP_KERNEL,
-                       BLKDEV_IFL_WAIT | BLKDEV_IFL_BARRIER);
+                       BLKDEV_IFL_WAIT);
 }
 
 static int btrfs_discard_extent(struct btrfs_root *root, u64 bytenr,
index dd318ff280b22a18167f65e538d5215b4b03e3c5..e25e46a8b4e2540639f5d1dbcfbbb71c955f01e6 100644 (file)
@@ -398,7 +398,6 @@ static noinline int device_list_add(const char *path,
                device->work.func = pending_bios_fn;
                memcpy(device->uuid, disk_super->dev_item.uuid,
                       BTRFS_UUID_SIZE);
-               device->barriers = 1;
                spin_lock_init(&device->io_lock);
                device->name = kstrdup(path, GFP_NOFS);
                if (!device->name) {
@@ -462,7 +461,6 @@ static struct btrfs_fs_devices *clone_fs_devices(struct btrfs_fs_devices *orig)
                device->devid = orig_dev->devid;
                device->work.func = pending_bios_fn;
                memcpy(device->uuid, orig_dev->uuid, sizeof(device->uuid));
-               device->barriers = 1;
                spin_lock_init(&device->io_lock);
                INIT_LIST_HEAD(&device->dev_list);
                INIT_LIST_HEAD(&device->dev_alloc_list);
@@ -1489,7 +1487,6 @@ int btrfs_init_new_device(struct btrfs_root *root, char *device_path)
        trans = btrfs_start_transaction(root, 0);
        lock_chunks(root);
 
-       device->barriers = 1;
        device->writeable = 1;
        device->work.func = pending_bios_fn;
        generate_random_uuid(device->uuid);
@@ -3084,7 +3081,6 @@ static struct btrfs_device *add_missing_dev(struct btrfs_root *root,
                return NULL;
        list_add(&device->dev_list,
                 &fs_devices->devices);
-       device->barriers = 1;
        device->dev_root = root->fs_info->dev_root;
        device->devid = devid;
        device->work.func = pending_bios_fn;
index 31b0fabdd2ea7da5489a4bffaa065c59e9282119..2b638b6e4eeae7cb9428490a897c1e10a9aaad1f 100644 (file)
@@ -42,7 +42,6 @@ struct btrfs_device {
        int running_pending;
        u64 generation;
 
-       int barriers;
        int writeable;
        int in_fs_metadata;