Commit 09dc9fc2 authored by Jan Kara's avatar Jan Kara Committed by Jens Axboe

ceph: Convert to separately allocated bdi

Allocate struct backing_dev_info separately instead of embedding it
inside client structure. This unifies handling of bdi among users.

CC: Ilya Dryomov <idryomov@gmail.com>
CC: "Yan, Zheng" <zyan@redhat.com>
CC: Sage Weil <sage@redhat.com>
CC: ceph-devel@vger.kernel.org
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarJan Kara <jack@suse.cz>
Signed-off-by: default avatarJens Axboe <axboe@fb.com>
parent 9e11ceee
...@@ -578,7 +578,7 @@ static int writepage_nounlock(struct page *page, struct writeback_control *wbc) ...@@ -578,7 +578,7 @@ static int writepage_nounlock(struct page *page, struct writeback_control *wbc)
writeback_stat = atomic_long_inc_return(&fsc->writeback_count); writeback_stat = atomic_long_inc_return(&fsc->writeback_count);
if (writeback_stat > if (writeback_stat >
CONGESTION_ON_THRESH(fsc->mount_options->congestion_kb)) CONGESTION_ON_THRESH(fsc->mount_options->congestion_kb))
set_bdi_congested(&fsc->backing_dev_info, BLK_RW_ASYNC); set_bdi_congested(inode_to_bdi(inode), BLK_RW_ASYNC);
set_page_writeback(page); set_page_writeback(page);
err = ceph_osdc_writepages(osdc, ceph_vino(inode), err = ceph_osdc_writepages(osdc, ceph_vino(inode),
...@@ -700,7 +700,7 @@ static void writepages_finish(struct ceph_osd_request *req) ...@@ -700,7 +700,7 @@ static void writepages_finish(struct ceph_osd_request *req)
if (atomic_long_dec_return(&fsc->writeback_count) < if (atomic_long_dec_return(&fsc->writeback_count) <
CONGESTION_OFF_THRESH( CONGESTION_OFF_THRESH(
fsc->mount_options->congestion_kb)) fsc->mount_options->congestion_kb))
clear_bdi_congested(&fsc->backing_dev_info, clear_bdi_congested(inode_to_bdi(inode),
BLK_RW_ASYNC); BLK_RW_ASYNC);
if (rc < 0) if (rc < 0)
...@@ -979,7 +979,7 @@ static int ceph_writepages_start(struct address_space *mapping, ...@@ -979,7 +979,7 @@ static int ceph_writepages_start(struct address_space *mapping,
if (atomic_long_inc_return(&fsc->writeback_count) > if (atomic_long_inc_return(&fsc->writeback_count) >
CONGESTION_ON_THRESH( CONGESTION_ON_THRESH(
fsc->mount_options->congestion_kb)) { fsc->mount_options->congestion_kb)) {
set_bdi_congested(&fsc->backing_dev_info, set_bdi_congested(inode_to_bdi(inode),
BLK_RW_ASYNC); BLK_RW_ASYNC);
} }
......
...@@ -251,7 +251,7 @@ int ceph_fs_debugfs_init(struct ceph_fs_client *fsc) ...@@ -251,7 +251,7 @@ int ceph_fs_debugfs_init(struct ceph_fs_client *fsc)
goto out; goto out;
snprintf(name, sizeof(name), "../../bdi/%s", snprintf(name, sizeof(name), "../../bdi/%s",
dev_name(fsc->backing_dev_info.dev)); dev_name(fsc->sb->s_bdi->dev));
fsc->debugfs_bdi = fsc->debugfs_bdi =
debugfs_create_symlink("bdi", debugfs_create_symlink("bdi",
fsc->client->debugfs_dir, fsc->client->debugfs_dir,
......
...@@ -579,10 +579,6 @@ static struct ceph_fs_client *create_fs_client(struct ceph_mount_options *fsopt, ...@@ -579,10 +579,6 @@ static struct ceph_fs_client *create_fs_client(struct ceph_mount_options *fsopt,
atomic_long_set(&fsc->writeback_count, 0); atomic_long_set(&fsc->writeback_count, 0);
err = bdi_init(&fsc->backing_dev_info);
if (err < 0)
goto fail_client;
err = -ENOMEM; err = -ENOMEM;
/* /*
* The number of concurrent works can be high but they don't need * The number of concurrent works can be high but they don't need
...@@ -590,7 +586,7 @@ static struct ceph_fs_client *create_fs_client(struct ceph_mount_options *fsopt, ...@@ -590,7 +586,7 @@ static struct ceph_fs_client *create_fs_client(struct ceph_mount_options *fsopt,
*/ */
fsc->wb_wq = alloc_workqueue("ceph-writeback", 0, 1); fsc->wb_wq = alloc_workqueue("ceph-writeback", 0, 1);
if (fsc->wb_wq == NULL) if (fsc->wb_wq == NULL)
goto fail_bdi; goto fail_client;
fsc->pg_inv_wq = alloc_workqueue("ceph-pg-invalid", 0, 1); fsc->pg_inv_wq = alloc_workqueue("ceph-pg-invalid", 0, 1);
if (fsc->pg_inv_wq == NULL) if (fsc->pg_inv_wq == NULL)
goto fail_wb_wq; goto fail_wb_wq;
...@@ -624,8 +620,6 @@ static struct ceph_fs_client *create_fs_client(struct ceph_mount_options *fsopt, ...@@ -624,8 +620,6 @@ static struct ceph_fs_client *create_fs_client(struct ceph_mount_options *fsopt,
destroy_workqueue(fsc->pg_inv_wq); destroy_workqueue(fsc->pg_inv_wq);
fail_wb_wq: fail_wb_wq:
destroy_workqueue(fsc->wb_wq); destroy_workqueue(fsc->wb_wq);
fail_bdi:
bdi_destroy(&fsc->backing_dev_info);
fail_client: fail_client:
ceph_destroy_client(fsc->client); ceph_destroy_client(fsc->client);
fail: fail:
...@@ -643,8 +637,6 @@ static void destroy_fs_client(struct ceph_fs_client *fsc) ...@@ -643,8 +637,6 @@ static void destroy_fs_client(struct ceph_fs_client *fsc)
destroy_workqueue(fsc->pg_inv_wq); destroy_workqueue(fsc->pg_inv_wq);
destroy_workqueue(fsc->trunc_wq); destroy_workqueue(fsc->trunc_wq);
bdi_destroy(&fsc->backing_dev_info);
mempool_destroy(fsc->wb_pagevec_pool); mempool_destroy(fsc->wb_pagevec_pool);
destroy_mount_options(fsc->mount_options); destroy_mount_options(fsc->mount_options);
...@@ -937,33 +929,32 @@ static int ceph_compare_super(struct super_block *sb, void *data) ...@@ -937,33 +929,32 @@ static int ceph_compare_super(struct super_block *sb, void *data)
*/ */
static atomic_long_t bdi_seq = ATOMIC_LONG_INIT(0); static atomic_long_t bdi_seq = ATOMIC_LONG_INIT(0);
static int ceph_register_bdi(struct super_block *sb, static int ceph_setup_bdi(struct super_block *sb, struct ceph_fs_client *fsc)
struct ceph_fs_client *fsc)
{ {
int err; int err;
err = super_setup_bdi_name(sb, "ceph-%ld",
atomic_long_inc_return(&bdi_seq));
if (err)
return err;
/* set ra_pages based on rasize mount option? */ /* set ra_pages based on rasize mount option? */
if (fsc->mount_options->rasize >= PAGE_SIZE) if (fsc->mount_options->rasize >= PAGE_SIZE)
fsc->backing_dev_info.ra_pages = sb->s_bdi->ra_pages =
(fsc->mount_options->rasize + PAGE_SIZE - 1) (fsc->mount_options->rasize + PAGE_SIZE - 1)
>> PAGE_SHIFT; >> PAGE_SHIFT;
else else
fsc->backing_dev_info.ra_pages = sb->s_bdi->ra_pages = VM_MAX_READAHEAD * 1024 / PAGE_SIZE;
VM_MAX_READAHEAD * 1024 / PAGE_SIZE;
if (fsc->mount_options->rsize > fsc->mount_options->rasize && if (fsc->mount_options->rsize > fsc->mount_options->rasize &&
fsc->mount_options->rsize >= PAGE_SIZE) fsc->mount_options->rsize >= PAGE_SIZE)
fsc->backing_dev_info.io_pages = sb->s_bdi->io_pages =
(fsc->mount_options->rsize + PAGE_SIZE - 1) (fsc->mount_options->rsize + PAGE_SIZE - 1)
>> PAGE_SHIFT; >> PAGE_SHIFT;
else if (fsc->mount_options->rsize == 0) else if (fsc->mount_options->rsize == 0)
fsc->backing_dev_info.io_pages = ULONG_MAX; sb->s_bdi->io_pages = ULONG_MAX;
err = bdi_register(&fsc->backing_dev_info, NULL, "ceph-%ld", return 0;
atomic_long_inc_return(&bdi_seq));
if (!err)
sb->s_bdi = &fsc->backing_dev_info;
return err;
} }
static struct dentry *ceph_mount(struct file_system_type *fs_type, static struct dentry *ceph_mount(struct file_system_type *fs_type,
...@@ -1018,7 +1009,7 @@ static struct dentry *ceph_mount(struct file_system_type *fs_type, ...@@ -1018,7 +1009,7 @@ static struct dentry *ceph_mount(struct file_system_type *fs_type,
dout("get_sb got existing client %p\n", fsc); dout("get_sb got existing client %p\n", fsc);
} else { } else {
dout("get_sb using new client %p\n", fsc); dout("get_sb using new client %p\n", fsc);
err = ceph_register_bdi(sb, fsc); err = ceph_setup_bdi(sb, fsc);
if (err < 0) { if (err < 0) {
res = ERR_PTR(err); res = ERR_PTR(err);
goto out_splat; goto out_splat;
......
...@@ -92,8 +92,6 @@ struct ceph_fs_client { ...@@ -92,8 +92,6 @@ struct ceph_fs_client {
struct workqueue_struct *trunc_wq; struct workqueue_struct *trunc_wq;
atomic_long_t writeback_count; atomic_long_t writeback_count;
struct backing_dev_info backing_dev_info;
#ifdef CONFIG_DEBUG_FS #ifdef CONFIG_DEBUG_FS
struct dentry *debugfs_dentry_lru, *debugfs_caps; struct dentry *debugfs_dentry_lru, *debugfs_caps;
struct dentry *debugfs_congestion_kb; struct dentry *debugfs_congestion_kb;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment