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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/fs/namespace.c
  3.  *
  4.  * (C) Copyright Al Viro 2000, 2001
  5.  * Released under GPL v2.
  6.  *
  7.  * Based on code from fs/super.c, copyright Linus Torvalds and others.
  8.  * Heavily rewritten.
  9.  */
  10. #include <linux/config.h>
  11. #include <linux/slab.h>
  12. #include <linux/smp_lock.h>
  13. #include <linux/init.h>
  14. #include <linux/quotaops.h>
  15. #include <linux/acct.h>
  16. #include <linux/module.h>
  17. #include <linux/devfs_fs_kernel.h>
  18. #include <asm/uaccess.h>
  19. #include <linux/seq_file.h>
  20. struct vfsmount *do_kern_mount(char *type, int flags, char *name, void *data);
  21. int do_remount_sb(struct super_block *sb, int flags, void * data);
  22. void kill_super(struct super_block *sb);
  23. static struct list_head *mount_hashtable;
  24. static int hash_mask, hash_bits;
  25. static kmem_cache_t *mnt_cache; 
  26. static LIST_HEAD(vfsmntlist);
  27. static DECLARE_MUTEX(mount_sem);
  28. /* Will be static */
  29. struct vfsmount *root_vfsmnt;
  30. static inline unsigned long hash(struct vfsmount *mnt, struct dentry *dentry)
  31. {
  32. unsigned long tmp = ((unsigned long) mnt / L1_CACHE_BYTES);
  33. tmp += ((unsigned long) dentry / L1_CACHE_BYTES);
  34. tmp = tmp + (tmp >> hash_bits);
  35. return tmp & hash_mask;
  36. }
  37. struct vfsmount *alloc_vfsmnt(void)
  38. {
  39. struct vfsmount *mnt = kmem_cache_alloc(mnt_cache, GFP_KERNEL); 
  40. if (mnt) {
  41. memset(mnt, 0, sizeof(struct vfsmount));
  42. atomic_set(&mnt->mnt_count,1);
  43. INIT_LIST_HEAD(&mnt->mnt_hash);
  44. INIT_LIST_HEAD(&mnt->mnt_child);
  45. INIT_LIST_HEAD(&mnt->mnt_mounts);
  46. INIT_LIST_HEAD(&mnt->mnt_list);
  47. }
  48. return mnt;
  49. }
  50. void free_vfsmnt(struct vfsmount *mnt)
  51. {
  52. if (mnt->mnt_devname)
  53. kfree(mnt->mnt_devname);
  54. kmem_cache_free(mnt_cache, mnt);
  55. }
  56. void set_devname(struct vfsmount *mnt, const char *name)
  57. {
  58. if (name) {
  59. int size = strlen(name)+1;
  60. char * newname = kmalloc(size, GFP_KERNEL);
  61. if (newname) {
  62. memcpy(newname, name, size);
  63. mnt->mnt_devname = newname;
  64. }
  65. }
  66. }
  67. struct vfsmount *lookup_mnt(struct vfsmount *mnt, struct dentry *dentry)
  68. {
  69. struct list_head * head = mount_hashtable + hash(mnt, dentry);
  70. struct list_head * tmp = head;
  71. struct vfsmount *p;
  72. for (;;) {
  73. tmp = tmp->next;
  74. p = NULL;
  75. if (tmp == head)
  76. break;
  77. p = list_entry(tmp, struct vfsmount, mnt_hash);
  78. if (p->mnt_parent == mnt && p->mnt_mountpoint == dentry)
  79. break;
  80. }
  81. return p;
  82. }
  83. static int check_mnt(struct vfsmount *mnt)
  84. {
  85. spin_lock(&dcache_lock);
  86. while (mnt->mnt_parent != mnt)
  87. mnt = mnt->mnt_parent;
  88. spin_unlock(&dcache_lock);
  89. return mnt == root_vfsmnt;
  90. }
  91. static void detach_mnt(struct vfsmount *mnt, struct nameidata *old_nd)
  92. {
  93. old_nd->dentry = mnt->mnt_mountpoint;
  94. old_nd->mnt = mnt->mnt_parent;
  95. mnt->mnt_parent = mnt;
  96. mnt->mnt_mountpoint = mnt->mnt_root;
  97. list_del_init(&mnt->mnt_child);
  98. list_del_init(&mnt->mnt_hash);
  99. old_nd->dentry->d_mounted--;
  100. }
  101. static void attach_mnt(struct vfsmount *mnt, struct nameidata *nd)
  102. {
  103. mnt->mnt_parent = mntget(nd->mnt);
  104. mnt->mnt_mountpoint = dget(nd->dentry);
  105. list_add(&mnt->mnt_hash, mount_hashtable+hash(nd->mnt, nd->dentry));
  106. list_add(&mnt->mnt_child, &nd->mnt->mnt_mounts);
  107. nd->dentry->d_mounted++;
  108. }
  109. static struct vfsmount *next_mnt(struct vfsmount *p, struct vfsmount *root)
  110. {
  111. struct list_head *next = p->mnt_mounts.next;
  112. if (next == &p->mnt_mounts) {
  113. while (1) {
  114. if (p == root)
  115. return NULL;
  116. next = p->mnt_child.next;
  117. if (next != &p->mnt_parent->mnt_mounts)
  118. break;
  119. p = p->mnt_parent;
  120. }
  121. }
  122. return list_entry(next, struct vfsmount, mnt_child);
  123. }
  124. static struct vfsmount *
  125. clone_mnt(struct vfsmount *old, struct dentry *root)
  126. {
  127. struct super_block *sb = old->mnt_sb;
  128. struct vfsmount *mnt = alloc_vfsmnt();
  129. if (mnt) {
  130. mnt->mnt_flags = old->mnt_flags;
  131. set_devname(mnt, old->mnt_devname);
  132. atomic_inc(&sb->s_active);
  133. mnt->mnt_sb = sb;
  134. mnt->mnt_root = dget(root);
  135. mnt->mnt_mountpoint = mnt->mnt_root;
  136. mnt->mnt_parent = mnt;
  137. }
  138. return mnt;
  139. }
  140. void __mntput(struct vfsmount *mnt)
  141. {
  142. struct super_block *sb = mnt->mnt_sb;
  143. dput(mnt->mnt_root);
  144. free_vfsmnt(mnt);
  145. kill_super(sb);
  146. }
  147. /* iterator */
  148. static void *m_start(struct seq_file *m, loff_t *pos)
  149. {
  150. struct list_head *p;
  151. loff_t n = *pos;
  152. down(&mount_sem);
  153. list_for_each(p, &vfsmntlist)
  154. if (!n--)
  155. return list_entry(p, struct vfsmount, mnt_list);
  156. return NULL;
  157. }
  158. static void *m_next(struct seq_file *m, void *v, loff_t *pos)
  159. {
  160. struct list_head *p = ((struct vfsmount *)v)->mnt_list.next;
  161. (*pos)++;
  162. return p==&vfsmntlist ? NULL : list_entry(p, struct vfsmount, mnt_list);
  163. }
  164. static void m_stop(struct seq_file *m, void *v)
  165. {
  166. up(&mount_sem);
  167. }
  168. static inline void mangle(struct seq_file *m, const char *s)
  169. {
  170. seq_escape(m, s, " tn\");
  171. }
  172. static int show_vfsmnt(struct seq_file *m, void *v)
  173. {
  174. struct vfsmount *mnt = v;
  175. int err = 0;
  176. static struct proc_fs_info {
  177. int flag;
  178. char *str;
  179. } fs_info[] = {
  180. { MS_SYNCHRONOUS, ",sync" },
  181. { MS_MANDLOCK, ",mand" },
  182. { MS_NOATIME, ",noatime" },
  183. { MS_NODIRATIME, ",nodiratime" },
  184. { 0, NULL }
  185. };
  186. static struct proc_fs_info mnt_info[] = {
  187. { MNT_NOSUID, ",nosuid" },
  188. { MNT_NODEV, ",nodev" },
  189. { MNT_NOEXEC, ",noexec" },
  190. { 0, NULL }
  191. };
  192. struct proc_fs_info *fs_infop;
  193. char *path_buf, *path;
  194. path_buf = (char *) __get_free_page(GFP_KERNEL);
  195. if (!path_buf)
  196. return -ENOMEM;
  197. path = d_path(mnt->mnt_root, mnt, path_buf, PAGE_SIZE);
  198. mangle(m, mnt->mnt_devname ? mnt->mnt_devname : "none");
  199. seq_putc(m, ' ');
  200. mangle(m, path);
  201. free_page((unsigned long) path_buf);
  202. seq_putc(m, ' ');
  203. mangle(m, mnt->mnt_sb->s_type->name);
  204. seq_puts(m, mnt->mnt_sb->s_flags & MS_RDONLY ? " ro" : " rw");
  205. for (fs_infop = fs_info; fs_infop->flag; fs_infop++) {
  206. if (mnt->mnt_sb->s_flags & fs_infop->flag)
  207. seq_puts(m, fs_infop->str);
  208. }
  209. for (fs_infop = mnt_info; fs_infop->flag; fs_infop++) {
  210. if (mnt->mnt_flags & fs_infop->flag)
  211. seq_puts(m, fs_infop->str);
  212. }
  213. if (mnt->mnt_sb->s_op->show_options)
  214. err = mnt->mnt_sb->s_op->show_options(m, mnt);
  215. seq_puts(m, " 0 0n");
  216. return err;
  217. }
  218. struct seq_operations mounts_op = {
  219. start: m_start,
  220. next: m_next,
  221. stop: m_stop,
  222. show: show_vfsmnt
  223. };
  224. /*
  225.  * Doesn't take quota and stuff into account. IOW, in some cases it will
  226.  * give false negatives. The main reason why it's here is that we need
  227.  * a non-destructive way to look for easily umountable filesystems.
  228.  */
  229. int may_umount(struct vfsmount *mnt)
  230. {
  231. if (atomic_read(&mnt->mnt_count) > 2)
  232. return -EBUSY;
  233. return 0;
  234. }
  235. void umount_tree(struct vfsmount *mnt)
  236. {
  237. struct vfsmount *p;
  238. LIST_HEAD(kill);
  239. for (p = mnt; p; p = next_mnt(p, mnt)) {
  240. list_del(&p->mnt_list);
  241. list_add(&p->mnt_list, &kill);
  242. }
  243. while (!list_empty(&kill)) {
  244. mnt = list_entry(kill.next, struct vfsmount, mnt_list);
  245. list_del_init(&mnt->mnt_list);
  246. if (mnt->mnt_parent == mnt) {
  247. spin_unlock(&dcache_lock);
  248. } else {
  249. struct nameidata old_nd;
  250. detach_mnt(mnt, &old_nd);
  251. spin_unlock(&dcache_lock);
  252. path_release(&old_nd);
  253. }
  254. mntput(mnt);
  255. spin_lock(&dcache_lock);
  256. }
  257. }
  258. static int do_umount(struct vfsmount *mnt, int flags)
  259. {
  260. struct super_block * sb = mnt->mnt_sb;
  261. int retval = 0;
  262. /*
  263.  * If we may have to abort operations to get out of this
  264.  * mount, and they will themselves hold resources we must
  265.  * allow the fs to do things. In the Unix tradition of
  266.  * 'Gee thats tricky lets do it in userspace' the umount_begin
  267.  * might fail to complete on the first run through as other tasks
  268.  * must return, and the like. Thats for the mount program to worry
  269.  * about for the moment.
  270.  */
  271. lock_kernel();
  272. if( (flags&MNT_FORCE) && sb->s_op->umount_begin)
  273. sb->s_op->umount_begin(sb);
  274. unlock_kernel();
  275. /*
  276.  * No sense to grab the lock for this test, but test itself looks
  277.  * somewhat bogus. Suggestions for better replacement?
  278.  * Ho-hum... In principle, we might treat that as umount + switch
  279.  * to rootfs. GC would eventually take care of the old vfsmount.
  280.  * Actually it makes sense, especially if rootfs would contain a
  281.  * /reboot - static binary that would close all descriptors and
  282.  * call reboot(9). Then init(8) could umount root and exec /reboot.
  283.  */
  284. if (mnt == current->fs->rootmnt && !(flags & MNT_DETACH)) {
  285. /*
  286.  * Special case for "unmounting" root ...
  287.  * we just try to remount it readonly.
  288.  */
  289. down_write(&sb->s_umount);
  290. if (!(sb->s_flags & MS_RDONLY)) {
  291. lock_kernel();
  292. retval = do_remount_sb(sb, MS_RDONLY, 0);
  293. unlock_kernel();
  294. }
  295. up_write(&sb->s_umount);
  296. return retval;
  297. }
  298. down(&mount_sem);
  299. spin_lock(&dcache_lock);
  300. if (atomic_read(&sb->s_active) == 1) {
  301. /* last instance - try to be smart */
  302. spin_unlock(&dcache_lock);
  303. lock_kernel();
  304. DQUOT_OFF(sb);
  305. acct_auto_close(sb->s_dev);
  306. unlock_kernel();
  307. spin_lock(&dcache_lock);
  308. }
  309. retval = -EBUSY;
  310. if (atomic_read(&mnt->mnt_count) == 2 || flags & MNT_DETACH) {
  311. if (!list_empty(&mnt->mnt_list))
  312. umount_tree(mnt);
  313. retval = 0;
  314. }
  315. spin_unlock(&dcache_lock);
  316. up(&mount_sem);
  317. return retval;
  318. }
  319. /*
  320.  * Now umount can handle mount points as well as block devices.
  321.  * This is important for filesystems which use unnamed block devices.
  322.  *
  323.  * We now support a flag for forced unmount like the other 'big iron'
  324.  * unixes. Our API is identical to OSF/1 to avoid making a mess of AMD
  325.  */
  326. asmlinkage long sys_umount(char * name, int flags)
  327. {
  328. struct nameidata nd;
  329. char *kname;
  330. int retval;
  331. kname = getname(name);
  332. retval = PTR_ERR(kname);
  333. if (IS_ERR(kname))
  334. goto out;
  335. retval = 0;
  336. if (path_init(kname, LOOKUP_POSITIVE|LOOKUP_FOLLOW, &nd))
  337. retval = path_walk(kname, &nd);
  338. putname(kname);
  339. if (retval)
  340. goto out;
  341. retval = -EINVAL;
  342. if (nd.dentry != nd.mnt->mnt_root)
  343. goto dput_and_out;
  344. if (!check_mnt(nd.mnt))
  345. goto dput_and_out;
  346. retval = -EPERM;
  347. if (!capable(CAP_SYS_ADMIN))
  348. goto dput_and_out;
  349. retval = do_umount(nd.mnt, flags);
  350. dput_and_out:
  351. path_release(&nd);
  352. out:
  353. return retval;
  354. }
  355. /*
  356.  * The 2.0 compatible umount. No flags. 
  357.  */
  358.  
  359. asmlinkage long sys_oldumount(char * name)
  360. {
  361. return sys_umount(name,0);
  362. }
  363. static int mount_is_safe(struct nameidata *nd)
  364. {
  365. if (capable(CAP_SYS_ADMIN))
  366. return 0;
  367. return -EPERM;
  368. #ifdef notyet
  369. if (S_ISLNK(nd->dentry->d_inode->i_mode))
  370. return -EPERM;
  371. if (nd->dentry->d_inode->i_mode & S_ISVTX) {
  372. if (current->uid != nd->dentry->d_inode->i_uid)
  373. return -EPERM;
  374. }
  375. if (permission(nd->dentry->d_inode, MAY_WRITE))
  376. return -EPERM;
  377. return 0;
  378. #endif
  379. }
  380. static struct vfsmount *copy_tree(struct vfsmount *mnt, struct dentry *dentry)
  381. {
  382. struct vfsmount *p, *next, *q, *res;
  383. struct nameidata nd;
  384. p = mnt;
  385. res = nd.mnt = q = clone_mnt(p, dentry);
  386. if (!q)
  387. goto Enomem;
  388. q->mnt_parent = q;
  389. q->mnt_mountpoint = p->mnt_mountpoint;
  390. while ( (next = next_mnt(p, mnt)) != NULL) {
  391. while (p != next->mnt_parent) {
  392. p = p->mnt_parent;
  393. q = q->mnt_parent;
  394. }
  395. p = next;
  396. nd.mnt = q;
  397. nd.dentry = p->mnt_mountpoint;
  398. q = clone_mnt(p, p->mnt_root);
  399. if (!q)
  400. goto Enomem;
  401. spin_lock(&dcache_lock);
  402. list_add_tail(&q->mnt_list, &res->mnt_list);
  403. attach_mnt(q, &nd);
  404. spin_unlock(&dcache_lock);
  405. }
  406. return res;
  407. Enomem:
  408. if (res) {
  409. spin_lock(&dcache_lock);
  410. umount_tree(res);
  411. spin_unlock(&dcache_lock);
  412. }
  413. return NULL;
  414. }
  415. /* Will become static */
  416. int graft_tree(struct vfsmount *mnt, struct nameidata *nd)
  417. {
  418. int err;
  419. if (mnt->mnt_sb->s_flags & MS_NOUSER)
  420. return -EINVAL;
  421. if (S_ISDIR(nd->dentry->d_inode->i_mode) !=
  422.       S_ISDIR(mnt->mnt_root->d_inode->i_mode))
  423. return -ENOTDIR;
  424. err = -ENOENT;
  425. down(&nd->dentry->d_inode->i_zombie);
  426. if (IS_DEADDIR(nd->dentry->d_inode))
  427. goto out_unlock;
  428. spin_lock(&dcache_lock);
  429. if (IS_ROOT(nd->dentry) || !d_unhashed(nd->dentry)) {
  430. struct list_head head;
  431. attach_mnt(mnt, nd);
  432. list_add_tail(&head, &mnt->mnt_list);
  433. list_splice(&head, vfsmntlist.prev);
  434. mntget(mnt);
  435. err = 0;
  436. }
  437. spin_unlock(&dcache_lock);
  438. out_unlock:
  439. up(&nd->dentry->d_inode->i_zombie);
  440. return err;
  441. }
  442. /*
  443.  * do loopback mount.
  444.  */
  445. static int do_loopback(struct nameidata *nd, char *old_name, int recurse)
  446. {
  447. struct nameidata old_nd;
  448. struct vfsmount *mnt = NULL;
  449. int err = mount_is_safe(nd);
  450. if (err)
  451. return err;
  452. if (!old_name || !*old_name)
  453. return -EINVAL;
  454. if (path_init(old_name, LOOKUP_POSITIVE|LOOKUP_FOLLOW, &old_nd))
  455. err = path_walk(old_name, &old_nd);
  456. if (err)
  457. return err;
  458. down(&mount_sem);
  459. err = -EINVAL;
  460. if (check_mnt(nd->mnt) && (!recurse || check_mnt(old_nd.mnt))) {
  461. err = -ENOMEM;
  462. if (recurse)
  463. mnt = copy_tree(old_nd.mnt, old_nd.dentry);
  464. else
  465. mnt = clone_mnt(old_nd.mnt, old_nd.dentry);
  466. }
  467. if (mnt) {
  468. err = graft_tree(mnt, nd);
  469. if (err) {
  470. spin_lock(&dcache_lock);
  471. umount_tree(mnt);
  472. spin_unlock(&dcache_lock);
  473. } else
  474. mntput(mnt);
  475. }
  476. up(&mount_sem);
  477. path_release(&old_nd);
  478. return err;
  479. }
  480. /*
  481.  * change filesystem flags. dir should be a physical root of filesystem.
  482.  * If you've mounted a non-root directory somewhere and want to do remount
  483.  * on it - tough luck.
  484.  */
  485. static int do_remount(struct nameidata *nd,int flags,int mnt_flags,void *data)
  486. {
  487. int err;
  488. struct super_block * sb = nd->mnt->mnt_sb;
  489. if (!capable(CAP_SYS_ADMIN))
  490. return -EPERM;
  491. if (!check_mnt(nd->mnt))
  492. return -EINVAL;
  493. if (nd->dentry != nd->mnt->mnt_root)
  494. return -EINVAL;
  495. down_write(&sb->s_umount);
  496. err = do_remount_sb(sb, flags, data);
  497. if (!err)
  498. nd->mnt->mnt_flags=mnt_flags;
  499. up_write(&sb->s_umount);
  500. return err;
  501. }
  502. static int do_move_mount(struct nameidata *nd, char *old_name)
  503. {
  504. struct nameidata old_nd, parent_nd;
  505. struct vfsmount *p;
  506. int err = 0;
  507. if (!capable(CAP_SYS_ADMIN))
  508. return -EPERM;
  509. if (!old_name || !*old_name)
  510. return -EINVAL;
  511. if (path_init(old_name, LOOKUP_POSITIVE|LOOKUP_FOLLOW, &old_nd))
  512. err = path_walk(old_name, &old_nd);
  513. if (err)
  514. return err;
  515. down(&mount_sem);
  516. while(d_mountpoint(nd->dentry) && follow_down(&nd->mnt, &nd->dentry))
  517. ;
  518. err = -EINVAL;
  519. if (!check_mnt(nd->mnt) || !check_mnt(old_nd.mnt))
  520. goto out;
  521. err = -ENOENT;
  522. down(&nd->dentry->d_inode->i_zombie);
  523. if (IS_DEADDIR(nd->dentry->d_inode))
  524. goto out1;
  525. spin_lock(&dcache_lock);
  526. if (!IS_ROOT(nd->dentry) && d_unhashed(nd->dentry))
  527. goto out2;
  528. err = -EINVAL;
  529. if (old_nd.dentry != old_nd.mnt->mnt_root)
  530. goto out2;
  531. if (old_nd.mnt == old_nd.mnt->mnt_parent)
  532. goto out2;
  533. if (S_ISDIR(nd->dentry->d_inode->i_mode) !=
  534.       S_ISDIR(old_nd.dentry->d_inode->i_mode))
  535. goto out2;
  536. err = -ELOOP;
  537. for (p = nd->mnt; p->mnt_parent!=p; p = p->mnt_parent)
  538. if (p == old_nd.mnt)
  539. goto out2;
  540. err = 0;
  541. detach_mnt(old_nd.mnt, &parent_nd);
  542. attach_mnt(old_nd.mnt, nd);
  543. out2:
  544. spin_unlock(&dcache_lock);
  545. out1:
  546. up(&nd->dentry->d_inode->i_zombie);
  547. out:
  548. up(&mount_sem);
  549. if (!err)
  550. path_release(&parent_nd);
  551. path_release(&old_nd);
  552. return err;
  553. }
  554. static int do_add_mount(struct nameidata *nd, char *type, int flags,
  555. int mnt_flags, char *name, void *data)
  556. {
  557. struct vfsmount *mnt = do_kern_mount(type, flags, name, data);
  558. int err = PTR_ERR(mnt);
  559. if (IS_ERR(mnt))
  560. goto out;
  561. down(&mount_sem);
  562. /* Something was mounted here while we slept */
  563. while(d_mountpoint(nd->dentry) && follow_down(&nd->mnt, &nd->dentry))
  564. ;
  565. err = -EINVAL;
  566. if (!check_mnt(nd->mnt))
  567. goto unlock;
  568. /* Refuse the same filesystem on the same mount point */
  569. err = -EBUSY;
  570. if (nd->mnt->mnt_sb == mnt->mnt_sb && nd->mnt->mnt_root == nd->dentry)
  571. goto unlock;
  572. mnt->mnt_flags = mnt_flags;
  573. err = graft_tree(mnt, nd);
  574. unlock:
  575. up(&mount_sem);
  576. mntput(mnt);
  577. out:
  578. return err;
  579. }
  580. static int copy_mount_options (const void *data, unsigned long *where)
  581. {
  582. int i;
  583. unsigned long page;
  584. unsigned long size;
  585. *where = 0;
  586. if (!data)
  587. return 0;
  588. if (!(page = __get_free_page(GFP_KERNEL)))
  589. return -ENOMEM;
  590. /* We only care that *some* data at the address the user
  591.  * gave us is valid.  Just in case, we'll zero
  592.  * the remainder of the page.
  593.  */
  594. /* copy_from_user cannot cross TASK_SIZE ! */
  595. size = TASK_SIZE - (unsigned long)data;
  596. if (size > PAGE_SIZE)
  597. size = PAGE_SIZE;
  598. i = size - copy_from_user((void *)page, data, size);
  599. if (!i) {
  600. free_page(page); 
  601. return -EFAULT;
  602. }
  603. if (i != PAGE_SIZE)
  604. memset((char *)page + i, 0, PAGE_SIZE - i);
  605. *where = page;
  606. return 0;
  607. }
  608. /*
  609.  * Flags is a 32-bit value that allows up to 31 non-fs dependent flags to
  610.  * be given to the mount() call (ie: read-only, no-dev, no-suid etc).
  611.  *
  612.  * data is a (void *) that can point to any structure up to
  613.  * PAGE_SIZE-1 bytes, which can contain arbitrary fs-dependent
  614.  * information (or be NULL).
  615.  *
  616.  * Pre-0.97 versions of mount() didn't have a flags word.
  617.  * When the flags word was introduced its top half was required
  618.  * to have the magic value 0xC0ED, and this remained so until 2.4.0-test9.
  619.  * Therefore, if this magic number is present, it carries no information
  620.  * and must be discarded.
  621.  */
  622. long do_mount(char * dev_name, char * dir_name, char *type_page,
  623.   unsigned long flags, void *data_page)
  624. {
  625. struct nameidata nd;
  626. int retval = 0;
  627. int mnt_flags = 0;
  628. /* Discard magic */
  629. if ((flags & MS_MGC_MSK) == MS_MGC_VAL)
  630. flags &= ~MS_MGC_MSK;
  631. /* Basic sanity checks */
  632. if (!dir_name || !*dir_name || !memchr(dir_name, 0, PAGE_SIZE))
  633. return -EINVAL;
  634. if (dev_name && !memchr(dev_name, 0, PAGE_SIZE))
  635. return -EINVAL;
  636. /* Separate the per-mountpoint flags */
  637. if (flags & MS_NOSUID)
  638. mnt_flags |= MNT_NOSUID;
  639. if (flags & MS_NODEV)
  640. mnt_flags |= MNT_NODEV;
  641. if (flags & MS_NOEXEC)
  642. mnt_flags |= MNT_NOEXEC;
  643. flags &= ~(MS_NOSUID|MS_NOEXEC|MS_NODEV);
  644. /* ... and get the mountpoint */
  645. if (path_init(dir_name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd))
  646. retval = path_walk(dir_name, &nd);
  647. if (retval)
  648. return retval;
  649. if (flags & MS_REMOUNT)
  650. retval = do_remount(&nd, flags & ~MS_REMOUNT, mnt_flags,
  651.     data_page);
  652. else if (flags & MS_BIND)
  653. retval = do_loopback(&nd, dev_name, flags & MS_REC);
  654. else if (flags & MS_MOVE)
  655. retval = do_move_mount(&nd, dev_name);
  656. else
  657. retval = do_add_mount(&nd, type_page, flags, mnt_flags,
  658.       dev_name, data_page);
  659. path_release(&nd);
  660. return retval;
  661. }
  662. asmlinkage long sys_mount(char * dev_name, char * dir_name, char * type,
  663.   unsigned long flags, void * data)
  664. {
  665. int retval;
  666. unsigned long data_page;
  667. unsigned long type_page;
  668. unsigned long dev_page;
  669. char *dir_page;
  670. retval = copy_mount_options (type, &type_page);
  671. if (retval < 0)
  672. return retval;
  673. dir_page = getname(dir_name);
  674. retval = PTR_ERR(dir_page);
  675. if (IS_ERR(dir_page))
  676. goto out1;
  677. retval = copy_mount_options (dev_name, &dev_page);
  678. if (retval < 0)
  679. goto out2;
  680. retval = copy_mount_options (data, &data_page);
  681. if (retval < 0)
  682. goto out3;
  683. lock_kernel();
  684. retval = do_mount((char*)dev_page, dir_page, (char*)type_page,
  685.   flags, (void*)data_page);
  686. unlock_kernel();
  687. free_page(data_page);
  688. out3:
  689. free_page(dev_page);
  690. out2:
  691. putname(dir_page);
  692. out1:
  693. free_page(type_page);
  694. return retval;
  695. }
  696. static void chroot_fs_refs(struct nameidata *old_nd, struct nameidata *new_nd)
  697. {
  698. struct task_struct *p;
  699. struct fs_struct *fs;
  700. read_lock(&tasklist_lock);
  701. for_each_task(p) {
  702. task_lock(p);
  703. fs = p->fs;
  704. if (fs) {
  705. atomic_inc(&fs->count);
  706. task_unlock(p);
  707. if (fs->root==old_nd->dentry&&fs->rootmnt==old_nd->mnt)
  708. set_fs_root(fs, new_nd->mnt, new_nd->dentry);
  709. if (fs->pwd==old_nd->dentry&&fs->pwdmnt==old_nd->mnt)
  710. set_fs_pwd(fs, new_nd->mnt, new_nd->dentry);
  711. put_fs_struct(fs);
  712. } else
  713. task_unlock(p);
  714. }
  715. read_unlock(&tasklist_lock);
  716. }
  717. /*
  718.  * Moves the current root to put_root, and sets root/cwd of all processes
  719.  * which had them on the old root to new_root.
  720.  *
  721.  * Note:
  722.  *  - we don't move root/cwd if they are not at the root (reason: if something
  723.  *    cared enough to change them, it's probably wrong to force them elsewhere)
  724.  *  - it's okay to pick a root that isn't the root of a file system, e.g.
  725.  *    /nfs/my_root where /nfs is the mount point. It must be a mountpoint,
  726.  *    though, so you may need to say mount --bind /nfs/my_root /nfs/my_root
  727.  *    first.
  728.  */
  729. asmlinkage long sys_pivot_root(const char *new_root, const char *put_old)
  730. {
  731. struct vfsmount *tmp;
  732. struct nameidata new_nd, old_nd, parent_nd, root_parent, user_nd;
  733. char *name;
  734. int error;
  735. if (!capable(CAP_SYS_ADMIN))
  736. return -EPERM;
  737. lock_kernel();
  738. name = getname(new_root);
  739. error = PTR_ERR(name);
  740. if (IS_ERR(name))
  741. goto out0;
  742. error = 0;
  743. if (path_init(name, LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &new_nd))
  744. error = path_walk(name, &new_nd);
  745. putname(name);
  746. if (error)
  747. goto out0;
  748. error = -EINVAL;
  749. if (!check_mnt(new_nd.mnt))
  750. goto out1;
  751. name = getname(put_old);
  752. error = PTR_ERR(name);
  753. if (IS_ERR(name))
  754. goto out1;
  755. error = 0;
  756. if (path_init(name, LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY, &old_nd))
  757. error = path_walk(name, &old_nd);
  758. putname(name);
  759. if (error)
  760. goto out1;
  761. read_lock(&current->fs->lock);
  762. user_nd.mnt = mntget(current->fs->rootmnt);
  763. user_nd.dentry = dget(current->fs->root);
  764. read_unlock(&current->fs->lock);
  765. down(&mount_sem);
  766. down(&old_nd.dentry->d_inode->i_zombie);
  767. error = -EINVAL;
  768. if (!check_mnt(user_nd.mnt))
  769. goto out2;
  770. error = -ENOENT;
  771. if (IS_DEADDIR(new_nd.dentry->d_inode))
  772. goto out2;
  773. if (d_unhashed(new_nd.dentry) && !IS_ROOT(new_nd.dentry))
  774. goto out2;
  775. if (d_unhashed(old_nd.dentry) && !IS_ROOT(old_nd.dentry))
  776. goto out2;
  777. error = -EBUSY;
  778. if (new_nd.mnt == user_nd.mnt || old_nd.mnt == user_nd.mnt)
  779. goto out2; /* loop */
  780. error = -EINVAL;
  781. if (user_nd.mnt->mnt_root != user_nd.dentry)
  782. goto out2;
  783. if (new_nd.mnt->mnt_root != new_nd.dentry)
  784. goto out2; /* not a mountpoint */
  785. tmp = old_nd.mnt; /* make sure we can reach put_old from new_root */
  786. spin_lock(&dcache_lock);
  787. if (tmp != new_nd.mnt) {
  788. for (;;) {
  789. if (tmp->mnt_parent == tmp)
  790. goto out3;
  791. if (tmp->mnt_parent == new_nd.mnt)
  792. break;
  793. tmp = tmp->mnt_parent;
  794. }
  795. if (!is_subdir(tmp->mnt_mountpoint, new_nd.dentry))
  796. goto out3;
  797. } else if (!is_subdir(old_nd.dentry, new_nd.dentry))
  798. goto out3;
  799. detach_mnt(new_nd.mnt, &parent_nd);
  800. detach_mnt(user_nd.mnt, &root_parent);
  801. attach_mnt(user_nd.mnt, &old_nd);
  802. attach_mnt(new_nd.mnt, &root_parent);
  803. spin_unlock(&dcache_lock);
  804. chroot_fs_refs(&user_nd, &new_nd);
  805. error = 0;
  806. path_release(&root_parent);
  807. path_release(&parent_nd);
  808. out2:
  809. up(&old_nd.dentry->d_inode->i_zombie);
  810. up(&mount_sem);
  811. path_release(&user_nd);
  812. path_release(&old_nd);
  813. out1:
  814. path_release(&new_nd);
  815. out0:
  816. unlock_kernel();
  817. return error;
  818. out3:
  819. spin_unlock(&dcache_lock);
  820. goto out2;
  821. }
  822. /*
  823.  * Absolutely minimal fake fs - only empty root directory and nothing else.
  824.  * In 2.5 we'll use ramfs or tmpfs, but for now it's all we need - just
  825.  * something to go with root vfsmount.
  826.  */
  827. static struct dentry *rootfs_lookup(struct inode *dir, struct dentry *dentry)
  828. {
  829. d_add(dentry, NULL);
  830. return NULL;
  831. }
  832. static struct file_operations rootfs_dir_operations = {
  833. read: generic_read_dir,
  834. readdir: dcache_readdir,
  835. };
  836. static struct inode_operations rootfs_dir_inode_operations = {
  837. lookup: rootfs_lookup,
  838. };
  839. static struct super_block *rootfs_read_super(struct super_block * sb, void * data, int silent)
  840. {
  841. struct inode * inode;
  842. struct dentry * root;
  843. static struct super_operations s_ops = {};
  844. sb->s_op = &s_ops;
  845. inode = new_inode(sb);
  846. if (!inode)
  847. return NULL;
  848. inode->i_mode = S_IFDIR|0555;
  849. inode->i_uid = inode->i_gid = 0;
  850. inode->i_op = &rootfs_dir_inode_operations;
  851. inode->i_fop = &rootfs_dir_operations;
  852. root = d_alloc_root(inode);
  853. if (!root) {
  854. iput(inode);
  855. return NULL;
  856. }
  857. sb->s_root = root;
  858. return sb;
  859. }
  860. static DECLARE_FSTYPE(root_fs_type, "rootfs", rootfs_read_super, FS_NOMOUNT);
  861. static void __init init_mount_tree(void)
  862. {
  863. register_filesystem(&root_fs_type);
  864. root_vfsmnt = do_kern_mount("rootfs", 0, "rootfs", NULL);
  865. if (IS_ERR(root_vfsmnt))
  866. panic("can't allocate root vfsmount");
  867. }
  868. void __init mnt_init(unsigned long mempages)
  869. {
  870. struct list_head *d;
  871. unsigned long order;
  872. unsigned int nr_hash;
  873. int i;
  874. mnt_cache = kmem_cache_create("mnt_cache", sizeof(struct vfsmount),
  875. 0, SLAB_HWCACHE_ALIGN, NULL, NULL);
  876. if (!mnt_cache)
  877. panic("Cannot create vfsmount cache");
  878. mempages >>= (16 - PAGE_SHIFT);
  879. mempages *= sizeof(struct list_head);
  880. for (order = 0; ((1UL << order) << PAGE_SHIFT) < mempages; order++)
  881. ;
  882. do {
  883. mount_hashtable = (struct list_head *)
  884. __get_free_pages(GFP_ATOMIC, order);
  885. } while (mount_hashtable == NULL && --order >= 0);
  886. if (!mount_hashtable)
  887. panic("Failed to allocate mount hash tablen");
  888. /*
  889.  * Find the power-of-two list-heads that can fit into the allocation..
  890.  * We don't guarantee that "sizeof(struct list_head)" is necessarily
  891.  * a power-of-two.
  892.  */
  893. nr_hash = (1UL << order) * PAGE_SIZE / sizeof(struct list_head);
  894. hash_bits = 0;
  895. do {
  896. hash_bits++;
  897. } while ((nr_hash >> hash_bits) != 0);
  898. hash_bits--;
  899. /*
  900.  * Re-calculate the actual number of entries and the mask
  901.  * from the number of bits we can fit.
  902.  */
  903. nr_hash = 1UL << hash_bits;
  904. hash_mask = nr_hash-1;
  905. printk("Mount-cache hash table entries: %d (order: %ld, %ld bytes)n",
  906. nr_hash, order, (PAGE_SIZE << order));
  907. /* And initialize the newly allocated array */
  908. d = mount_hashtable;
  909. i = nr_hash;
  910. do {
  911. INIT_LIST_HEAD(d);
  912. d++;
  913. i--;
  914. } while (i);
  915. init_mount_tree();
  916. }
  917. #ifdef CONFIG_BLK_DEV_INITRD
  918. int __init change_root(kdev_t new_root_dev,const char *put_old)
  919. {
  920. struct vfsmount *old_rootmnt;
  921. struct nameidata devfs_nd, nd;
  922. struct nameidata parent_nd;
  923. char *new_devname = kmalloc(strlen("/dev/root.old")+1, GFP_KERNEL);
  924. int error = 0;
  925. if (new_devname)
  926. strcpy(new_devname, "/dev/root.old");
  927. read_lock(&current->fs->lock);
  928. old_rootmnt = mntget(current->fs->rootmnt);
  929. read_unlock(&current->fs->lock);
  930. /*  First unmount devfs if mounted  */
  931. if (path_init("/dev", LOOKUP_FOLLOW|LOOKUP_POSITIVE, &devfs_nd))
  932. error = path_walk("/dev", &devfs_nd);
  933. if (!error) {
  934. if (devfs_nd.mnt->mnt_sb->s_magic == DEVFS_SUPER_MAGIC &&
  935.     devfs_nd.dentry == devfs_nd.mnt->mnt_root) {
  936. do_umount(devfs_nd.mnt, 0);
  937. }
  938. path_release(&devfs_nd);
  939. }
  940. spin_lock(&dcache_lock);
  941. detach_mnt(old_rootmnt, &parent_nd);
  942. spin_unlock(&dcache_lock);
  943. ROOT_DEV = new_root_dev;
  944. mount_root();
  945. #if 1
  946. shrink_dcache();
  947. printk("change_root: old root has d_count=%dn", 
  948.        atomic_read(&old_rootmnt->mnt_root->d_count));
  949. #endif
  950. mount_devfs_fs ();
  951. /*
  952.  * Get the new mount directory
  953.  */
  954. error = 0;
  955. if (path_init(put_old, LOOKUP_FOLLOW|LOOKUP_POSITIVE|LOOKUP_DIRECTORY, &nd))
  956. error = path_walk(put_old, &nd);
  957. if (error) {
  958. int blivet;
  959. struct block_device *ramdisk = old_rootmnt->mnt_sb->s_bdev;
  960. atomic_inc(&ramdisk->bd_count);
  961. blivet = blkdev_get(ramdisk, FMODE_READ, 0, BDEV_FS);
  962. printk(KERN_NOTICE "Trying to unmount old root ... ");
  963. if (!blivet) {
  964. spin_lock(&dcache_lock);
  965. list_del_init(&old_rootmnt->mnt_list);
  966.   spin_unlock(&dcache_lock);
  967.   mntput(old_rootmnt);
  968. mntput(old_rootmnt);
  969. blivet = ioctl_by_bdev(ramdisk, BLKFLSBUF, 0);
  970. path_release(&parent_nd);
  971. blkdev_put(ramdisk, BDEV_FS);
  972. }
  973. if (blivet) {
  974. printk(KERN_ERR "error %dn", blivet);
  975. } else {
  976. printk("okayn");
  977. error = 0;
  978. }
  979. kfree(new_devname);
  980. return error;
  981. }
  982. spin_lock(&dcache_lock);
  983. attach_mnt(old_rootmnt, &nd);
  984. if (new_devname) {
  985. if (old_rootmnt->mnt_devname)
  986. kfree(old_rootmnt->mnt_devname);
  987. old_rootmnt->mnt_devname = new_devname;
  988. }
  989. spin_unlock(&dcache_lock);
  990. /* put the old stuff */
  991. path_release(&parent_nd);
  992. mntput(old_rootmnt);
  993. path_release(&nd);
  994. return 0;
  995. }
  996. #endif