diff options
author | Jan Kara <jack@suse.cz> | 2017-04-12 06:24:45 -0400 |
---|---|---|
committer | Jens Axboe <axboe@fb.com> | 2017-04-20 14:09:55 -0400 |
commit | 0db10944a76ba09f37d43b99d0fe085a18307f22 (patch) | |
tree | 0dc08217910a281c96b57f92ef0a18cc2cdd8163 /fs | |
parent | a0349ec00f3cb8a9401d065e5db3a5d738e94a89 (diff) |
nfs: Convert to separately allocated bdi
Allocate struct backing_dev_info separately instead of embedding it
inside the superblock. This unifies handling of bdi among users.
CC: Anna Schumaker <anna.schumaker@netapp.com>
CC: linux-nfs@vger.kernel.org
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jan Kara <jack@suse.cz>
Acked-by: Trond Myklebust <trond.myklebust@primarydata.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/nfs/client.c | 10 | ||||
-rw-r--r-- | fs/nfs/internal.h | 6 | ||||
-rw-r--r-- | fs/nfs/super.c | 34 | ||||
-rw-r--r-- | fs/nfs/write.c | 13 |
4 files changed, 28 insertions, 35 deletions
diff --git a/fs/nfs/client.c b/fs/nfs/client.c index 390ada8741bc..04d15a0045e3 100644 --- a/fs/nfs/client.c +++ b/fs/nfs/client.c | |||
@@ -761,9 +761,6 @@ static void nfs_server_set_fsinfo(struct nfs_server *server, | |||
761 | server->rsize = NFS_MAX_FILE_IO_SIZE; | 761 | server->rsize = NFS_MAX_FILE_IO_SIZE; |
762 | server->rpages = (server->rsize + PAGE_SIZE - 1) >> PAGE_SHIFT; | 762 | server->rpages = (server->rsize + PAGE_SIZE - 1) >> PAGE_SHIFT; |
763 | 763 | ||
764 | server->backing_dev_info.name = "nfs"; | ||
765 | server->backing_dev_info.ra_pages = server->rpages * NFS_MAX_READAHEAD; | ||
766 | |||
767 | if (server->wsize > max_rpc_payload) | 764 | if (server->wsize > max_rpc_payload) |
768 | server->wsize = max_rpc_payload; | 765 | server->wsize = max_rpc_payload; |
769 | if (server->wsize > NFS_MAX_FILE_IO_SIZE) | 766 | if (server->wsize > NFS_MAX_FILE_IO_SIZE) |
@@ -917,12 +914,6 @@ struct nfs_server *nfs_alloc_server(void) | |||
917 | return NULL; | 914 | return NULL; |
918 | } | 915 | } |
919 | 916 | ||
920 | if (bdi_init(&server->backing_dev_info)) { | ||
921 | nfs_free_iostats(server->io_stats); | ||
922 | kfree(server); | ||
923 | return NULL; | ||
924 | } | ||
925 | |||
926 | ida_init(&server->openowner_id); | 917 | ida_init(&server->openowner_id); |
927 | ida_init(&server->lockowner_id); | 918 | ida_init(&server->lockowner_id); |
928 | pnfs_init_server(server); | 919 | pnfs_init_server(server); |
@@ -953,7 +944,6 @@ void nfs_free_server(struct nfs_server *server) | |||
953 | ida_destroy(&server->lockowner_id); | 944 | ida_destroy(&server->lockowner_id); |
954 | ida_destroy(&server->openowner_id); | 945 | ida_destroy(&server->openowner_id); |
955 | nfs_free_iostats(server->io_stats); | 946 | nfs_free_iostats(server->io_stats); |
956 | bdi_destroy(&server->backing_dev_info); | ||
957 | kfree(server); | 947 | kfree(server); |
958 | nfs_release_automount_timer(); | 948 | nfs_release_automount_timer(); |
959 | dprintk("<-- nfs_free_server()\n"); | 949 | dprintk("<-- nfs_free_server()\n"); |
diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h index 7b38fedb7e03..9dc65d7ae754 100644 --- a/fs/nfs/internal.h +++ b/fs/nfs/internal.h | |||
@@ -139,7 +139,7 @@ struct nfs_mount_request { | |||
139 | }; | 139 | }; |
140 | 140 | ||
141 | struct nfs_mount_info { | 141 | struct nfs_mount_info { |
142 | void (*fill_super)(struct super_block *, struct nfs_mount_info *); | 142 | int (*fill_super)(struct super_block *, struct nfs_mount_info *); |
143 | int (*set_security)(struct super_block *, struct dentry *, struct nfs_mount_info *); | 143 | int (*set_security)(struct super_block *, struct dentry *, struct nfs_mount_info *); |
144 | struct nfs_parsed_mount_data *parsed; | 144 | struct nfs_parsed_mount_data *parsed; |
145 | struct nfs_clone_mount *cloned; | 145 | struct nfs_clone_mount *cloned; |
@@ -407,7 +407,7 @@ struct dentry *nfs_fs_mount(struct file_system_type *, int, const char *, void * | |||
407 | struct dentry * nfs_xdev_mount_common(struct file_system_type *, int, | 407 | struct dentry * nfs_xdev_mount_common(struct file_system_type *, int, |
408 | const char *, struct nfs_mount_info *); | 408 | const char *, struct nfs_mount_info *); |
409 | void nfs_kill_super(struct super_block *); | 409 | void nfs_kill_super(struct super_block *); |
410 | void nfs_fill_super(struct super_block *, struct nfs_mount_info *); | 410 | int nfs_fill_super(struct super_block *, struct nfs_mount_info *); |
411 | 411 | ||
412 | extern struct rpc_stat nfs_rpcstat; | 412 | extern struct rpc_stat nfs_rpcstat; |
413 | 413 | ||
@@ -458,7 +458,7 @@ extern void nfs_read_prepare(struct rpc_task *task, void *calldata); | |||
458 | extern void nfs_pageio_reset_read_mds(struct nfs_pageio_descriptor *pgio); | 458 | extern void nfs_pageio_reset_read_mds(struct nfs_pageio_descriptor *pgio); |
459 | 459 | ||
460 | /* super.c */ | 460 | /* super.c */ |
461 | void nfs_clone_super(struct super_block *, struct nfs_mount_info *); | 461 | int nfs_clone_super(struct super_block *, struct nfs_mount_info *); |
462 | void nfs_umount_begin(struct super_block *); | 462 | void nfs_umount_begin(struct super_block *); |
463 | int nfs_statfs(struct dentry *, struct kstatfs *); | 463 | int nfs_statfs(struct dentry *, struct kstatfs *); |
464 | int nfs_show_options(struct seq_file *, struct dentry *); | 464 | int nfs_show_options(struct seq_file *, struct dentry *); |
diff --git a/fs/nfs/super.c b/fs/nfs/super.c index 54e0f9f2dd94..8d97aa70407e 100644 --- a/fs/nfs/super.c +++ b/fs/nfs/super.c | |||
@@ -2315,18 +2315,17 @@ inline void nfs_initialise_sb(struct super_block *sb) | |||
2315 | sb->s_blocksize = nfs_block_bits(server->wsize, | 2315 | sb->s_blocksize = nfs_block_bits(server->wsize, |
2316 | &sb->s_blocksize_bits); | 2316 | &sb->s_blocksize_bits); |
2317 | 2317 | ||
2318 | sb->s_bdi = &server->backing_dev_info; | ||
2319 | |||
2320 | nfs_super_set_maxbytes(sb, server->maxfilesize); | 2318 | nfs_super_set_maxbytes(sb, server->maxfilesize); |
2321 | } | 2319 | } |
2322 | 2320 | ||
2323 | /* | 2321 | /* |
2324 | * Finish setting up an NFS2/3 superblock | 2322 | * Finish setting up an NFS2/3 superblock |
2325 | */ | 2323 | */ |
2326 | void nfs_fill_super(struct super_block *sb, struct nfs_mount_info *mount_info) | 2324 | int nfs_fill_super(struct super_block *sb, struct nfs_mount_info *mount_info) |
2327 | { | 2325 | { |
2328 | struct nfs_parsed_mount_data *data = mount_info->parsed; | 2326 | struct nfs_parsed_mount_data *data = mount_info->parsed; |
2329 | struct nfs_server *server = NFS_SB(sb); | 2327 | struct nfs_server *server = NFS_SB(sb); |
2328 | int ret; | ||
2330 | 2329 | ||
2331 | sb->s_blocksize_bits = 0; | 2330 | sb->s_blocksize_bits = 0; |
2332 | sb->s_blocksize = 0; | 2331 | sb->s_blocksize = 0; |
@@ -2344,13 +2343,21 @@ void nfs_fill_super(struct super_block *sb, struct nfs_mount_info *mount_info) | |||
2344 | } | 2343 | } |
2345 | 2344 | ||
2346 | nfs_initialise_sb(sb); | 2345 | nfs_initialise_sb(sb); |
2346 | |||
2347 | ret = super_setup_bdi_name(sb, "%u:%u", MAJOR(server->s_dev), | ||
2348 | MINOR(server->s_dev)); | ||
2349 | if (ret) | ||
2350 | return ret; | ||
2351 | sb->s_bdi->ra_pages = server->rpages * NFS_MAX_READAHEAD; | ||
2352 | return 0; | ||
2353 | |||
2347 | } | 2354 | } |
2348 | EXPORT_SYMBOL_GPL(nfs_fill_super); | 2355 | EXPORT_SYMBOL_GPL(nfs_fill_super); |
2349 | 2356 | ||
2350 | /* | 2357 | /* |
2351 | * Finish setting up a cloned NFS2/3/4 superblock | 2358 | * Finish setting up a cloned NFS2/3/4 superblock |
2352 | */ | 2359 | */ |
2353 | void nfs_clone_super(struct super_block *sb, struct nfs_mount_info *mount_info) | 2360 | int nfs_clone_super(struct super_block *sb, struct nfs_mount_info *mount_info) |
2354 | { | 2361 | { |
2355 | const struct super_block *old_sb = mount_info->cloned->sb; | 2362 | const struct super_block *old_sb = mount_info->cloned->sb; |
2356 | struct nfs_server *server = NFS_SB(sb); | 2363 | struct nfs_server *server = NFS_SB(sb); |
@@ -2370,6 +2377,11 @@ void nfs_clone_super(struct super_block *sb, struct nfs_mount_info *mount_info) | |||
2370 | } | 2377 | } |
2371 | 2378 | ||
2372 | nfs_initialise_sb(sb); | 2379 | nfs_initialise_sb(sb); |
2380 | |||
2381 | sb->s_bdi = bdi_get(old_sb->s_bdi); | ||
2382 | sb->s_iflags |= SB_I_DYNBDI; | ||
2383 | |||
2384 | return 0; | ||
2373 | } | 2385 | } |
2374 | 2386 | ||
2375 | static int nfs_compare_mount_options(const struct super_block *s, const struct nfs_server *b, int flags) | 2387 | static int nfs_compare_mount_options(const struct super_block *s, const struct nfs_server *b, int flags) |
@@ -2522,11 +2534,6 @@ static void nfs_get_cache_cookie(struct super_block *sb, | |||
2522 | } | 2534 | } |
2523 | #endif | 2535 | #endif |
2524 | 2536 | ||
2525 | static int nfs_bdi_register(struct nfs_server *server) | ||
2526 | { | ||
2527 | return bdi_register_dev(&server->backing_dev_info, server->s_dev); | ||
2528 | } | ||
2529 | |||
2530 | int nfs_set_sb_security(struct super_block *s, struct dentry *mntroot, | 2537 | int nfs_set_sb_security(struct super_block *s, struct dentry *mntroot, |
2531 | struct nfs_mount_info *mount_info) | 2538 | struct nfs_mount_info *mount_info) |
2532 | { | 2539 | { |
@@ -2594,17 +2601,14 @@ struct dentry *nfs_fs_mount_common(struct nfs_server *server, | |||
2594 | nfs_free_server(server); | 2601 | nfs_free_server(server); |
2595 | server = NULL; | 2602 | server = NULL; |
2596 | } else { | 2603 | } else { |
2597 | error = nfs_bdi_register(server); | ||
2598 | if (error) { | ||
2599 | mntroot = ERR_PTR(error); | ||
2600 | goto error_splat_super; | ||
2601 | } | ||
2602 | server->super = s; | 2604 | server->super = s; |
2603 | } | 2605 | } |
2604 | 2606 | ||
2605 | if (!s->s_root) { | 2607 | if (!s->s_root) { |
2606 | /* initial superblock/root creation */ | 2608 | /* initial superblock/root creation */ |
2607 | mount_info->fill_super(s, mount_info); | 2609 | error = mount_info->fill_super(s, mount_info); |
2610 | if (error) | ||
2611 | goto error_splat_super; | ||
2608 | nfs_get_cache_cookie(s, mount_info->parsed, mount_info->cloned); | 2612 | nfs_get_cache_cookie(s, mount_info->parsed, mount_info->cloned); |
2609 | } | 2613 | } |
2610 | 2614 | ||
diff --git a/fs/nfs/write.c b/fs/nfs/write.c index abb2c8a3be42..cc341fc7fd44 100644 --- a/fs/nfs/write.c +++ b/fs/nfs/write.c | |||
@@ -263,16 +263,15 @@ int nfs_congestion_kb; | |||
263 | 263 | ||
264 | static void nfs_set_page_writeback(struct page *page) | 264 | static void nfs_set_page_writeback(struct page *page) |
265 | { | 265 | { |
266 | struct nfs_server *nfss = NFS_SERVER(page_file_mapping(page)->host); | 266 | struct inode *inode = page_file_mapping(page)->host; |
267 | struct nfs_server *nfss = NFS_SERVER(inode); | ||
267 | int ret = test_set_page_writeback(page); | 268 | int ret = test_set_page_writeback(page); |
268 | 269 | ||
269 | WARN_ON_ONCE(ret != 0); | 270 | WARN_ON_ONCE(ret != 0); |
270 | 271 | ||
271 | if (atomic_long_inc_return(&nfss->writeback) > | 272 | if (atomic_long_inc_return(&nfss->writeback) > |
272 | NFS_CONGESTION_ON_THRESH) { | 273 | NFS_CONGESTION_ON_THRESH) |
273 | set_bdi_congested(&nfss->backing_dev_info, | 274 | set_bdi_congested(inode_to_bdi(inode), BLK_RW_ASYNC); |
274 | BLK_RW_ASYNC); | ||
275 | } | ||
276 | } | 275 | } |
277 | 276 | ||
278 | static void nfs_end_page_writeback(struct nfs_page *req) | 277 | static void nfs_end_page_writeback(struct nfs_page *req) |
@@ -285,7 +284,7 @@ static void nfs_end_page_writeback(struct nfs_page *req) | |||
285 | 284 | ||
286 | end_page_writeback(req->wb_page); | 285 | end_page_writeback(req->wb_page); |
287 | if (atomic_long_dec_return(&nfss->writeback) < NFS_CONGESTION_OFF_THRESH) | 286 | if (atomic_long_dec_return(&nfss->writeback) < NFS_CONGESTION_OFF_THRESH) |
288 | clear_bdi_congested(&nfss->backing_dev_info, BLK_RW_ASYNC); | 287 | clear_bdi_congested(inode_to_bdi(inode), BLK_RW_ASYNC); |
289 | } | 288 | } |
290 | 289 | ||
291 | 290 | ||
@@ -1808,7 +1807,7 @@ static void nfs_commit_release_pages(struct nfs_commit_data *data) | |||
1808 | } | 1807 | } |
1809 | nfss = NFS_SERVER(data->inode); | 1808 | nfss = NFS_SERVER(data->inode); |
1810 | if (atomic_long_read(&nfss->writeback) < NFS_CONGESTION_OFF_THRESH) | 1809 | if (atomic_long_read(&nfss->writeback) < NFS_CONGESTION_OFF_THRESH) |
1811 | clear_bdi_congested(&nfss->backing_dev_info, BLK_RW_ASYNC); | 1810 | clear_bdi_congested(inode_to_bdi(data->inode), BLK_RW_ASYNC); |
1812 | 1811 | ||
1813 | nfs_init_cinfo(&cinfo, data->inode, data->dreq); | 1812 | nfs_init_cinfo(&cinfo, data->inode, data->dreq); |
1814 | nfs_commit_end(cinfo.mds); | 1813 | nfs_commit_end(cinfo.mds); |