super.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:26k
源码类别:

嵌入式Linux

开发平台:

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/string.h>
  24. #include <linux/slab.h>
  25. #include <linux/locks.h>
  26. #include <linux/smp_lock.h>
  27. #include <linux/devfs_fs_kernel.h>
  28. #include <linux/fd.h>
  29. #include <linux/init.h>
  30. #include <linux/major.h>
  31. #include <linux/quotaops.h>
  32. #include <linux/acct.h>
  33. #include <asm/uaccess.h>
  34. #include <linux/nfs_fs.h>
  35. #include <linux/nfs_fs_sb.h>
  36. #include <linux/nfs_mount.h>
  37. #include <linux/kmod.h>
  38. #define __NO_VERSION__
  39. #include <linux/module.h>
  40. extern void wait_for_keypress(void);
  41. extern int root_mountflags;
  42. int do_remount_sb(struct super_block *sb, int flags, void * data);
  43. /* this is initialized in init/main.c */
  44. kdev_t ROOT_DEV;
  45. LIST_HEAD(super_blocks);
  46. spinlock_t sb_lock = SPIN_LOCK_UNLOCKED;
  47. /*
  48.  * Handling of filesystem drivers list.
  49.  * Rules:
  50.  * Inclusion to/removals from/scanning of list are protected by spinlock.
  51.  * During the unload module must call unregister_filesystem().
  52.  * We can access the fields of list element if:
  53.  * 1) spinlock is held or
  54.  * 2) we hold the reference to the module.
  55.  * The latter can be guaranteed by call of try_inc_mod_count(); if it
  56.  * returned 0 we must skip the element, otherwise we got the reference.
  57.  * Once the reference is obtained we can drop the spinlock.
  58.  */
  59. static struct file_system_type *file_systems;
  60. static rwlock_t file_systems_lock = RW_LOCK_UNLOCKED;
  61. /* WARNING: This can be used only if we _already_ own a reference */
  62. static void get_filesystem(struct file_system_type *fs)
  63. {
  64. if (fs->owner)
  65. __MOD_INC_USE_COUNT(fs->owner);
  66. }
  67. static void put_filesystem(struct file_system_type *fs)
  68. {
  69. if (fs->owner)
  70. __MOD_DEC_USE_COUNT(fs->owner);
  71. }
  72. static struct file_system_type **find_filesystem(const char *name)
  73. {
  74. struct file_system_type **p;
  75. for (p=&file_systems; *p; p=&(*p)->next)
  76. if (strcmp((*p)->name,name) == 0)
  77. break;
  78. return p;
  79. }
  80. /**
  81.  * register_filesystem - register a new filesystem
  82.  * @fs: the file system structure
  83.  *
  84.  * Adds the file system passed to the list of file systems the kernel
  85.  * is aware of for mount and other syscalls. Returns 0 on success,
  86.  * or a negative errno code on an error.
  87.  *
  88.  * The &struct file_system_type that is passed is linked into the kernel 
  89.  * structures and must not be freed until the file system has been
  90.  * unregistered.
  91.  */
  92.  
  93. int register_filesystem(struct file_system_type * fs)
  94. {
  95. int res = 0;
  96. struct file_system_type ** p;
  97. if (!fs)
  98. return -EINVAL;
  99. if (fs->next)
  100. return -EBUSY;
  101. INIT_LIST_HEAD(&fs->fs_supers);
  102. write_lock(&file_systems_lock);
  103. p = find_filesystem(fs->name);
  104. if (*p)
  105. res = -EBUSY;
  106. else
  107. *p = fs;
  108. write_unlock(&file_systems_lock);
  109. return res;
  110. }
  111. /**
  112.  * unregister_filesystem - unregister a file system
  113.  * @fs: filesystem to unregister
  114.  *
  115.  * Remove a file system that was previously successfully registered
  116.  * with the kernel. An error is returned if the file system is not found.
  117.  * Zero is returned on a success.
  118.  *
  119.  * Once this function has returned the &struct file_system_type structure
  120.  * may be freed or reused.
  121.  */
  122.  
  123. int unregister_filesystem(struct file_system_type * fs)
  124. {
  125. struct file_system_type ** tmp;
  126. write_lock(&file_systems_lock);
  127. tmp = &file_systems;
  128. while (*tmp) {
  129. if (fs == *tmp) {
  130. *tmp = fs->next;
  131. fs->next = NULL;
  132. write_unlock(&file_systems_lock);
  133. return 0;
  134. }
  135. tmp = &(*tmp)->next;
  136. }
  137. write_unlock(&file_systems_lock);
  138. return -EINVAL;
  139. }
  140. static int fs_index(const char * __name)
  141. {
  142. struct file_system_type * tmp;
  143. char * name;
  144. int err, index;
  145. name = getname(__name);
  146. err = PTR_ERR(name);
  147. if (IS_ERR(name))
  148. return err;
  149. err = -EINVAL;
  150. read_lock(&file_systems_lock);
  151. for (tmp=file_systems, index=0 ; tmp ; tmp=tmp->next, index++) {
  152. if (strcmp(tmp->name,name) == 0) {
  153. err = index;
  154. break;
  155. }
  156. }
  157. read_unlock(&file_systems_lock);
  158. putname(name);
  159. return err;
  160. }
  161. static int fs_name(unsigned int index, char * buf)
  162. {
  163. struct file_system_type * tmp;
  164. int len, res;
  165. read_lock(&file_systems_lock);
  166. for (tmp = file_systems; tmp; tmp = tmp->next, index--)
  167. if (index <= 0 && try_inc_mod_count(tmp->owner))
  168. break;
  169. read_unlock(&file_systems_lock);
  170. if (!tmp)
  171. return -EINVAL;
  172. /* OK, we got the reference, so we can safely block */
  173. len = strlen(tmp->name) + 1;
  174. res = copy_to_user(buf, tmp->name, len) ? -EFAULT : 0;
  175. put_filesystem(tmp);
  176. return res;
  177. }
  178. static int fs_maxindex(void)
  179. {
  180. struct file_system_type * tmp;
  181. int index;
  182. read_lock(&file_systems_lock);
  183. for (tmp = file_systems, index = 0 ; tmp ; tmp = tmp->next, index++)
  184. ;
  185. read_unlock(&file_systems_lock);
  186. return index;
  187. }
  188. /*
  189.  * Whee.. Weird sysv syscall. 
  190.  */
  191. asmlinkage long sys_sysfs(int option, unsigned long arg1, unsigned long arg2)
  192. {
  193. int retval = -EINVAL;
  194. switch (option) {
  195. case 1:
  196. retval = fs_index((const char *) arg1);
  197. break;
  198. case 2:
  199. retval = fs_name(arg1, (char *) arg2);
  200. break;
  201. case 3:
  202. retval = fs_maxindex();
  203. break;
  204. }
  205. return retval;
  206. }
  207. int get_filesystem_list(char * buf)
  208. {
  209. int len = 0;
  210. struct file_system_type * tmp;
  211. read_lock(&file_systems_lock);
  212. tmp = file_systems;
  213. while (tmp && len < PAGE_SIZE - 80) {
  214. len += sprintf(buf+len, "%st%sn",
  215. (tmp->fs_flags & FS_REQUIRES_DEV) ? "" : "nodev",
  216. tmp->name);
  217. tmp = tmp->next;
  218. }
  219. read_unlock(&file_systems_lock);
  220. return len;
  221. }
  222. struct file_system_type *get_fs_type(const char *name)
  223. {
  224. struct file_system_type *fs;
  225. read_lock(&file_systems_lock);
  226. fs = *(find_filesystem(name));
  227. if (fs && !try_inc_mod_count(fs->owner))
  228. fs = NULL;
  229. read_unlock(&file_systems_lock);
  230. if (!fs && (request_module(name) == 0)) {
  231. read_lock(&file_systems_lock);
  232. fs = *(find_filesystem(name));
  233. if (fs && !try_inc_mod_count(fs->owner))
  234. fs = NULL;
  235. read_unlock(&file_systems_lock);
  236. }
  237. return fs;
  238. }
  239. /**
  240.  * alloc_super - create new superblock
  241.  *
  242.  * Allocates and initializes a new &struct super_block.  alloc_super()
  243.  * returns a pointer new superblock or %NULL if allocation had failed.
  244.  */
  245. static struct super_block *alloc_super(void)
  246. {
  247. struct super_block *s = kmalloc(sizeof(struct super_block),  GFP_USER);
  248. if (s) {
  249. memset(s, 0, sizeof(struct super_block));
  250. INIT_LIST_HEAD(&s->s_dirty);
  251. INIT_LIST_HEAD(&s->s_locked_inodes);
  252. INIT_LIST_HEAD(&s->s_files);
  253. INIT_LIST_HEAD(&s->s_instances);
  254. init_rwsem(&s->s_umount);
  255. sema_init(&s->s_lock, 1);
  256. down_write(&s->s_umount);
  257. s->s_count = S_BIAS;
  258. atomic_set(&s->s_active, 1);
  259. sema_init(&s->s_vfs_rename_sem,1);
  260. sema_init(&s->s_nfsd_free_path_sem,1);
  261. sema_init(&s->s_dquot.dqio_sem, 1);
  262. sema_init(&s->s_dquot.dqoff_sem, 1);
  263. s->s_maxbytes = MAX_NON_LFS;
  264. }
  265. return s;
  266. }
  267. /**
  268.  * destroy_super - frees a superblock
  269.  * @s: superblock to free
  270.  *
  271.  * Frees a superblock.
  272.  */
  273. static inline void destroy_super(struct super_block *s)
  274. {
  275. kfree(s);
  276. }
  277. /* Superblock refcounting  */
  278. /**
  279.  * deactivate_super - turn an active reference into temporary
  280.  * @s: superblock to deactivate
  281.  *
  282.  * Turns an active reference into temporary one.  Returns 0 if there are
  283.  * other active references, 1 if we had deactivated the last one.
  284.  */
  285. static inline int deactivate_super(struct super_block *s)
  286. {
  287. if (!atomic_dec_and_lock(&s->s_active, &sb_lock))
  288. return 0;
  289. s->s_count -= S_BIAS-1;
  290. spin_unlock(&sb_lock);
  291. return 1;
  292. }
  293. /**
  294.  * put_super - drop a temporary reference to superblock
  295.  * @s: superblock in question
  296.  *
  297.  * Drops a temporary reference, frees superblock if there's no
  298.  * references left.
  299.  */
  300. static inline void put_super(struct super_block *s)
  301. {
  302. spin_lock(&sb_lock);
  303. if (!--s->s_count)
  304. destroy_super(s);
  305. spin_unlock(&sb_lock);
  306. }
  307. /**
  308.  * grab_super - acquire an active reference
  309.  * @s - reference we are trying to make active
  310.  *
  311.  * Tries to acquire an active reference.  grab_super() is used when we
  312.  *  had just found a superblock in super_blocks or fs_type->fs_supers
  313.  * and want to turn it into a full-blown active reference.  grab_super()
  314.  * is called with sb_lock held and drops it.  Returns 1 in case of
  315.  * success, 0 if we had failed (superblock contents was already dead or
  316.  * dying when grab_super() had been called).
  317.  */
  318. static int grab_super(struct super_block *s)
  319. {
  320. s->s_count++;
  321. spin_unlock(&sb_lock);
  322. down_write(&s->s_umount);
  323. if (s->s_root) {
  324. spin_lock(&sb_lock);
  325. if (s->s_count > S_BIAS) {
  326. atomic_inc(&s->s_active);
  327. s->s_count--;
  328. spin_unlock(&sb_lock);
  329. return 1;
  330. }
  331. spin_unlock(&sb_lock);
  332. }
  333. up_write(&s->s_umount);
  334. put_super(s);
  335. return 0;
  336. }
  337.  
  338. /**
  339.  * insert_super - put superblock on the lists
  340.  * @s: superblock in question
  341.  * @type: filesystem type it will belong to
  342.  *
  343.  * Associates superblock with fs type and puts it on per-type and global
  344.  * superblocks' lists.  Should be called with sb_lock held; drops it.
  345.  */
  346. static void insert_super(struct super_block *s, struct file_system_type *type)
  347. {
  348. s->s_type = type;
  349. list_add(&s->s_list, super_blocks.prev);
  350. list_add(&s->s_instances, &type->fs_supers);
  351. spin_unlock(&sb_lock);
  352. get_filesystem(type);
  353. }
  354. void put_unnamed_dev(kdev_t dev); /* should become static */
  355. /**
  356.  * remove_super - makes superblock unreachable
  357.  * @s: superblock in question
  358.  *
  359.  * Removes superblock from the lists, unlocks it, drop the reference
  360.  * and releases the hosting device.  @s should have no active
  361.  * references by that time and after remove_super() it's essentially
  362.  * in rundown mode - all remaining references are temporary, no new
  363.  * reference of any sort are going to appear and all holders of
  364.  * temporary ones will eventually drop them.  At that point superblock
  365.  * itself will be destroyed; all its contents is already gone.
  366.  */
  367. static void remove_super(struct super_block *s)
  368. {
  369. kdev_t dev = s->s_dev;
  370. struct block_device *bdev = s->s_bdev;
  371. struct file_system_type *fs = s->s_type;
  372. spin_lock(&sb_lock);
  373. list_del(&s->s_list);
  374. list_del(&s->s_instances);
  375. spin_unlock(&sb_lock);
  376. up_write(&s->s_umount);
  377. put_super(s);
  378. put_filesystem(fs);
  379. if (bdev)
  380. blkdev_put(bdev, BDEV_FS);
  381. else
  382. put_unnamed_dev(dev);
  383. }
  384. struct vfsmount *alloc_vfsmnt(void);
  385. void free_vfsmnt(struct vfsmount *mnt);
  386. void set_devname(struct vfsmount *mnt, const char *name);
  387. /* Will go away */
  388. extern struct vfsmount *root_vfsmnt;
  389. extern int graft_tree(struct vfsmount *mnt, struct nameidata *nd);
  390. static inline struct super_block * find_super(kdev_t dev)
  391. {
  392. struct list_head *p;
  393. list_for_each(p, &super_blocks) {
  394. struct super_block * s = sb_entry(p);
  395. if (s->s_dev == dev) {
  396. s->s_count++;
  397. return s;
  398. }
  399. }
  400. return NULL;
  401. }
  402. void drop_super(struct super_block *sb)
  403. {
  404. up_read(&sb->s_umount);
  405. put_super(sb);
  406. }
  407. static inline void write_super(struct super_block *sb)
  408. {
  409. lock_super(sb);
  410. if (sb->s_root && sb->s_dirt)
  411. if (sb->s_op && sb->s_op->write_super)
  412. sb->s_op->write_super(sb);
  413. unlock_super(sb);
  414. }
  415. /*
  416.  * Note: check the dirty flag before waiting, so we don't
  417.  * hold up the sync while mounting a device. (The newly
  418.  * mounted device won't need syncing.)
  419.  */
  420. void sync_supers(kdev_t dev)
  421. {
  422. struct super_block * sb;
  423. if (dev) {
  424. sb = get_super(dev);
  425. if (sb) {
  426. if (sb->s_dirt)
  427. write_super(sb);
  428. drop_super(sb);
  429. }
  430. return;
  431. }
  432. restart:
  433. spin_lock(&sb_lock);
  434. sb = sb_entry(super_blocks.next);
  435. while (sb != sb_entry(&super_blocks))
  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. drop_super(sb);
  442. goto restart;
  443. } else
  444. sb = sb_entry(sb->s_list.next);
  445. spin_unlock(&sb_lock);
  446. }
  447. /**
  448.  * get_super - get the superblock of a device
  449.  * @dev: device to get the superblock for
  450.  *
  451.  * Scans the superblock list and finds the superblock of the file system
  452.  * mounted on the device given. %NULL is returned if no match is found.
  453.  */
  454.  
  455. struct super_block * get_super(kdev_t dev)
  456. {
  457. struct super_block * s;
  458. if (!dev)
  459. return NULL;
  460. restart:
  461. spin_lock(&sb_lock);
  462. s = find_super(dev);
  463. if (s) {
  464. spin_unlock(&sb_lock);
  465. down_read(&s->s_umount);
  466. if (s->s_root)
  467. return s;
  468. drop_super(s);
  469. goto restart;
  470. }
  471. spin_unlock(&sb_lock);
  472. return NULL;
  473. }
  474. asmlinkage long sys_ustat(dev_t dev, struct ustat * ubuf)
  475. {
  476.         struct super_block *s;
  477.         struct ustat tmp;
  478.         struct statfs sbuf;
  479. int err = -EINVAL;
  480.         s = get_super(to_kdev_t(dev));
  481.         if (s == NULL)
  482.                 goto out;
  483. err = vfs_statfs(s, &sbuf);
  484. drop_super(s);
  485. if (err)
  486. goto out;
  487.         memset(&tmp,0,sizeof(struct ustat));
  488.         tmp.f_tfree = sbuf.f_bfree;
  489.         tmp.f_tinode = sbuf.f_ffree;
  490.         err = copy_to_user(ubuf,&tmp,sizeof(struct ustat)) ? -EFAULT : 0;
  491. out:
  492. return err;
  493. }
  494. static struct super_block * read_super(kdev_t dev, struct block_device *bdev,
  495.        struct file_system_type *type, int flags,
  496.        void *data)
  497. {
  498. struct super_block * s;
  499. s = alloc_super();
  500. if (!s)
  501. goto out;
  502. s->s_dev = dev;
  503. s->s_bdev = bdev;
  504. s->s_flags = flags;
  505. spin_lock(&sb_lock);
  506. insert_super(s, type);
  507. lock_super(s);
  508. if (!type->read_super(s, data, flags & MS_VERBOSE ? 1 : 0))
  509. goto out_fail;
  510. s->s_flags |= MS_ACTIVE;
  511. unlock_super(s);
  512. /* tell bdcache that we are going to keep this one */
  513. if (bdev)
  514. atomic_inc(&bdev->bd_count);
  515. out:
  516. return s;
  517. out_fail:
  518. unlock_super(s);
  519. deactivate_super(s);
  520. remove_super(s);
  521. return NULL;
  522. }
  523. /*
  524.  * Unnamed block devices are dummy devices used by virtual
  525.  * filesystems which don't use real block-devices.  -- jrs
  526.  */
  527. static unsigned long unnamed_dev_in_use[256/(8*sizeof(unsigned long))];
  528. kdev_t get_unnamed_dev(void)
  529. {
  530. int i;
  531. for (i = 1; i < 256; i++) {
  532. if (!test_and_set_bit(i,unnamed_dev_in_use))
  533. return MKDEV(UNNAMED_MAJOR, i);
  534. }
  535. return 0;
  536. }
  537. void put_unnamed_dev(kdev_t dev)
  538. {
  539. if (!dev || MAJOR(dev) != UNNAMED_MAJOR)
  540. return;
  541. if (test_and_clear_bit(MINOR(dev), unnamed_dev_in_use))
  542. return;
  543. printk("VFS: put_unnamed_dev: freeing unused device %sn",
  544. kdevname(dev));
  545. }
  546. static struct super_block *get_sb_bdev(struct file_system_type *fs_type,
  547. char *dev_name, int flags, void * data)
  548. {
  549. struct inode *inode;
  550. struct block_device *bdev;
  551. struct block_device_operations *bdops;
  552. devfs_handle_t de;
  553. struct super_block * s;
  554. struct nameidata nd;
  555. struct list_head *p;
  556. kdev_t dev;
  557. int error = 0;
  558. mode_t mode = FMODE_READ; /* we always need it ;-) */
  559. /* What device it is? */
  560. if (!dev_name || !*dev_name)
  561. return ERR_PTR(-EINVAL);
  562. if (path_init(dev_name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd))
  563. error = path_walk(dev_name, &nd);
  564. if (error)
  565. return ERR_PTR(error);
  566. inode = nd.dentry->d_inode;
  567. error = -ENOTBLK;
  568. if (!S_ISBLK(inode->i_mode))
  569. goto out;
  570. error = -EACCES;
  571. if (nd.mnt->mnt_flags & MNT_NODEV)
  572. goto out;
  573. bd_acquire(inode);
  574. bdev = inode->i_bdev;
  575. de = devfs_get_handle_from_inode (inode);
  576. bdops = devfs_get_ops (de);         /*  Increments module use count  */
  577. if (bdops) bdev->bd_op = bdops;
  578. /* Done with lookups, semaphore down */
  579. dev = to_kdev_t(bdev->bd_dev);
  580. if (!(flags & MS_RDONLY))
  581. mode |= FMODE_WRITE;
  582. error = blkdev_get(bdev, mode, 0, BDEV_FS);
  583. devfs_put_ops (de);   /*  Decrement module use count now we're safe  */
  584. if (error)
  585. goto out;
  586. check_disk_change(dev);
  587. error = -EACCES;
  588. if (!(flags & MS_RDONLY) && is_read_only(dev)) {
  589. blkdev_put(bdev, BDEV_FS);
  590. goto out;
  591. }
  592. error = -ENOMEM;
  593. s = alloc_super();
  594. if (!s) {
  595. blkdev_put(bdev, BDEV_FS);
  596. goto out;
  597. }
  598. error = -EBUSY;
  599. restart:
  600. spin_lock(&sb_lock);
  601. list_for_each(p, &super_blocks) {
  602. struct super_block *old = sb_entry(p);
  603. if (old->s_dev != dev)
  604. continue;
  605. if (old->s_type != fs_type ||
  606.     ((flags ^ old->s_flags) & MS_RDONLY)) {
  607. spin_unlock(&sb_lock);
  608. destroy_super(s);
  609. blkdev_put(bdev, BDEV_FS);
  610. goto out;
  611. }
  612. if (!grab_super(old))
  613. goto restart;
  614. destroy_super(s);
  615. blkdev_put(bdev, BDEV_FS);
  616. path_release(&nd);
  617. return old;
  618. }
  619. s->s_dev = dev;
  620. s->s_bdev = bdev;
  621. s->s_flags = flags;
  622. insert_super(s, fs_type);
  623. error = -EINVAL;
  624. lock_super(s);
  625. if (!fs_type->read_super(s, data, flags & MS_VERBOSE ? 1 : 0))
  626. goto out_fail;
  627. s->s_flags |= MS_ACTIVE;
  628. unlock_super(s);
  629. path_release(&nd);
  630. return s;
  631. out_fail:
  632. unlock_super(s);
  633. deactivate_super(s);
  634. remove_super(s);
  635. out:
  636. path_release(&nd);
  637. return ERR_PTR(error);
  638. }
  639. static struct super_block *get_sb_nodev(struct file_system_type *fs_type,
  640. int flags, void * data)
  641. {
  642. kdev_t dev;
  643. int error = -EMFILE;
  644. dev = get_unnamed_dev();
  645. if (dev) {
  646. struct super_block * sb;
  647. error = -EINVAL;
  648. sb = read_super(dev, NULL, fs_type, flags, data);
  649. if (sb)
  650. return sb;
  651. }
  652. return ERR_PTR(error);
  653. }
  654. static struct super_block *get_sb_single(struct file_system_type *fs_type,
  655. int flags, void *data)
  656. {
  657. struct super_block * s = alloc_super();
  658. if (!s)
  659. return ERR_PTR(-ENOMEM);
  660. /*
  661.  * Get the superblock of kernel-wide instance, but
  662.  * keep the reference to fs_type.
  663.  */
  664. retry:
  665. spin_lock(&sb_lock);
  666. if (!list_empty(&fs_type->fs_supers)) {
  667. struct super_block *old;
  668. old = list_entry(fs_type->fs_supers.next, struct super_block,
  669. s_instances);
  670. if (!grab_super(old))
  671. goto retry;
  672. destroy_super(s);
  673. do_remount_sb(old, flags, data);
  674. return old;
  675. } else {
  676. kdev_t dev = get_unnamed_dev();
  677. if (!dev) {
  678. spin_unlock(&sb_lock);
  679. destroy_super(s);
  680. return ERR_PTR(-EMFILE);
  681. }
  682. s->s_dev = dev;
  683. s->s_flags = flags;
  684. insert_super(s, fs_type);
  685. lock_super(s);
  686. if (!fs_type->read_super(s, data, flags & MS_VERBOSE ? 1 : 0))
  687. goto out_fail;
  688. s->s_flags |= MS_ACTIVE;
  689. unlock_super(s);
  690. return s;
  691. out_fail:
  692. unlock_super(s);
  693. deactivate_super(s);
  694. remove_super(s);
  695. return ERR_PTR(-EINVAL);
  696. }
  697. }
  698. void kill_super(struct super_block *sb)
  699. {
  700. struct dentry *root = sb->s_root;
  701. struct file_system_type *fs = sb->s_type;
  702. struct super_operations *sop = sb->s_op;
  703. if (!deactivate_super(sb))
  704. return;
  705. down_write(&sb->s_umount);
  706. lock_kernel();
  707. sb->s_root = NULL;
  708. /* Need to clean after the sucker */
  709. if (fs->fs_flags & FS_LITTER)
  710. d_genocide(root);
  711. shrink_dcache_parent(root);
  712. dput(root);
  713. fsync_super(sb);
  714. lock_super(sb);
  715. sb->s_flags &= ~MS_ACTIVE;
  716. invalidate_inodes(sb); /* bad name - it should be evict_inodes() */
  717. if (sop) {
  718. if (sop->write_super && sb->s_dirt)
  719. sop->write_super(sb);
  720. if (sop->put_super)
  721. sop->put_super(sb);
  722. }
  723. /* Forget any remaining inodes */
  724. if (invalidate_inodes(sb)) {
  725. printk("VFS: Busy inodes after unmount. "
  726. "Self-destruct in 5 seconds.  Have a nice day...n");
  727. }
  728. unlock_kernel();
  729. unlock_super(sb);
  730. remove_super(sb);
  731. }
  732. /*
  733.  * Alters the mount flags of a mounted file system. Only the mount point
  734.  * is used as a reference - file system type and the device are ignored.
  735.  */
  736. int do_remount_sb(struct super_block *sb, int flags, void *data)
  737. {
  738. int retval;
  739. if (!(flags & MS_RDONLY) && sb->s_dev && is_read_only(sb->s_dev))
  740. return -EACCES;
  741. /*flags |= MS_RDONLY;*/
  742. if (flags & MS_RDONLY)
  743. acct_auto_close(sb->s_dev);
  744. shrink_dcache_sb(sb);
  745. fsync_super(sb);
  746. /* If we are remounting RDONLY, make sure there are no rw files open */
  747. if ((flags & MS_RDONLY) && !(sb->s_flags & MS_RDONLY))
  748. if (!fs_may_remount_ro(sb))
  749. return -EBUSY;
  750. if (sb->s_op && sb->s_op->remount_fs) {
  751. lock_super(sb);
  752. retval = sb->s_op->remount_fs(sb, &flags, data);
  753. unlock_super(sb);
  754. if (retval)
  755. return retval;
  756. }
  757. sb->s_flags = (sb->s_flags & ~MS_RMT_MASK) | (flags & MS_RMT_MASK);
  758. /*
  759.  * We can't invalidate inodes as we can loose data when remounting
  760.  * (someone might manage to alter data while we are waiting in lock_super()
  761.  * or in foo_remount_fs()))
  762.  */
  763. return 0;
  764. }
  765. struct vfsmount *do_kern_mount(char *type, int flags, char *name, void *data)
  766. {
  767. struct file_system_type * fstype;
  768. struct vfsmount *mnt = NULL;
  769. struct super_block *sb;
  770. if (!type || !memchr(type, 0, PAGE_SIZE))
  771. return ERR_PTR(-EINVAL);
  772. /* we need capabilities... */
  773. if (!capable(CAP_SYS_ADMIN))
  774. return ERR_PTR(-EPERM);
  775. /* ... filesystem driver... */
  776. fstype = get_fs_type(type);
  777. if (!fstype)
  778. return ERR_PTR(-ENODEV);
  779. /* ... allocated vfsmount... */
  780. mnt = alloc_vfsmnt();
  781. if (!mnt) {
  782. mnt = ERR_PTR(-ENOMEM);
  783. goto fs_out;
  784. }
  785. set_devname(mnt, name);
  786. /* get locked superblock */
  787. if (fstype->fs_flags & FS_REQUIRES_DEV)
  788. sb = get_sb_bdev(fstype, name, flags, data);
  789. else if (fstype->fs_flags & FS_SINGLE)
  790. sb = get_sb_single(fstype, flags, data);
  791. else
  792. sb = get_sb_nodev(fstype, flags, data);
  793. if (IS_ERR(sb)) {
  794. free_vfsmnt(mnt);
  795. mnt = (struct vfsmount *)sb;
  796. goto fs_out;
  797. }
  798. if (fstype->fs_flags & FS_NOMOUNT)
  799. sb->s_flags |= MS_NOUSER;
  800. mnt->mnt_sb = sb;
  801. mnt->mnt_root = dget(sb->s_root);
  802. mnt->mnt_mountpoint = mnt->mnt_root;
  803. mnt->mnt_parent = mnt;
  804. up_write(&sb->s_umount);
  805. fs_out:
  806. put_filesystem(fstype);
  807. return mnt;
  808. }
  809. struct vfsmount *kern_mount(struct file_system_type *type)
  810. {
  811. return do_kern_mount((char *)type->name, 0, (char *)type->name, NULL);
  812. }
  813. static char * __initdata root_mount_data;
  814. static int __init root_data_setup(char *str)
  815. {
  816. root_mount_data = str;
  817. return 1;
  818. }
  819. static char * __initdata root_fs_names;
  820. static int __init fs_names_setup(char *str)
  821. {
  822. root_fs_names = str;
  823. return 1;
  824. }
  825. __setup("rootflags=", root_data_setup);
  826. __setup("rootfstype=", fs_names_setup);
  827. static void __init get_fs_names(char *page)
  828. {
  829. char *s = page;
  830. if (root_fs_names) {
  831. strcpy(page, root_fs_names);
  832. while (*s++) {
  833. if (s[-1] == ',')
  834. s[-1] = '';
  835. }
  836. } else {
  837. int len = get_filesystem_list(page);
  838. char *p, *next;
  839. page[len] = '';
  840. for (p = page-1; p; p = next) {
  841. next = strchr(++p, 'n');
  842. if (*p++ != 't')
  843. continue;
  844. while ((*s++ = *p++) != 'n')
  845. ;
  846. s[-1] = '';
  847. }
  848. }
  849. *s = '';
  850. }
  851. void __init mount_root(void)
  852. {
  853. struct nameidata root_nd;
  854. struct super_block * sb;
  855. struct vfsmount *vfsmnt;
  856. struct block_device *bdev = NULL;
  857. mode_t mode;
  858. int retval;
  859. void *handle;
  860. char path[64];
  861. int path_start = -1;
  862. char *name = "/dev/root";
  863. char *fs_names, *p;
  864. #ifdef CONFIG_ROOT_NFS
  865. void *data;
  866. #endif
  867. root_mountflags |= MS_VERBOSE;
  868. #ifdef CONFIG_ROOT_NFS
  869. if (MAJOR(ROOT_DEV) != UNNAMED_MAJOR)
  870. goto skip_nfs;
  871. data = nfs_root_data();
  872. if (!data)
  873. goto no_nfs;
  874. vfsmnt = do_kern_mount("nfs", root_mountflags, "/dev/root", data);
  875. if (!IS_ERR(vfsmnt)) {
  876. printk ("VFS: Mounted root (%s filesystem).n", "nfs");
  877. ROOT_DEV = vfsmnt->mnt_sb->s_dev;
  878. goto attach_it;
  879. }
  880. no_nfs:
  881. printk(KERN_ERR "VFS: Unable to mount root fs via NFS, trying floppy.n");
  882. ROOT_DEV = MKDEV(FLOPPY_MAJOR, 0);
  883. skip_nfs:
  884. #endif
  885. #ifdef CONFIG_BLK_DEV_FD
  886. if (MAJOR(ROOT_DEV) == FLOPPY_MAJOR) {
  887. #ifdef CONFIG_BLK_DEV_RAM
  888. extern int rd_doload;
  889. extern void rd_load_secondary(void);
  890. #endif
  891. floppy_eject();
  892. #ifndef CONFIG_BLK_DEV_RAM
  893. printk(KERN_NOTICE "(Warning, this kernel has no ramdisk support)n");
  894. #else
  895. /* rd_doload is 2 for a dual initrd/ramload setup */
  896. if(rd_doload==2)
  897. rd_load_secondary();
  898. else
  899. #endif
  900. {
  901. printk(KERN_NOTICE "VFS: Insert root floppy and press ENTERn");
  902. wait_for_keypress();
  903. }
  904. }
  905. #endif
  906. fs_names = __getname();
  907. get_fs_names(fs_names);
  908. devfs_make_root (root_device_name);
  909. handle = devfs_find_handle (NULL, ROOT_DEVICE_NAME,
  910.                             MAJOR (ROOT_DEV), MINOR (ROOT_DEV),
  911.     DEVFS_SPECIAL_BLK, 1);
  912. if (handle)  /*  Sigh: bd*() functions only paper over the cracks  */
  913. {
  914.     unsigned major, minor;
  915.     devfs_get_maj_min (handle, &major, &minor);
  916.     ROOT_DEV = MKDEV (major, minor);
  917. }
  918. /*
  919.  * Probably pure paranoia, but I'm less than happy about delving into
  920.  * devfs crap and checking it right now. Later.
  921.  */
  922. if (!ROOT_DEV)
  923. panic("I have no root and I want to scream");
  924. retry:
  925. bdev = bdget(kdev_t_to_nr(ROOT_DEV));
  926. if (!bdev)
  927. panic("%s: unable to allocate root device", __FUNCTION__);
  928. bdev->bd_op = devfs_get_ops (handle); /* Increments module use count */
  929. path_start = devfs_generate_path (handle, path + 5, sizeof (path) - 5);
  930. mode = FMODE_READ;
  931. if (!(root_mountflags & MS_RDONLY))
  932. mode |= FMODE_WRITE;
  933. retval = blkdev_get(bdev, mode, 0, BDEV_FS);
  934. devfs_put_ops (handle); /* Decrement module use count now we're safe */
  935. if (retval == -EROFS) {
  936. root_mountflags |= MS_RDONLY;
  937. goto retry;
  938. }
  939. if (retval) {
  940.         /*
  941.  * Allow the user to distinguish between failed open
  942.  * and bad superblock on root device.
  943.  */
  944. Eio:
  945. printk ("VFS: Cannot open root device "%s" or %sn",
  946. root_device_name, kdevname (ROOT_DEV));
  947. printk ("Please append a correct "root=" boot optionn");
  948. panic("VFS: Unable to mount root fs on %s",
  949. kdevname(ROOT_DEV));
  950. }
  951. check_disk_change(ROOT_DEV);
  952. sb = get_super(ROOT_DEV);
  953. if (sb) {
  954. /* FIXME */
  955. p = (char *)sb->s_type->name;
  956. atomic_inc(&sb->s_active);
  957. up_read(&sb->s_umount);
  958. down_write(&sb->s_umount);
  959. goto mount_it;
  960. }
  961. for (p = fs_names; *p; p += strlen(p)+1) {
  962. struct file_system_type * fs_type = get_fs_type(p);
  963. if (!fs_type)
  964.    continue;
  965. atomic_inc(&bdev->bd_count);
  966. retval = blkdev_get(bdev, mode, 0, BDEV_FS);
  967. if (retval)
  968. goto Eio;
  969.    sb = read_super(ROOT_DEV, bdev, fs_type,
  970. root_mountflags, root_mount_data);
  971. put_filesystem(fs_type);
  972. if (sb) {
  973. blkdev_put(bdev, BDEV_FS);
  974. goto mount_it;
  975. }
  976. }
  977. panic("VFS: Unable to mount root fs on %s", kdevname(ROOT_DEV));
  978. mount_it:
  979. /* FIXME */
  980. up_write(&sb->s_umount);
  981. printk ("VFS: Mounted root (%s filesystem)%s.n", p,
  982. (sb->s_flags & MS_RDONLY) ? " readonly" : "");
  983. putname(fs_names);
  984. if (path_start >= 0) {
  985. name = path + path_start;
  986. devfs_unregister (devfs_find_handle(NULL, "root", 0, 0, 0, 0));
  987. devfs_mk_symlink (NULL, "root", DEVFS_FL_DEFAULT,
  988.   name + 5, NULL, NULL);
  989. memcpy (name, "/dev/", 5);
  990. }
  991. vfsmnt = alloc_vfsmnt();
  992. if (!vfsmnt)
  993. panic("VFS: alloc_vfsmnt failed for root fs");
  994. set_devname(vfsmnt, name);
  995. vfsmnt->mnt_sb = sb;
  996. vfsmnt->mnt_root = dget(sb->s_root);
  997. bdput(bdev); /* sb holds a reference */
  998. #ifdef CONFIG_ROOT_NFS
  999. attach_it:
  1000. #endif
  1001. root_nd.mnt = root_vfsmnt;
  1002. root_nd.dentry = root_vfsmnt->mnt_sb->s_root;
  1003. graft_tree(vfsmnt, &root_nd);
  1004. set_fs_root(current->fs, vfsmnt, vfsmnt->mnt_root);
  1005. set_fs_pwd(current->fs, vfsmnt, vfsmnt->mnt_root);
  1006. mntput(vfsmnt);
  1007. }