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: Christoph Hellwig <hch@lst.de> Signed-off-by: Jan Kara <jack@suse.cz> Signed-off-by: Jens Axboe <axboe@fb.com>
This commit is contained in:
parent
9e11ceee23
commit
09dc9fc24b
@ -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)
|
|||||||
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 @@ get_more_pages:
|
|||||||
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)
|
|||||||
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,
|
|||||||
|
|
||||||
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,
|
|||||||
*/
|
*/
|
||||||
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 @@ fail_pg_inv_wq:
|
|||||||
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)
|
|||||||
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)
|
|||||||
*/
|
*/
|
||||||
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,
|
|||||||
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 {
|
|||||||
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;
|
||||||
|
Loading…
Reference in New Issue
Block a user