1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23#include <linux/module.h>
24#include <linux/slab.h>
25#include <linux/init.h>
26#include <linux/smp_lock.h>
27#include <linux/acct.h>
28#include <linux/blkdev.h>
29#include <linux/quotaops.h>
30#include <linux/namei.h>
31#include <linux/buffer_head.h>
32#include <linux/mount.h>
33#include <linux/security.h>
34#include <linux/syscalls.h>
35#include <linux/vfs.h>
36#include <linux/writeback.h>
37#include <linux/idr.h>
38#include <linux/kobject.h>
39#include <linux/mutex.h>
40#include <linux/file.h>
41#include <linux/async.h>
42#include <asm/uaccess.h>
43#include "internal.h"
44
45
46LIST_HEAD(super_blocks);
47DEFINE_SPINLOCK(sb_lock);
48
49
50
51
52
53
54
55
56static struct super_block *alloc_super(struct file_system_type *type)
57{
58 struct super_block *s = kzalloc(sizeof(struct super_block), GFP_USER);
59 static struct super_operations default_op;
60
61 if (s) {
62 if (security_sb_alloc(s)) {
63 kfree(s);
64 s = NULL;
65 goto out;
66 }
67 INIT_LIST_HEAD(&s->s_dirty);
68 INIT_LIST_HEAD(&s->s_io);
69 INIT_LIST_HEAD(&s->s_more_io);
70 INIT_LIST_HEAD(&s->s_files);
71 INIT_LIST_HEAD(&s->s_instances);
72 INIT_HLIST_HEAD(&s->s_anon);
73 INIT_LIST_HEAD(&s->s_inodes);
74 INIT_LIST_HEAD(&s->s_dentry_lru);
75 INIT_LIST_HEAD(&s->s_async_list);
76 init_rwsem(&s->s_umount);
77 mutex_init(&s->s_lock);
78 lockdep_set_class(&s->s_umount, &type->s_umount_key);
79
80
81
82
83
84 lockdep_set_class(&s->s_lock, &type->s_lock_key);
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100 down_write_nested(&s->s_umount, SINGLE_DEPTH_NESTING);
101 s->s_count = S_BIAS;
102 atomic_set(&s->s_active, 1);
103 mutex_init(&s->s_vfs_rename_mutex);
104 mutex_init(&s->s_dquot.dqio_mutex);
105 mutex_init(&s->s_dquot.dqonoff_mutex);
106 init_rwsem(&s->s_dquot.dqptr_sem);
107 init_waitqueue_head(&s->s_wait_unfrozen);
108 s->s_maxbytes = MAX_NON_LFS;
109 s->dq_op = sb_dquot_ops;
110 s->s_qcop = sb_quotactl_ops;
111 s->s_op = &default_op;
112 s->s_time_gran = 1000000000;
113 }
114out:
115 return s;
116}
117
118
119
120
121
122
123
124static inline void destroy_super(struct super_block *s)
125{
126 security_sb_free(s);
127 kfree(s->s_subtype);
128 kfree(s->s_options);
129 kfree(s);
130}
131
132
133
134
135
136
137
138static int __put_super(struct super_block *sb)
139{
140 int ret = 0;
141
142 if (!--sb->s_count) {
143 destroy_super(sb);
144 ret = 1;
145 }
146 return ret;
147}
148
149
150
151
152
153
154
155
156int __put_super_and_need_restart(struct super_block *sb)
157{
158
159 if (list_empty(&sb->s_list)) {
160
161 __put_super(sb);
162 return 1;
163 }
164
165 sb->s_count--;
166 BUG_ON(sb->s_count == 0);
167 return 0;
168}
169
170
171
172
173
174
175
176
177static void put_super(struct super_block *sb)
178{
179 spin_lock(&sb_lock);
180 __put_super(sb);
181 spin_unlock(&sb_lock);
182}
183
184
185
186
187
188
189
190
191
192
193
194void deactivate_super(struct super_block *s)
195{
196 struct file_system_type *fs = s->s_type;
197 if (atomic_dec_and_lock(&s->s_active, &sb_lock)) {
198 s->s_count -= S_BIAS-1;
199 spin_unlock(&sb_lock);
200 DQUOT_OFF(s, 0);
201 down_write(&s->s_umount);
202 fs->kill_sb(s);
203 put_filesystem(fs);
204 put_super(s);
205 }
206}
207
208EXPORT_SYMBOL(deactivate_super);
209
210
211
212
213
214
215
216
217
218
219
220
221static int grab_super(struct super_block *s) __releases(sb_lock)
222{
223 s->s_count++;
224 spin_unlock(&sb_lock);
225 down_write(&s->s_umount);
226 if (s->s_root) {
227 spin_lock(&sb_lock);
228 if (s->s_count > S_BIAS) {
229 atomic_inc(&s->s_active);
230 s->s_count--;
231 spin_unlock(&sb_lock);
232 return 1;
233 }
234 spin_unlock(&sb_lock);
235 }
236 up_write(&s->s_umount);
237 put_super(s);
238 yield();
239 return 0;
240}
241
242
243
244
245void lock_super(struct super_block * sb)
246{
247 get_fs_excl();
248 mutex_lock(&sb->s_lock);
249}
250
251void unlock_super(struct super_block * sb)
252{
253 put_fs_excl();
254 mutex_unlock(&sb->s_lock);
255}
256
257EXPORT_SYMBOL(lock_super);
258EXPORT_SYMBOL(unlock_super);
259
260
261
262
263
264
265
266void __fsync_super(struct super_block *sb)
267{
268 sync_inodes_sb(sb, 0);
269 DQUOT_SYNC(sb);
270 lock_super(sb);
271 if (sb->s_dirt && sb->s_op->write_super)
272 sb->s_op->write_super(sb);
273 unlock_super(sb);
274 if (sb->s_op->sync_fs)
275 sb->s_op->sync_fs(sb, 1);
276 sync_blockdev(sb->s_bdev);
277 sync_inodes_sb(sb, 1);
278}
279
280
281
282
283
284
285int fsync_super(struct super_block *sb)
286{
287 __fsync_super(sb);
288 return sync_blockdev(sb->s_bdev);
289}
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305void generic_shutdown_super(struct super_block *sb)
306{
307 const struct super_operations *sop = sb->s_op;
308
309
310 if (sb->s_root) {
311 shrink_dcache_for_umount(sb);
312 fsync_super(sb);
313 lock_super(sb);
314 sb->s_flags &= ~MS_ACTIVE;
315
316
317
318
319 async_synchronize_full_domain(&sb->s_async_list);
320
321
322 invalidate_inodes(sb);
323 lock_kernel();
324
325 if (sop->write_super && sb->s_dirt)
326 sop->write_super(sb);
327 if (sop->put_super)
328 sop->put_super(sb);
329
330
331 if (invalidate_inodes(sb)) {
332 printk("VFS: Busy inodes after unmount of %s. "
333 "Self-destruct in 5 seconds. Have a nice day...\n",
334 sb->s_id);
335 }
336
337 unlock_kernel();
338 unlock_super(sb);
339 }
340 spin_lock(&sb_lock);
341
342 list_del_init(&sb->s_list);
343 list_del(&sb->s_instances);
344 spin_unlock(&sb_lock);
345 up_write(&sb->s_umount);
346}
347
348EXPORT_SYMBOL(generic_shutdown_super);
349
350
351
352
353
354
355
356
357struct super_block *sget(struct file_system_type *type,
358 int (*test)(struct super_block *,void *),
359 int (*set)(struct super_block *,void *),
360 void *data)
361{
362 struct super_block *s = NULL;
363 struct super_block *old;
364 int err;
365
366retry:
367 spin_lock(&sb_lock);
368 if (test) {
369 list_for_each_entry(old, &type->fs_supers, s_instances) {
370 if (!test(old, data))
371 continue;
372 if (!grab_super(old))
373 goto retry;
374 if (s) {
375 up_write(&s->s_umount);
376 destroy_super(s);
377 }
378 return old;
379 }
380 }
381 if (!s) {
382 spin_unlock(&sb_lock);
383 s = alloc_super(type);
384 if (!s)
385 return ERR_PTR(-ENOMEM);
386 goto retry;
387 }
388
389 err = set(s, data);
390 if (err) {
391 spin_unlock(&sb_lock);
392 up_write(&s->s_umount);
393 destroy_super(s);
394 return ERR_PTR(err);
395 }
396 s->s_type = type;
397 strlcpy(s->s_id, type->name, sizeof(s->s_id));
398 list_add_tail(&s->s_list, &super_blocks);
399 list_add(&s->s_instances, &type->fs_supers);
400 spin_unlock(&sb_lock);
401 get_filesystem(type);
402 return s;
403}
404
405EXPORT_SYMBOL(sget);
406
407void drop_super(struct super_block *sb)
408{
409 up_read(&sb->s_umount);
410 put_super(sb);
411}
412
413EXPORT_SYMBOL(drop_super);
414
415static inline void write_super(struct super_block *sb)
416{
417 lock_super(sb);
418 if (sb->s_root && sb->s_dirt)
419 if (sb->s_op->write_super)
420 sb->s_op->write_super(sb);
421 unlock_super(sb);
422}
423
424
425
426
427
428
429void sync_supers(void)
430{
431 struct super_block *sb;
432
433 spin_lock(&sb_lock);
434restart:
435 list_for_each_entry(sb, &super_blocks, s_list) {
436 if (sb->s_dirt) {
437 sb->s_count++;
438 spin_unlock(&sb_lock);
439 down_read(&sb->s_umount);
440 write_super(sb);
441 up_read(&sb->s_umount);
442 spin_lock(&sb_lock);
443 if (__put_super_and_need_restart(sb))
444 goto restart;
445 }
446 }
447 spin_unlock(&sb_lock);
448}
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466void sync_filesystems(int wait)
467{
468 struct super_block *sb;
469 static DEFINE_MUTEX(mutex);
470
471 mutex_lock(&mutex);
472 spin_lock(&sb_lock);
473 list_for_each_entry(sb, &super_blocks, s_list) {
474 if (!sb->s_op->sync_fs)
475 continue;
476 if (sb->s_flags & MS_RDONLY)
477 continue;
478 sb->s_need_sync_fs = 1;
479 }
480
481restart:
482 list_for_each_entry(sb, &super_blocks, s_list) {
483 if (!sb->s_need_sync_fs)
484 continue;
485 sb->s_need_sync_fs = 0;
486 if (sb->s_flags & MS_RDONLY)
487 continue;
488 sb->s_count++;
489 spin_unlock(&sb_lock);
490 down_read(&sb->s_umount);
491 async_synchronize_full_domain(&sb->s_async_list);
492 if (sb->s_root && (wait || sb->s_dirt))
493 sb->s_op->sync_fs(sb, wait);
494 up_read(&sb->s_umount);
495
496 spin_lock(&sb_lock);
497 if (__put_super_and_need_restart(sb))
498 goto restart;
499 }
500 spin_unlock(&sb_lock);
501 mutex_unlock(&mutex);
502}
503
504
505
506
507
508
509
510
511
512struct super_block * get_super(struct block_device *bdev)
513{
514 struct super_block *sb;
515
516 if (!bdev)
517 return NULL;
518
519 spin_lock(&sb_lock);
520rescan:
521 list_for_each_entry(sb, &super_blocks, s_list) {
522 if (sb->s_bdev == bdev) {
523 sb->s_count++;
524 spin_unlock(&sb_lock);
525 down_read(&sb->s_umount);
526 if (sb->s_root)
527 return sb;
528 up_read(&sb->s_umount);
529
530 spin_lock(&sb_lock);
531 if (__put_super_and_need_restart(sb))
532 goto rescan;
533 }
534 }
535 spin_unlock(&sb_lock);
536 return NULL;
537}
538
539EXPORT_SYMBOL(get_super);
540
541struct super_block * user_get_super(dev_t dev)
542{
543 struct super_block *sb;
544
545 spin_lock(&sb_lock);
546rescan:
547 list_for_each_entry(sb, &super_blocks, s_list) {
548 if (sb->s_dev == dev) {
549 sb->s_count++;
550 spin_unlock(&sb_lock);
551 down_read(&sb->s_umount);
552 if (sb->s_root)
553 return sb;
554 up_read(&sb->s_umount);
555
556 spin_lock(&sb_lock);
557 if (__put_super_and_need_restart(sb))
558 goto rescan;
559 }
560 }
561 spin_unlock(&sb_lock);
562 return NULL;
563}
564
565SYSCALL_DEFINE2(ustat, unsigned, dev, struct ustat __user *, ubuf)
566{
567 struct super_block *s;
568 struct ustat tmp;
569 struct kstatfs sbuf;
570 int err = -EINVAL;
571
572 s = user_get_super(new_decode_dev(dev));
573 if (s == NULL)
574 goto out;
575 err = vfs_statfs(s->s_root, &sbuf);
576 drop_super(s);
577 if (err)
578 goto out;
579
580 memset(&tmp,0,sizeof(struct ustat));
581 tmp.f_tfree = sbuf.f_bfree;
582 tmp.f_tinode = sbuf.f_ffree;
583
584 err = copy_to_user(ubuf,&tmp,sizeof(struct ustat)) ? -EFAULT : 0;
585out:
586 return err;
587}
588
589
590
591
592
593
594
595
596
597static void mark_files_ro(struct super_block *sb)
598{
599 struct file *f;
600
601retry:
602 file_list_lock();
603 list_for_each_entry(f, &sb->s_files, f_u.fu_list) {
604 struct vfsmount *mnt;
605 if (!S_ISREG(f->f_path.dentry->d_inode->i_mode))
606 continue;
607 if (!file_count(f))
608 continue;
609 if (!(f->f_mode & FMODE_WRITE))
610 continue;
611 f->f_mode &= ~FMODE_WRITE;
612 if (file_check_writeable(f) != 0)
613 continue;
614 file_release_write(f);
615 mnt = mntget(f->f_path.mnt);
616 file_list_unlock();
617
618
619
620
621 mnt_drop_write(mnt);
622 mntput(mnt);
623 goto retry;
624 }
625 file_list_unlock();
626}
627
628
629
630
631
632
633
634
635
636
637int do_remount_sb(struct super_block *sb, int flags, void *data, int force)
638{
639 int retval;
640 int remount_rw;
641
642#ifdef CONFIG_BLOCK
643 if (!(flags & MS_RDONLY) && bdev_read_only(sb->s_bdev))
644 return -EACCES;
645#endif
646 if (flags & MS_RDONLY)
647 acct_auto_close(sb);
648 shrink_dcache_sb(sb);
649 fsync_super(sb);
650
651
652
653 if ((flags & MS_RDONLY) && !(sb->s_flags & MS_RDONLY)) {
654 if (force)
655 mark_files_ro(sb);
656 else if (!fs_may_remount_ro(sb))
657 return -EBUSY;
658 retval = DQUOT_OFF(sb, 1);
659 if (retval < 0 && retval != -ENOSYS)
660 return -EBUSY;
661 }
662 remount_rw = !(flags & MS_RDONLY) && (sb->s_flags & MS_RDONLY);
663
664 if (sb->s_op->remount_fs) {
665 lock_super(sb);
666 retval = sb->s_op->remount_fs(sb, &flags, data);
667 unlock_super(sb);
668 if (retval)
669 return retval;
670 }
671 sb->s_flags = (sb->s_flags & ~MS_RMT_MASK) | (flags & MS_RMT_MASK);
672 if (remount_rw)
673 DQUOT_ON_REMOUNT(sb);
674 return 0;
675}
676
677static void do_emergency_remount(unsigned long foo)
678{
679 struct super_block *sb;
680
681 spin_lock(&sb_lock);
682 list_for_each_entry(sb, &super_blocks, s_list) {
683 sb->s_count++;
684 spin_unlock(&sb_lock);
685 down_read(&sb->s_umount);
686 if (sb->s_root && sb->s_bdev && !(sb->s_flags & MS_RDONLY)) {
687
688
689
690
691
692 lock_kernel();
693 do_remount_sb(sb, MS_RDONLY, NULL, 1);
694 unlock_kernel();
695 }
696 drop_super(sb);
697 spin_lock(&sb_lock);
698 }
699 spin_unlock(&sb_lock);
700 printk("Emergency Remount complete\n");
701}
702
703void emergency_remount(void)
704{
705 pdflush_operation(do_emergency_remount, 0);
706}
707
708
709
710
711
712
713static DEFINE_IDA(unnamed_dev_ida);
714static DEFINE_SPINLOCK(unnamed_dev_lock);
715
716int set_anon_super(struct super_block *s, void *data)
717{
718 int dev;
719 int error;
720
721 retry:
722 if (ida_pre_get(&unnamed_dev_ida, GFP_ATOMIC) == 0)
723 return -ENOMEM;
724 spin_lock(&unnamed_dev_lock);
725 error = ida_get_new(&unnamed_dev_ida, &dev);
726 spin_unlock(&unnamed_dev_lock);
727 if (error == -EAGAIN)
728
729 goto retry;
730 else if (error)
731 return -EAGAIN;
732
733 if ((dev & MAX_ID_MASK) == (1 << MINORBITS)) {
734 spin_lock(&unnamed_dev_lock);
735 ida_remove(&unnamed_dev_ida, dev);
736 spin_unlock(&unnamed_dev_lock);
737 return -EMFILE;
738 }
739 s->s_dev = MKDEV(0, dev & MINORMASK);
740 return 0;
741}
742
743EXPORT_SYMBOL(set_anon_super);
744
745void kill_anon_super(struct super_block *sb)
746{
747 int slot = MINOR(sb->s_dev);
748
749 generic_shutdown_super(sb);
750 spin_lock(&unnamed_dev_lock);
751 ida_remove(&unnamed_dev_ida, slot);
752 spin_unlock(&unnamed_dev_lock);
753}
754
755EXPORT_SYMBOL(kill_anon_super);
756
757void kill_litter_super(struct super_block *sb)
758{
759 if (sb->s_root)
760 d_genocide(sb->s_root);
761 kill_anon_super(sb);
762}
763
764EXPORT_SYMBOL(kill_litter_super);
765
766#ifdef CONFIG_BLOCK
767static int set_bdev_super(struct super_block *s, void *data)
768{
769 s->s_bdev = data;
770 s->s_dev = s->s_bdev->bd_dev;
771 return 0;
772}
773
774static int test_bdev_super(struct super_block *s, void *data)
775{
776 return (void *)s->s_bdev == data;
777}
778
779int get_sb_bdev(struct file_system_type *fs_type,
780 int flags, const char *dev_name, void *data,
781 int (*fill_super)(struct super_block *, void *, int),
782 struct vfsmount *mnt)
783{
784 struct block_device *bdev;
785 struct super_block *s;
786 fmode_t mode = FMODE_READ;
787 int error = 0;
788
789 if (!(flags & MS_RDONLY))
790 mode |= FMODE_WRITE;
791
792 bdev = open_bdev_exclusive(dev_name, mode, fs_type);
793 if (IS_ERR(bdev))
794 return PTR_ERR(bdev);
795
796
797
798
799
800
801 down(&bdev->bd_mount_sem);
802 s = sget(fs_type, test_bdev_super, set_bdev_super, bdev);
803 up(&bdev->bd_mount_sem);
804 if (IS_ERR(s))
805 goto error_s;
806
807 if (s->s_root) {
808 if ((flags ^ s->s_flags) & MS_RDONLY) {
809 up_write(&s->s_umount);
810 deactivate_super(s);
811 error = -EBUSY;
812 goto error_bdev;
813 }
814
815 close_bdev_exclusive(bdev, mode);
816 } else {
817 char b[BDEVNAME_SIZE];
818
819 s->s_flags = flags;
820 s->s_mode = mode;
821 strlcpy(s->s_id, bdevname(bdev, b), sizeof(s->s_id));
822 sb_set_blocksize(s, block_size(bdev));
823 error = fill_super(s, data, flags & MS_SILENT ? 1 : 0);
824 if (error) {
825 up_write(&s->s_umount);
826 deactivate_super(s);
827 goto error;
828 }
829
830 s->s_flags |= MS_ACTIVE;
831 bdev->bd_super = s;
832 }
833
834 return simple_set_mnt(mnt, s);
835
836error_s:
837 error = PTR_ERR(s);
838error_bdev:
839 close_bdev_exclusive(bdev, mode);
840error:
841 return error;
842}
843
844EXPORT_SYMBOL(get_sb_bdev);
845
846void kill_block_super(struct super_block *sb)
847{
848 struct block_device *bdev = sb->s_bdev;
849 fmode_t mode = sb->s_mode;
850
851 bdev->bd_super = 0;
852 generic_shutdown_super(sb);
853 sync_blockdev(bdev);
854 close_bdev_exclusive(bdev, mode);
855}
856
857EXPORT_SYMBOL(kill_block_super);
858#endif
859
860int get_sb_nodev(struct file_system_type *fs_type,
861 int flags, void *data,
862 int (*fill_super)(struct super_block *, void *, int),
863 struct vfsmount *mnt)
864{
865 int error;
866 struct super_block *s = sget(fs_type, NULL, set_anon_super, NULL);
867
868 if (IS_ERR(s))
869 return PTR_ERR(s);
870
871 s->s_flags = flags;
872
873 error = fill_super(s, data, flags & MS_SILENT ? 1 : 0);
874 if (error) {
875 up_write(&s->s_umount);
876 deactivate_super(s);
877 return error;
878 }
879 s->s_flags |= MS_ACTIVE;
880 return simple_set_mnt(mnt, s);
881}
882
883EXPORT_SYMBOL(get_sb_nodev);
884
885static int compare_single(struct super_block *s, void *p)
886{
887 return 1;
888}
889
890int get_sb_single(struct file_system_type *fs_type,
891 int flags, void *data,
892 int (*fill_super)(struct super_block *, void *, int),
893 struct vfsmount *mnt)
894{
895 struct super_block *s;
896 int error;
897
898 s = sget(fs_type, compare_single, set_anon_super, NULL);
899 if (IS_ERR(s))
900 return PTR_ERR(s);
901 if (!s->s_root) {
902 s->s_flags = flags;
903 error = fill_super(s, data, flags & MS_SILENT ? 1 : 0);
904 if (error) {
905 up_write(&s->s_umount);
906 deactivate_super(s);
907 return error;
908 }
909 s->s_flags |= MS_ACTIVE;
910 }
911 do_remount_sb(s, flags, data, 0);
912 return simple_set_mnt(mnt, s);
913}
914
915EXPORT_SYMBOL(get_sb_single);
916
917struct vfsmount *
918vfs_kern_mount(struct file_system_type *type, int flags, const char *name, void *data)
919{
920 struct vfsmount *mnt;
921 char *secdata = NULL;
922 int error;
923
924 if (!type)
925 return ERR_PTR(-ENODEV);
926
927 error = -ENOMEM;
928 mnt = alloc_vfsmnt(name);
929 if (!mnt)
930 goto out;
931
932 if (data && !(type->fs_flags & FS_BINARY_MOUNTDATA)) {
933 secdata = alloc_secdata();
934 if (!secdata)
935 goto out_mnt;
936
937 error = security_sb_copy_data(data, secdata);
938 if (error)
939 goto out_free_secdata;
940 }
941
942 error = type->get_sb(type, flags, name, data, mnt);
943 if (error < 0)
944 goto out_free_secdata;
945 BUG_ON(!mnt->mnt_sb);
946
947 error = security_sb_kern_mount(mnt->mnt_sb, flags, secdata);
948 if (error)
949 goto out_sb;
950
951 mnt->mnt_mountpoint = mnt->mnt_root;
952 mnt->mnt_parent = mnt;
953 up_write(&mnt->mnt_sb->s_umount);
954 free_secdata(secdata);
955 return mnt;
956out_sb:
957 dput(mnt->mnt_root);
958 up_write(&mnt->mnt_sb->s_umount);
959 deactivate_super(mnt->mnt_sb);
960out_free_secdata:
961 free_secdata(secdata);
962out_mnt:
963 free_vfsmnt(mnt);
964out:
965 return ERR_PTR(error);
966}
967
968EXPORT_SYMBOL_GPL(vfs_kern_mount);
969
970static struct vfsmount *fs_set_subtype(struct vfsmount *mnt, const char *fstype)
971{
972 int err;
973 const char *subtype = strchr(fstype, '.');
974 if (subtype) {
975 subtype++;
976 err = -EINVAL;
977 if (!subtype[0])
978 goto err;
979 } else
980 subtype = "";
981
982 mnt->mnt_sb->s_subtype = kstrdup(subtype, GFP_KERNEL);
983 err = -ENOMEM;
984 if (!mnt->mnt_sb->s_subtype)
985 goto err;
986 return mnt;
987
988 err:
989 mntput(mnt);
990 return ERR_PTR(err);
991}
992
993struct vfsmount *
994do_kern_mount(const char *fstype, int flags, const char *name, void *data)
995{
996 struct file_system_type *type = get_fs_type(fstype);
997 struct vfsmount *mnt;
998 if (!type)
999 return ERR_PTR(-ENODEV);
1000 mnt = vfs_kern_mount(type, flags, name, data);
1001 if (!IS_ERR(mnt) && (type->fs_flags & FS_HAS_SUBTYPE) &&
1002 !mnt->mnt_sb->s_subtype)
1003 mnt = fs_set_subtype(mnt, fstype);
1004 put_filesystem(type);
1005 return mnt;
1006}
1007EXPORT_SYMBOL_GPL(do_kern_mount);
1008
1009struct vfsmount *kern_mount_data(struct file_system_type *type, void *data)
1010{
1011 return vfs_kern_mount(type, MS_KERNMOUNT, type->name, data);
1012}
1013
1014EXPORT_SYMBOL_GPL(kern_mount_data);
1015