aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs/super.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/nfs/super.c')
-rw-r--r--fs/nfs/super.c33
1 files changed, 12 insertions, 21 deletions
diff --git a/fs/nfs/super.c b/fs/nfs/super.c
index 31a11b0e885d..322b2de02988 100644
--- a/fs/nfs/super.c
+++ b/fs/nfs/super.c
@@ -311,7 +311,6 @@ const struct super_operations nfs_sops = {
311 .destroy_inode = nfs_destroy_inode, 311 .destroy_inode = nfs_destroy_inode,
312 .write_inode = nfs_write_inode, 312 .write_inode = nfs_write_inode,
313 .drop_inode = nfs_drop_inode, 313 .drop_inode = nfs_drop_inode,
314 .put_super = nfs_put_super,
315 .statfs = nfs_statfs, 314 .statfs = nfs_statfs,
316 .evict_inode = nfs_evict_inode, 315 .evict_inode = nfs_evict_inode,
317 .umount_begin = nfs_umount_begin, 316 .umount_begin = nfs_umount_begin,
@@ -405,12 +404,15 @@ void __exit unregister_nfs_fs(void)
405 unregister_filesystem(&nfs_fs_type); 404 unregister_filesystem(&nfs_fs_type);
406} 405}
407 406
408void nfs_sb_active(struct super_block *sb) 407bool nfs_sb_active(struct super_block *sb)
409{ 408{
410 struct nfs_server *server = NFS_SB(sb); 409 struct nfs_server *server = NFS_SB(sb);
411 410
412 if (atomic_inc_return(&server->active) == 1) 411 if (!atomic_inc_not_zero(&sb->s_active))
413 atomic_inc(&sb->s_active); 412 return false;
413 if (atomic_inc_return(&server->active) != 1)
414 atomic_dec(&sb->s_active);
415 return true;
414} 416}
415EXPORT_SYMBOL_GPL(nfs_sb_active); 417EXPORT_SYMBOL_GPL(nfs_sb_active);
416 418
@@ -2569,7 +2571,7 @@ struct dentry *nfs_fs_mount_common(struct nfs_server *server,
2569 error = nfs_bdi_register(server); 2571 error = nfs_bdi_register(server);
2570 if (error) { 2572 if (error) {
2571 mntroot = ERR_PTR(error); 2573 mntroot = ERR_PTR(error);
2572 goto error_splat_bdi; 2574 goto error_splat_super;
2573 } 2575 }
2574 server->super = s; 2576 server->super = s;
2575 } 2577 }
@@ -2601,9 +2603,6 @@ error_splat_root:
2601 dput(mntroot); 2603 dput(mntroot);
2602 mntroot = ERR_PTR(error); 2604 mntroot = ERR_PTR(error);
2603error_splat_super: 2605error_splat_super:
2604 if (server && !s->s_root)
2605 bdi_unregister(&server->backing_dev_info);
2606error_splat_bdi:
2607 deactivate_locked_super(s); 2606 deactivate_locked_super(s);
2608 goto out; 2607 goto out;
2609} 2608}
@@ -2651,27 +2650,19 @@ out:
2651EXPORT_SYMBOL_GPL(nfs_fs_mount); 2650EXPORT_SYMBOL_GPL(nfs_fs_mount);
2652 2651
2653/* 2652/*
2654 * Ensure that we unregister the bdi before kill_anon_super
2655 * releases the device name
2656 */
2657void nfs_put_super(struct super_block *s)
2658{
2659 struct nfs_server *server = NFS_SB(s);
2660
2661 bdi_unregister(&server->backing_dev_info);
2662}
2663EXPORT_SYMBOL_GPL(nfs_put_super);
2664
2665/*
2666 * Destroy an NFS2/3 superblock 2653 * Destroy an NFS2/3 superblock
2667 */ 2654 */
2668void nfs_kill_super(struct super_block *s) 2655void nfs_kill_super(struct super_block *s)
2669{ 2656{
2670 struct nfs_server *server = NFS_SB(s); 2657 struct nfs_server *server = NFS_SB(s);
2658 dev_t dev = s->s_dev;
2659
2660 generic_shutdown_super(s);
2671 2661
2672 kill_anon_super(s);
2673 nfs_fscache_release_super_cookie(s); 2662 nfs_fscache_release_super_cookie(s);
2663
2674 nfs_free_server(server); 2664 nfs_free_server(server);
2665 free_anon_bdev(dev);
2675} 2666}
2676EXPORT_SYMBOL_GPL(nfs_kill_super); 2667EXPORT_SYMBOL_GPL(nfs_kill_super);
2677 2668