diff options
Diffstat (limited to 'fs/nfs/super.c')
| -rw-r--r-- | fs/nfs/super.c | 33 |
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 | ||
| 408 | void nfs_sb_active(struct super_block *sb) | 407 | bool 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 | } |
| 415 | EXPORT_SYMBOL_GPL(nfs_sb_active); | 417 | EXPORT_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); |
| 2603 | error_splat_super: | 2605 | error_splat_super: |
| 2604 | if (server && !s->s_root) | ||
| 2605 | bdi_unregister(&server->backing_dev_info); | ||
| 2606 | error_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: | |||
| 2651 | EXPORT_SYMBOL_GPL(nfs_fs_mount); | 2650 | EXPORT_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 | */ | ||
| 2657 | void 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 | } | ||
| 2663 | EXPORT_SYMBOL_GPL(nfs_put_super); | ||
| 2664 | |||
| 2665 | /* | ||
| 2666 | * Destroy an NFS2/3 superblock | 2653 | * Destroy an NFS2/3 superblock |
| 2667 | */ | 2654 | */ |
| 2668 | void nfs_kill_super(struct super_block *s) | 2655 | void 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 | } |
| 2676 | EXPORT_SYMBOL_GPL(nfs_kill_super); | 2667 | EXPORT_SYMBOL_GPL(nfs_kill_super); |
| 2677 | 2668 | ||
