aboutsummaryrefslogtreecommitdiffstats
path: root/fs/super.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/super.c')
-rw-r--r--fs/super.c26
1 files changed, 16 insertions, 10 deletions
diff --git a/fs/super.c b/fs/super.c
index 823e061faa87..7e9dd4cc2c01 100644
--- a/fs/super.c
+++ b/fs/super.c
@@ -177,6 +177,11 @@ void deactivate_locked_super(struct super_block *s)
177 struct file_system_type *fs = s->s_type; 177 struct file_system_type *fs = s->s_type;
178 if (atomic_dec_and_test(&s->s_active)) { 178 if (atomic_dec_and_test(&s->s_active)) {
179 fs->kill_sb(s); 179 fs->kill_sb(s);
180 /*
181 * We need to call rcu_barrier so all the delayed rcu free
182 * inodes are flushed before we release the fs module.
183 */
184 rcu_barrier();
180 put_filesystem(fs); 185 put_filesystem(fs);
181 put_super(s); 186 put_super(s);
182 } else { 187 } else {
@@ -767,13 +772,13 @@ struct dentry *mount_bdev(struct file_system_type *fs_type,
767{ 772{
768 struct block_device *bdev; 773 struct block_device *bdev;
769 struct super_block *s; 774 struct super_block *s;
770 fmode_t mode = FMODE_READ; 775 fmode_t mode = FMODE_READ | FMODE_EXCL;
771 int error = 0; 776 int error = 0;
772 777
773 if (!(flags & MS_RDONLY)) 778 if (!(flags & MS_RDONLY))
774 mode |= FMODE_WRITE; 779 mode |= FMODE_WRITE;
775 780
776 bdev = open_bdev_exclusive(dev_name, mode, fs_type); 781 bdev = blkdev_get_by_path(dev_name, mode, fs_type);
777 if (IS_ERR(bdev)) 782 if (IS_ERR(bdev))
778 return ERR_CAST(bdev); 783 return ERR_CAST(bdev);
779 784
@@ -802,13 +807,13 @@ struct dentry *mount_bdev(struct file_system_type *fs_type,
802 807
803 /* 808 /*
804 * s_umount nests inside bd_mutex during 809 * s_umount nests inside bd_mutex during
805 * __invalidate_device(). close_bdev_exclusive() 810 * __invalidate_device(). blkdev_put() acquires
806 * acquires bd_mutex and can't be called under 811 * bd_mutex and can't be called under s_umount. Drop
807 * s_umount. Drop s_umount temporarily. This is safe 812 * s_umount temporarily. This is safe as we're
808 * as we're holding an active reference. 813 * holding an active reference.
809 */ 814 */
810 up_write(&s->s_umount); 815 up_write(&s->s_umount);
811 close_bdev_exclusive(bdev, mode); 816 blkdev_put(bdev, mode);
812 down_write(&s->s_umount); 817 down_write(&s->s_umount);
813 } else { 818 } else {
814 char b[BDEVNAME_SIZE]; 819 char b[BDEVNAME_SIZE];
@@ -832,7 +837,7 @@ struct dentry *mount_bdev(struct file_system_type *fs_type,
832error_s: 837error_s:
833 error = PTR_ERR(s); 838 error = PTR_ERR(s);
834error_bdev: 839error_bdev:
835 close_bdev_exclusive(bdev, mode); 840 blkdev_put(bdev, mode);
836error: 841error:
837 return ERR_PTR(error); 842 return ERR_PTR(error);
838} 843}
@@ -863,7 +868,8 @@ void kill_block_super(struct super_block *sb)
863 bdev->bd_super = NULL; 868 bdev->bd_super = NULL;
864 generic_shutdown_super(sb); 869 generic_shutdown_super(sb);
865 sync_blockdev(bdev); 870 sync_blockdev(bdev);
866 close_bdev_exclusive(bdev, mode); 871 WARN_ON_ONCE(!(mode & FMODE_EXCL));
872 blkdev_put(bdev, mode | FMODE_EXCL);
867} 873}
868 874
869EXPORT_SYMBOL(kill_block_super); 875EXPORT_SYMBOL(kill_block_super);
@@ -1140,7 +1146,7 @@ static struct vfsmount *fs_set_subtype(struct vfsmount *mnt, const char *fstype)
1140 return mnt; 1146 return mnt;
1141 1147
1142 err: 1148 err:
1143 mntput_long(mnt); 1149 mntput(mnt);
1144 return ERR_PTR(err); 1150 return ERR_PTR(err);
1145} 1151}
1146 1152