Commit c3b9a62c authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Jens Axboe
Browse files

btrfs: replace barriers with explicit flush / FUA usage



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: default avatarChristoph Hellwig <hch@lst.de>
Acked-by: default avatarChris Mason <chris.mason@oracle.com>
Signed-off-by: default avatarTejun Heo <tj@kernel.org>
Signed-off-by: default avatarJens Axboe <jaxboe@fusionio.com>
parent 80f6c29d
Loading
Loading
Loading
Loading
+4 −15
Original line number Diff line number Diff line
@@ -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++;
+1 −1
Original line number Diff line number Diff line
@@ -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,
+0 −4
Original line number Diff line number Diff line
@@ -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;
+0 −1
Original line number Diff line number Diff line
@@ -42,7 +42,6 @@ struct btrfs_device {
	int running_pending;
	u64 generation;

	int barriers;
	int writeable;
	int in_fs_metadata;