Commit b85c4298 authored by Al Viro's avatar Al Viro
Browse files

btrfs_get_bdev_and_sb(): call set_blocksize() only for exclusive opens



btrfs_get_bdev_and_sb() has two callers - btrfs_open_one_device(),
which asks for open to be exclusive and btrfs_get_dev_args_from_path(),
which doesn't.  Currently it does set_blocksize() in all cases.

I'm rather dubious about the need to do set_blocksize() anywhere in btrfs,
to be honest - there's some access to page cache of underlying block
devices in there, but it's nowhere near the hot paths, AFAICT.

In any case, btrfs_get_dev_args_from_path() only needs to read
the on-disk superblock and copy several fields out of it; all
callers are only interested in devices that are already opened
and brought into per-filesystem set, so setting the block size
is redundant for those and actively harmful if we are given
a pathname of unrelated device.

So we only need btrfs_get_bdev_and_sb() to call set_blocksize()
when it's asked to open exclusive.

Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarChristian Brauner <brauner@kernel.org>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent b1439b17
Loading
Loading
Loading
Loading
+7 −4
Original line number Diff line number Diff line
@@ -482,11 +482,13 @@ btrfs_get_bdev_and_sb(const char *device_path, blk_mode_t flags, void *holder,

	if (flush)
		sync_blockdev(bdev);
	if (holder) {
		ret = set_blocksize(bdev, BTRFS_BDEV_BLOCKSIZE);
		if (ret) {
			fput(*bdev_file);
			goto error;
		}
	}
	invalidate_bdev(bdev);
	*disk_super = btrfs_read_dev_super(bdev);
	if (IS_ERR(*disk_super)) {
@@ -498,6 +500,7 @@ btrfs_get_bdev_and_sb(const char *device_path, blk_mode_t flags, void *holder,
	return 0;

error:
	*disk_super = NULL;
	*bdev_file = NULL;
	return ret;
}