diff options
Diffstat (limited to 'fs/super.c')
-rw-r--r-- | fs/super.c | 26 |
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, | |||
832 | error_s: | 837 | error_s: |
833 | error = PTR_ERR(s); | 838 | error = PTR_ERR(s); |
834 | error_bdev: | 839 | error_bdev: |
835 | close_bdev_exclusive(bdev, mode); | 840 | blkdev_put(bdev, mode); |
836 | error: | 841 | error: |
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 | ||
869 | EXPORT_SYMBOL(kill_block_super); | 875 | EXPORT_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 | ||