forked from Minki/linux
btrfs: properly register fs backing device
btrfs assigns this bdi to all inodes on that file system, so make sure it's registered. This isn't really important now, but will be when we put dirty inodes there. Even now, we miss the stats when the bdi isn't visible. Also fixes failure to check bdi_init() return value, and bad inherit of ->capabilities flags from the default bdi. Acked-by: Chris Mason <chris.mason@oracle.com> Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
This commit is contained in:
parent
0989a025d2
commit
ad081f1430
@ -42,6 +42,8 @@
|
|||||||
static struct extent_io_ops btree_extent_io_ops;
|
static struct extent_io_ops btree_extent_io_ops;
|
||||||
static void end_workqueue_fn(struct btrfs_work *work);
|
static void end_workqueue_fn(struct btrfs_work *work);
|
||||||
|
|
||||||
|
static atomic_t btrfs_bdi_num = ATOMIC_INIT(0);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* end_io_wq structs are used to do processing in task context when an IO is
|
* end_io_wq structs are used to do processing in task context when an IO is
|
||||||
* complete. This is used during reads to verify checksums, and it is used
|
* complete. This is used during reads to verify checksums, and it is used
|
||||||
@ -1342,12 +1344,25 @@ static void btrfs_unplug_io_fn(struct backing_dev_info *bdi, struct page *page)
|
|||||||
free_extent_map(em);
|
free_extent_map(em);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If this fails, caller must call bdi_destroy() to get rid of the
|
||||||
|
* bdi again.
|
||||||
|
*/
|
||||||
static int setup_bdi(struct btrfs_fs_info *info, struct backing_dev_info *bdi)
|
static int setup_bdi(struct btrfs_fs_info *info, struct backing_dev_info *bdi)
|
||||||
{
|
{
|
||||||
bdi_init(bdi);
|
int err;
|
||||||
|
|
||||||
|
bdi->capabilities = BDI_CAP_MAP_COPY;
|
||||||
|
err = bdi_init(bdi);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
|
err = bdi_register(bdi, NULL, "btrfs-%d",
|
||||||
|
atomic_inc_return(&btrfs_bdi_num));
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
bdi->ra_pages = default_backing_dev_info.ra_pages;
|
bdi->ra_pages = default_backing_dev_info.ra_pages;
|
||||||
bdi->state = 0;
|
|
||||||
bdi->capabilities = default_backing_dev_info.capabilities;
|
|
||||||
bdi->unplug_io_fn = btrfs_unplug_io_fn;
|
bdi->unplug_io_fn = btrfs_unplug_io_fn;
|
||||||
bdi->unplug_io_data = info;
|
bdi->unplug_io_data = info;
|
||||||
bdi->congested_fn = btrfs_congested_fn;
|
bdi->congested_fn = btrfs_congested_fn;
|
||||||
@ -1569,7 +1584,8 @@ struct btrfs_root *open_ctree(struct super_block *sb,
|
|||||||
fs_info->sb = sb;
|
fs_info->sb = sb;
|
||||||
fs_info->max_extent = (u64)-1;
|
fs_info->max_extent = (u64)-1;
|
||||||
fs_info->max_inline = 8192 * 1024;
|
fs_info->max_inline = 8192 * 1024;
|
||||||
setup_bdi(fs_info, &fs_info->bdi);
|
if (setup_bdi(fs_info, &fs_info->bdi))
|
||||||
|
goto fail_bdi;
|
||||||
fs_info->btree_inode = new_inode(sb);
|
fs_info->btree_inode = new_inode(sb);
|
||||||
fs_info->btree_inode->i_ino = 1;
|
fs_info->btree_inode->i_ino = 1;
|
||||||
fs_info->btree_inode->i_nlink = 1;
|
fs_info->btree_inode->i_nlink = 1;
|
||||||
@ -1946,8 +1962,8 @@ fail_iput:
|
|||||||
|
|
||||||
btrfs_close_devices(fs_info->fs_devices);
|
btrfs_close_devices(fs_info->fs_devices);
|
||||||
btrfs_mapping_tree_free(&fs_info->mapping_tree);
|
btrfs_mapping_tree_free(&fs_info->mapping_tree);
|
||||||
|
fail_bdi:
|
||||||
bdi_destroy(&fs_info->bdi);
|
bdi_destroy(&fs_info->bdi);
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
kfree(extent_root);
|
kfree(extent_root);
|
||||||
kfree(tree_root);
|
kfree(tree_root);
|
||||||
|
Loading…
Reference in New Issue
Block a user