super.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:21k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/fs/super.c
  3.  *
  4.  *  Copyright (C) 1991, 1992  Linus Torvalds
  5.  *
  6.  *  super.c contains code to handle: - mount structures
  7.  *                                   - super-block tables
  8.  *                                   - filesystem drivers list
  9.  *                                   - mount system call
  10.  *                                   - umount system call
  11.  *                                   - ustat system call
  12.  *
  13.  * GK 2/5/95  -  Changed to support mounting the root fs via NFS
  14.  *
  15.  *  Added kerneld support: Jacques Gelinas and Bjorn Ekwall
  16.  *  Added change_root: Werner Almesberger & Hans Lermen, Feb '96
  17.  *  Added options to /proc/mounts:
  18.  *    Torbj鰎n Lindh (torbjorn.lindh@gopta.se), April 14, 1996.
  19.  *  Added devfs support: Richard Gooch <rgooch@atnf.csiro.au>, 13-JAN-1998
  20.  *  Heavily rewritten for 'one fs - one tree' dcache architecture. AV, Mar 2000
  21.  */
  22. #include <linux/config.h>
  23. #include <linux/slab.h>
  24. #include <linux/locks.h>
  25. #include <linux/smp_lock.h>
  26. #include <linux/devfs_fs_kernel.h>
  27. #include <linux/major.h>
  28. #include <linux/acct.h>
  29. #include <asm/uaccess.h>
  30. #include <linux/kmod.h>
  31. #define __NO_VERSION__
  32. #include <linux/module.h>
  33. LIST_HEAD(super_blocks);
  34. spinlock_t sb_lock = SPIN_LOCK_UNLOCKED;
  35. /*
  36.  * Handling of filesystem drivers list.
  37.  * Rules:
  38.  * Inclusion to/removals from/scanning of list are protected by spinlock.
  39.  * During the unload module must call unregister_filesystem().
  40.  * We can access the fields of list element if:
  41.  * 1) spinlock is held or
  42.  * 2) we hold the reference to the module.
  43.  * The latter can be guaranteed by call of try_inc_mod_count(); if it
  44.  * returned 0 we must skip the element, otherwise we got the reference.
  45.  * Once the reference is obtained we can drop the spinlock.
  46.  */
  47. static struct file_system_type *file_systems;
  48. static rwlock_t file_systems_lock = RW_LOCK_UNLOCKED;
  49. /* WARNING: This can be used only if we _already_ own a reference */
  50. static void get_filesystem(struct file_system_type *fs)
  51. {
  52. if (fs->owner)
  53. __MOD_INC_USE_COUNT(fs->owner);
  54. }
  55. static void put_filesystem(struct file_system_type *fs)
  56. {
  57. if (fs->owner)
  58. __MOD_DEC_USE_COUNT(fs->owner);
  59. }
  60. static struct file_system_type **find_filesystem(const char *name)
  61. {
  62. struct file_system_type **p;
  63. for (p=&file_systems; *p; p=&(*p)->next)
  64. if (strcmp((*p)->name,name) == 0)
  65. break;
  66. return p;
  67. }
  68. /**
  69.  * register_filesystem - register a new filesystem
  70.  * @fs: the file system structure
  71.  *
  72.  * Adds the file system passed to the list of file systems the kernel
  73.  * is aware of for mount and other syscalls. Returns 0 on success,
  74.  * or a negative errno code on an error.
  75.  *
  76.  * The &struct file_system_type that is passed is linked into the kernel 
  77.  * structures and must not be freed until the file system has been
  78.  * unregistered.
  79.  */
  80.  
  81. int register_filesystem(struct file_system_type * fs)
  82. {
  83. int res = 0;
  84. struct file_system_type ** p;
  85. if (!fs)
  86. return -EINVAL;
  87. if (fs->next)
  88. return -EBUSY;
  89. INIT_LIST_HEAD(&fs->fs_supers);
  90. write_lock(&file_systems_lock);
  91. p = find_filesystem(fs->name);
  92. if (*p)
  93. res = -EBUSY;
  94. else
  95. *p = fs;
  96. write_unlock(&file_systems_lock);
  97. return res;
  98. }
  99. /**
  100.  * unregister_filesystem - unregister a file system
  101.  * @fs: filesystem to unregister
  102.  *
  103.  * Remove a file system that was previously successfully registered
  104.  * with the kernel. An error is returned if the file system is not found.
  105.  * Zero is returned on a success.
  106.  *
  107.  * Once this function has returned the &struct file_system_type structure
  108.  * may be freed or reused.
  109.  */
  110.  
  111. int unregister_filesystem(struct file_system_type * fs)
  112. {
  113. struct file_system_type ** tmp;
  114. write_lock(&file_systems_lock);
  115. tmp = &file_systems;
  116. while (*tmp) {
  117. if (fs == *tmp) {
  118. *tmp = fs->next;
  119. fs->next = NULL;
  120. write_unlock(&file_systems_lock);
  121. return 0;
  122. }
  123. tmp = &(*tmp)->next;
  124. }
  125. write_unlock(&file_systems_lock);
  126. return -EINVAL;
  127. }
  128. static int fs_index(const char * __name)
  129. {
  130. struct file_system_type * tmp;
  131. char * name;
  132. int err, index;
  133. name = getname(__name);
  134. err = PTR_ERR(name);
  135. if (IS_ERR(name))
  136. return err;
  137. err = -EINVAL;
  138. read_lock(&file_systems_lock);
  139. for (tmp=file_systems, index=0 ; tmp ; tmp=tmp->next, index++) {
  140. if (strcmp(tmp->name,name) == 0) {
  141. err = index;
  142. break;
  143. }
  144. }
  145. read_unlock(&file_systems_lock);
  146. putname(name);
  147. return err;
  148. }
  149. static int fs_name(unsigned int index, char * buf)
  150. {
  151. struct file_system_type * tmp;
  152. int len, res;
  153. read_lock(&file_systems_lock);
  154. for (tmp = file_systems; tmp; tmp = tmp->next, index--)
  155. if (index <= 0 && try_inc_mod_count(tmp->owner))
  156. break;
  157. read_unlock(&file_systems_lock);
  158. if (!tmp)
  159. return -EINVAL;
  160. /* OK, we got the reference, so we can safely block */
  161. len = strlen(tmp->name) + 1;
  162. res = copy_to_user(buf, tmp->name, len) ? -EFAULT : 0;
  163. put_filesystem(tmp);
  164. return res;
  165. }
  166. static int fs_maxindex(void)
  167. {
  168. struct file_system_type * tmp;
  169. int index;
  170. read_lock(&file_systems_lock);
  171. for (tmp = file_systems, index = 0 ; tmp ; tmp = tmp->next, index++)
  172. ;
  173. read_unlock(&file_systems_lock);
  174. return index;
  175. }
  176. /*
  177.  * Whee.. Weird sysv syscall. 
  178.  */
  179. asmlinkage long sys_sysfs(int option, unsigned long arg1, unsigned long arg2)
  180. {
  181. int retval = -EINVAL;
  182. switch (option) {
  183. case 1:
  184. retval = fs_index((const char *) arg1);
  185. break;
  186. case 2:
  187. retval = fs_name(arg1, (char *) arg2);
  188. break;
  189. case 3:
  190. retval = fs_maxindex();
  191. break;
  192. }
  193. return retval;
  194. }
  195. int get_filesystem_list(char * buf)
  196. {
  197. int len = 0;
  198. struct file_system_type * tmp;
  199. read_lock(&file_systems_lock);
  200. tmp = file_systems;
  201. while (tmp && len < PAGE_SIZE - 80) {
  202. len += sprintf(buf+len, "%st%sn",
  203. (tmp->fs_flags & FS_REQUIRES_DEV) ? "" : "nodev",
  204. tmp->name);
  205. tmp = tmp->next;
  206. }
  207. read_unlock(&file_systems_lock);
  208. return len;
  209. }
  210. struct file_system_type *get_fs_type(const char *name)
  211. {
  212. struct file_system_type *fs;
  213. read_lock(&file_systems_lock);
  214. fs = *(find_filesystem(name));
  215. if (fs && !try_inc_mod_count(fs->owner))
  216. fs = NULL;
  217. read_unlock(&file_systems_lock);
  218. if (!fs && (request_module(name) == 0)) {
  219. read_lock(&file_systems_lock);
  220. fs = *(find_filesystem(name));
  221. if (fs && !try_inc_mod_count(fs->owner))
  222. fs = NULL;
  223. read_unlock(&file_systems_lock);
  224. }
  225. return fs;
  226. }
  227. /**
  228.  * alloc_super - create new superblock
  229.  *
  230.  * Allocates and initializes a new &struct super_block.  alloc_super()
  231.  * returns a pointer new superblock or %NULL if allocation had failed.
  232.  */
  233. static struct super_block *alloc_super(void)
  234. {
  235. struct super_block *s = kmalloc(sizeof(struct super_block),  GFP_USER);
  236. if (s) {
  237. memset(s, 0, sizeof(struct super_block));
  238. INIT_LIST_HEAD(&s->s_dirty);
  239. INIT_LIST_HEAD(&s->s_locked_inodes);
  240. INIT_LIST_HEAD(&s->s_files);
  241. INIT_LIST_HEAD(&s->s_instances);
  242. init_rwsem(&s->s_umount);
  243. sema_init(&s->s_lock, 1);
  244. down_write(&s->s_umount);
  245. s->s_count = S_BIAS;
  246. atomic_set(&s->s_active, 1);
  247. sema_init(&s->s_vfs_rename_sem,1);
  248. sema_init(&s->s_nfsd_free_path_sem,1);
  249. sema_init(&s->s_dquot.dqio_sem, 1);
  250. sema_init(&s->s_dquot.dqoff_sem, 1);
  251. s->s_maxbytes = MAX_NON_LFS;
  252. }
  253. return s;
  254. }
  255. /**
  256.  * destroy_super - frees a superblock
  257.  * @s: superblock to free
  258.  *
  259.  * Frees a superblock.
  260.  */
  261. static inline void destroy_super(struct super_block *s)
  262. {
  263. kfree(s);
  264. }
  265. /* Superblock refcounting  */
  266. /**
  267.  * deactivate_super - turn an active reference into temporary
  268.  * @s: superblock to deactivate
  269.  *
  270.  * Turns an active reference into temporary one.  Returns 0 if there are
  271.  * other active references, 1 if we had deactivated the last one.
  272.  */
  273. static inline int deactivate_super(struct super_block *s)
  274. {
  275. if (!atomic_dec_and_lock(&s->s_active, &sb_lock))
  276. return 0;
  277. s->s_count -= S_BIAS-1;
  278. spin_unlock(&sb_lock);
  279. return 1;
  280. }
  281. /**
  282.  * put_super - drop a temporary reference to superblock
  283.  * @s: superblock in question
  284.  *
  285.  * Drops a temporary reference, frees superblock if there's no
  286.  * references left.
  287.  */
  288. static inline void put_super(struct super_block *s)
  289. {
  290. spin_lock(&sb_lock);
  291. if (!--s->s_count)
  292. destroy_super(s);
  293. spin_unlock(&sb_lock);
  294. }
  295. /**
  296.  * grab_super - acquire an active reference
  297.  * @s - reference we are trying to make active
  298.  *
  299.  * Tries to acquire an active reference.  grab_super() is used when we
  300.  *  had just found a superblock in super_blocks or fs_type->fs_supers
  301.  * and want to turn it into a full-blown active reference.  grab_super()
  302.  * is called with sb_lock held and drops it.  Returns 1 in case of
  303.  * success, 0 if we had failed (superblock contents was already dead or
  304.  * dying when grab_super() had been called).
  305.  */
  306. static int grab_super(struct super_block *s)
  307. {
  308. s->s_count++;
  309. spin_unlock(&sb_lock);
  310. down_write(&s->s_umount);
  311. if (s->s_root) {
  312. spin_lock(&sb_lock);
  313. if (s->s_count > S_BIAS) {
  314. atomic_inc(&s->s_active);
  315. s->s_count--;
  316. spin_unlock(&sb_lock);
  317. return 1;
  318. }
  319. spin_unlock(&sb_lock);
  320. }
  321. up_write(&s->s_umount);
  322. put_super(s);
  323. return 0;
  324. }
  325.  
  326. /**
  327.  * insert_super - put superblock on the lists
  328.  * @s: superblock in question
  329.  * @type: filesystem type it will belong to
  330.  *
  331.  * Associates superblock with fs type and puts it on per-type and global
  332.  * superblocks' lists.  Should be called with sb_lock held; drops it.
  333.  */
  334. static void insert_super(struct super_block *s, struct file_system_type *type)
  335. {
  336. s->s_type = type;
  337. list_add(&s->s_list, super_blocks.prev);
  338. list_add(&s->s_instances, &type->fs_supers);
  339. spin_unlock(&sb_lock);
  340. get_filesystem(type);
  341. }
  342. static void put_anon_dev(kdev_t dev);
  343. /**
  344.  * remove_super - makes superblock unreachable
  345.  * @s: superblock in question
  346.  *
  347.  * Removes superblock from the lists, unlocks it, drop the reference
  348.  * and releases the hosting device.  @s should have no active
  349.  * references by that time and after remove_super() it's essentially
  350.  * in rundown mode - all remaining references are temporary, no new
  351.  * reference of any sort are going to appear and all holders of
  352.  * temporary ones will eventually drop them.  At that point superblock
  353.  * itself will be destroyed; all its contents is already gone.
  354.  */
  355. static void remove_super(struct super_block *s)
  356. {
  357. kdev_t dev = s->s_dev;
  358. struct block_device *bdev = s->s_bdev;
  359. struct file_system_type *fs = s->s_type;
  360. spin_lock(&sb_lock);
  361. list_del(&s->s_list);
  362. list_del(&s->s_instances);
  363. spin_unlock(&sb_lock);
  364. up_write(&s->s_umount);
  365. put_super(s);
  366. put_filesystem(fs);
  367. if (bdev)
  368. blkdev_put(bdev, BDEV_FS);
  369. else
  370. put_anon_dev(dev);
  371. }
  372. struct vfsmount *alloc_vfsmnt(char *name);
  373. void free_vfsmnt(struct vfsmount *mnt);
  374. static inline struct super_block * find_super(kdev_t dev)
  375. {
  376. struct list_head *p;
  377. list_for_each(p, &super_blocks) {
  378. struct super_block * s = sb_entry(p);
  379. if (s->s_dev == dev) {
  380. s->s_count++;
  381. return s;
  382. }
  383. }
  384. return NULL;
  385. }
  386. void drop_super(struct super_block *sb)
  387. {
  388. up_read(&sb->s_umount);
  389. put_super(sb);
  390. }
  391. static inline void write_super(struct super_block *sb)
  392. {
  393. lock_super(sb);
  394. if (sb->s_root && sb->s_dirt)
  395. if (sb->s_op && sb->s_op->write_super)
  396. sb->s_op->write_super(sb);
  397. unlock_super(sb);
  398. }
  399. /*
  400.  * Note: check the dirty flag before waiting, so we don't
  401.  * hold up the sync while mounting a device. (The newly
  402.  * mounted device won't need syncing.)
  403.  */
  404. void sync_supers(kdev_t dev)
  405. {
  406. struct super_block * sb;
  407. if (dev) {
  408. sb = get_super(dev);
  409. if (sb) {
  410. if (sb->s_dirt)
  411. write_super(sb);
  412. drop_super(sb);
  413. }
  414. return;
  415. }
  416. restart:
  417. spin_lock(&sb_lock);
  418. sb = sb_entry(super_blocks.next);
  419. while (sb != sb_entry(&super_blocks))
  420. if (sb->s_dirt) {
  421. sb->s_count++;
  422. spin_unlock(&sb_lock);
  423. down_read(&sb->s_umount);
  424. write_super(sb);
  425. drop_super(sb);
  426. goto restart;
  427. } else
  428. sb = sb_entry(sb->s_list.next);
  429. spin_unlock(&sb_lock);
  430. }
  431. /**
  432.  * get_super - get the superblock of a device
  433.  * @dev: device to get the superblock for
  434.  *
  435.  * Scans the superblock list and finds the superblock of the file system
  436.  * mounted on the device given. %NULL is returned if no match is found.
  437.  */
  438.  
  439. struct super_block * get_super(kdev_t dev)
  440. {
  441. struct super_block * s;
  442. if (!dev)
  443. return NULL;
  444. restart:
  445. spin_lock(&sb_lock);
  446. s = find_super(dev);
  447. if (s) {
  448. spin_unlock(&sb_lock);
  449. down_read(&s->s_umount);
  450. if (s->s_root)
  451. return s;
  452. drop_super(s);
  453. goto restart;
  454. }
  455. spin_unlock(&sb_lock);
  456. return NULL;
  457. }
  458. asmlinkage long sys_ustat(dev_t dev, struct ustat * ubuf)
  459. {
  460.         struct super_block *s;
  461.         struct ustat tmp;
  462.         struct statfs sbuf;
  463. int err = -EINVAL;
  464.         s = get_super(to_kdev_t(dev));
  465.         if (s == NULL)
  466.                 goto out;
  467. err = vfs_statfs(s, &sbuf);
  468. drop_super(s);
  469. if (err)
  470. goto out;
  471.         memset(&tmp,0,sizeof(struct ustat));
  472.         tmp.f_tfree = sbuf.f_bfree;
  473.         tmp.f_tinode = sbuf.f_ffree;
  474.         err = copy_to_user(ubuf,&tmp,sizeof(struct ustat)) ? -EFAULT : 0;
  475. out:
  476. return err;
  477. }
  478. /**
  479.  * do_remount_sb - asks filesystem to change mount options.
  480.  * @sb: superblock in question
  481.  * @flags: numeric part of options
  482.  * @data: the rest of options
  483.  *
  484.  * Alters the mount options of a mounted file system.
  485.  */
  486. int do_remount_sb(struct super_block *sb, int flags, void *data)
  487. {
  488. int retval;
  489. if (!(flags & MS_RDONLY) && sb->s_dev && is_read_only(sb->s_dev))
  490. return -EACCES;
  491. /*flags |= MS_RDONLY;*/
  492. if (flags & MS_RDONLY)
  493. acct_auto_close(sb->s_dev);
  494. shrink_dcache_sb(sb);
  495. fsync_super(sb);
  496. /* If we are remounting RDONLY, make sure there are no rw files open */
  497. if ((flags & MS_RDONLY) && !(sb->s_flags & MS_RDONLY))
  498. if (!fs_may_remount_ro(sb))
  499. return -EBUSY;
  500. if (sb->s_op && sb->s_op->remount_fs) {
  501. lock_super(sb);
  502. retval = sb->s_op->remount_fs(sb, &flags, data);
  503. unlock_super(sb);
  504. if (retval)
  505. return retval;
  506. }
  507. sb->s_flags = (sb->s_flags & ~MS_RMT_MASK) | (flags & MS_RMT_MASK);
  508. return 0;
  509. }
  510. /*
  511.  * Unnamed block devices are dummy devices used by virtual
  512.  * filesystems which don't use real block-devices.  -- jrs
  513.  */
  514. enum {Max_anon = 256};
  515. static unsigned long unnamed_dev_in_use[Max_anon/(8*sizeof(unsigned long))];
  516. static spinlock_t unnamed_dev_lock = SPIN_LOCK_UNLOCKED;/* protects the above */
  517. /**
  518.  * put_anon_dev - release anonymous device number.
  519.  * @dev: device in question
  520.  */
  521. static void put_anon_dev(kdev_t dev)
  522. {
  523. spin_lock(&unnamed_dev_lock);
  524. clear_bit(MINOR(dev), unnamed_dev_in_use);
  525. spin_unlock(&unnamed_dev_lock);
  526. }
  527. /**
  528.  * get_anon_super - allocate a superblock for non-device fs
  529.  * @type: filesystem type
  530.  * @compare: check if existing superblock is what we want
  531.  * @data: argument for @compare.
  532.  *
  533.  * get_anon_super is a helper for non-blockdevice filesystems.
  534.  * It either finds and returns one of the superblocks of given type
  535.  * (if it can find one that would satisfy caller) or creates a new
  536.  * one.  In the either case we return an active reference to superblock
  537.  * with ->s_umount locked.  If superblock is new it gets a new
  538.  * anonymous device allocated for it and is inserted into lists -
  539.  * other initialization is left to caller.
  540.  *
  541.  * Rather than duplicating all that logics every time when
  542.  * we want something that doesn't fit "nodev" and "single" we pull
  543.  * the relevant code into common helper and let get_sb_...() call
  544.  * it.
  545.  *
  546.  * NB: get_sb_...() is going to become an fs type method, with
  547.  * current ->read_super() becoming a callback used by common instances.
  548.  */
  549. struct super_block *get_anon_super(struct file_system_type *type,
  550. int (*compare)(struct super_block *,void *), void *data)
  551. {
  552. struct super_block *s = alloc_super();
  553. kdev_t dev;
  554. struct list_head *p;
  555. if (!s)
  556. return ERR_PTR(-ENOMEM);
  557. retry:
  558. spin_lock(&sb_lock);
  559. if (compare) list_for_each(p, &type->fs_supers) {
  560. struct super_block *old;
  561. old = list_entry(p, struct super_block, s_instances);
  562. if (!compare(old, data))
  563. continue;
  564. if (!grab_super(old))
  565. goto retry;
  566. destroy_super(s);
  567. return old;
  568. }
  569. spin_lock(&unnamed_dev_lock);
  570. dev = find_first_zero_bit(unnamed_dev_in_use, Max_anon);
  571. if (dev == Max_anon) {
  572. spin_unlock(&unnamed_dev_lock);
  573. spin_unlock(&sb_lock);
  574. destroy_super(s);
  575. return ERR_PTR(-EMFILE);
  576. }
  577. set_bit(dev, unnamed_dev_in_use);
  578. spin_unlock(&unnamed_dev_lock);
  579. s->s_dev = dev;
  580. insert_super(s, type);
  581. return s;
  582. }
  583. static struct super_block *get_sb_bdev(struct file_system_type *fs_type,
  584. int flags, char *dev_name, void * data)
  585. {
  586. struct inode *inode;
  587. struct block_device *bdev;
  588. struct block_device_operations *bdops;
  589. devfs_handle_t de;
  590. struct super_block * s;
  591. struct nameidata nd;
  592. struct list_head *p;
  593. kdev_t dev;
  594. int error = 0;
  595. mode_t mode = FMODE_READ; /* we always need it ;-) */
  596. /* What device it is? */
  597. if (!dev_name || !*dev_name)
  598. return ERR_PTR(-EINVAL);
  599. error = path_lookup(dev_name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd);
  600. if (error)
  601. return ERR_PTR(error);
  602. inode = nd.dentry->d_inode;
  603. error = -ENOTBLK;
  604. if (!S_ISBLK(inode->i_mode))
  605. goto out;
  606. error = -EACCES;
  607. if (nd.mnt->mnt_flags & MNT_NODEV)
  608. goto out;
  609. bd_acquire(inode);
  610. bdev = inode->i_bdev;
  611. de = devfs_get_handle_from_inode (inode);
  612. bdops = devfs_get_ops (de);         /*  Increments module use count  */
  613. if (bdops) bdev->bd_op = bdops;
  614. /* Done with lookups, semaphore down */
  615. dev = to_kdev_t(bdev->bd_dev);
  616. if (!(flags & MS_RDONLY))
  617. mode |= FMODE_WRITE;
  618. error = blkdev_get(bdev, mode, 0, BDEV_FS);
  619. devfs_put_ops (de);   /*  Decrement module use count now we're safe  */
  620. if (error)
  621. goto out;
  622. check_disk_change(dev);
  623. error = -EACCES;
  624. if (!(flags & MS_RDONLY) && is_read_only(dev))
  625. goto out1;
  626. error = -ENOMEM;
  627. s = alloc_super();
  628. if (!s)
  629. goto out1;
  630. error = -EBUSY;
  631. restart:
  632. spin_lock(&sb_lock);
  633. list_for_each(p, &super_blocks) {
  634. struct super_block *old = sb_entry(p);
  635. if (old->s_dev != dev)
  636. continue;
  637. if (old->s_type != fs_type ||
  638.     ((flags ^ old->s_flags) & MS_RDONLY)) {
  639. spin_unlock(&sb_lock);
  640. destroy_super(s);
  641. goto out1;
  642. }
  643. if (!grab_super(old))
  644. goto restart;
  645. destroy_super(s);
  646. blkdev_put(bdev, BDEV_FS);
  647. path_release(&nd);
  648. return old;
  649. }
  650. s->s_dev = dev;
  651. s->s_bdev = bdev;
  652. s->s_flags = flags;
  653. insert_super(s, fs_type);
  654. if (!fs_type->read_super(s, data, flags & MS_VERBOSE ? 1 : 0))
  655. goto Einval;
  656. s->s_flags |= MS_ACTIVE;
  657. path_release(&nd);
  658. return s;
  659. Einval:
  660. deactivate_super(s);
  661. remove_super(s);
  662. error = -EINVAL;
  663. goto out;
  664. out1:
  665. blkdev_put(bdev, BDEV_FS);
  666. out:
  667. path_release(&nd);
  668. return ERR_PTR(error);
  669. }
  670. static struct super_block *get_sb_nodev(struct file_system_type *fs_type,
  671. int flags, char *dev_name, void *data)
  672. {
  673. struct super_block *s = get_anon_super(fs_type, NULL, NULL);
  674. if (IS_ERR(s))
  675. return s;
  676. s->s_flags = flags;
  677. if (!fs_type->read_super(s, data, flags & MS_VERBOSE ? 1 : 0)) {
  678. deactivate_super(s);
  679. remove_super(s);
  680. return ERR_PTR(-EINVAL);
  681. }
  682. s->s_flags |= MS_ACTIVE;
  683. return s;
  684. }
  685. static int compare_single(struct super_block *s, void *p)
  686. {
  687. return 1;
  688. }
  689. static struct super_block *get_sb_single(struct file_system_type *fs_type,
  690. int flags, char *dev_name, void *data)
  691. {
  692. struct super_block *s = get_anon_super(fs_type, compare_single, NULL);
  693. if (IS_ERR(s))
  694. return s;
  695. if (!s->s_root) {
  696. s->s_flags = flags;
  697. if (!fs_type->read_super(s, data, flags & MS_VERBOSE ? 1 : 0)) {
  698. deactivate_super(s);
  699. remove_super(s);
  700. return ERR_PTR(-EINVAL);
  701. }
  702. s->s_flags |= MS_ACTIVE;
  703. }
  704. do_remount_sb(s, flags, data);
  705. return s;
  706. }
  707. struct vfsmount *
  708. do_kern_mount(const char *fstype, int flags, char *name, void *data)
  709. {
  710. struct file_system_type *type = get_fs_type(fstype);
  711. struct super_block *sb = ERR_PTR(-ENOMEM);
  712. struct vfsmount *mnt;
  713. if (!type)
  714. return ERR_PTR(-ENODEV);
  715. mnt = alloc_vfsmnt(name);
  716. if (!mnt)
  717. goto out;
  718. if (type->fs_flags & FS_REQUIRES_DEV)
  719. sb = get_sb_bdev(type, flags, name, data);
  720. else if (type->fs_flags & FS_SINGLE)
  721. sb = get_sb_single(type, flags, name, data);
  722. else
  723. sb = get_sb_nodev(type, flags, name, data);
  724. if (IS_ERR(sb))
  725. goto out_mnt;
  726. if (type->fs_flags & FS_NOMOUNT)
  727. sb->s_flags |= MS_NOUSER;
  728. mnt->mnt_sb = sb;
  729. mnt->mnt_root = dget(sb->s_root);
  730. mnt->mnt_mountpoint = sb->s_root;
  731. mnt->mnt_parent = mnt;
  732. up_write(&sb->s_umount);
  733. put_filesystem(type);
  734. return mnt;
  735. out_mnt:
  736. free_vfsmnt(mnt);
  737. out:
  738. put_filesystem(type);
  739. return (struct vfsmount *)sb;
  740. }
  741. void kill_super(struct super_block *sb)
  742. {
  743. struct dentry *root = sb->s_root;
  744. struct file_system_type *fs = sb->s_type;
  745. struct super_operations *sop = sb->s_op;
  746. if (!deactivate_super(sb))
  747. return;
  748. down_write(&sb->s_umount);
  749. sb->s_root = NULL;
  750. /* Need to clean after the sucker */
  751. if (fs->fs_flags & FS_LITTER)
  752. d_genocide(root);
  753. shrink_dcache_parent(root);
  754. dput(root);
  755. fsync_super(sb);
  756. lock_super(sb);
  757. lock_kernel();
  758. sb->s_flags &= ~MS_ACTIVE;
  759. invalidate_inodes(sb); /* bad name - it should be evict_inodes() */
  760. if (sop) {
  761. if (sop->write_super && sb->s_dirt)
  762. sop->write_super(sb);
  763. if (sop->put_super)
  764. sop->put_super(sb);
  765. }
  766. /* Forget any remaining inodes */
  767. if (invalidate_inodes(sb)) {
  768. printk(KERN_ERR "VFS: Busy inodes after unmount. "
  769. "Self-destruct in 5 seconds.  Have a nice day...n");
  770. }
  771. unlock_kernel();
  772. unlock_super(sb);
  773. remove_super(sb);
  774. }
  775. struct vfsmount *kern_mount(struct file_system_type *type)
  776. {
  777. return do_kern_mount(type->name, 0, (char *)type->name, NULL);
  778. }