Skip to content

Commit

Permalink
btrfs: properly register fs backing device
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Jens Axboe committed Jun 16, 2009
1 parent 0989a02 commit ad081f1
Showing 1 changed file with 21 additions and 5 deletions.
26 changes: 21 additions & 5 deletions fs/btrfs/disk-io.c
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@
static struct extent_io_ops btree_extent_io_ops;
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
* complete. This is used during reads to verify checksums, and it is used
Expand Down Expand Up @@ -1342,12 +1344,25 @@ static void btrfs_unplug_io_fn(struct backing_dev_info *bdi, struct page *page)
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)
{
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->state = 0;
bdi->capabilities = default_backing_dev_info.capabilities;
bdi->unplug_io_fn = btrfs_unplug_io_fn;
bdi->unplug_io_data = info;
bdi->congested_fn = btrfs_congested_fn;
Expand Down Expand Up @@ -1569,7 +1584,8 @@ struct btrfs_root *open_ctree(struct super_block *sb,
fs_info->sb = sb;
fs_info->max_extent = (u64)-1;
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->i_ino = 1;
fs_info->btree_inode->i_nlink = 1;
Expand Down Expand Up @@ -1946,8 +1962,8 @@ struct btrfs_root *open_ctree(struct super_block *sb,

btrfs_close_devices(fs_info->fs_devices);
btrfs_mapping_tree_free(&fs_info->mapping_tree);
fail_bdi:
bdi_destroy(&fs_info->bdi);

fail:
kfree(extent_root);
kfree(tree_root);
Expand Down

0 comments on commit ad081f1

Please sign in to comment.