782 deactivate_super(s);
783 error = -EBUSY;
784 goto error_bdev;
785 }
786
787 close_bdev_exclusive(bdev, mode);
788 } else {
789 char b[BDEVNAME_SIZE];
790
791 s->s_flags = flags;
792 s->s_mode = mode;
793 strlcpy(s->s_id, bdevname(bdev, b), sizeof(s->s_id));
794 sb_set_blocksize(s, block_size(bdev));
795 error = fill_super(s, data, flags & MS_SILENT ? 1 : 0);
796 if (error) {
797 up_write(&s->s_umount);
798 deactivate_super(s);
799 goto error;
800 }
801
802 s->s_flags |= MS_ACTIVE;
803 }
804
805 return simple_set_mnt(mnt, s);
806
807error_s:
808 error = PTR_ERR(s);
809error_bdev:
810 close_bdev_exclusive(bdev, mode);
811error:
812 return error;
813}
814
815EXPORT_SYMBOL(get_sb_bdev);
816
817void kill_block_super(struct super_block *sb)
818{
819 struct block_device *bdev = sb->s_bdev;
820 fmode_t mode = sb->s_mode;
821
822 generic_shutdown_super(sb);