diff options
Diffstat (limited to 'fs/namespace.c')
-rw-r--r-- | fs/namespace.c | 57 |
1 files changed, 25 insertions, 32 deletions
diff --git a/fs/namespace.c b/fs/namespace.c index c77eedd2ac66..ac19212c9bc3 100644 --- a/fs/namespace.c +++ b/fs/namespace.c | |||
@@ -593,7 +593,7 @@ static int do_umount(struct vfsmount *mnt, int flags) | |||
593 | * (2) the usage count == 1 [parent vfsmount] + 1 [sys_umount] | 593 | * (2) the usage count == 1 [parent vfsmount] + 1 [sys_umount] |
594 | */ | 594 | */ |
595 | if (flags & MNT_EXPIRE) { | 595 | if (flags & MNT_EXPIRE) { |
596 | if (mnt == current->fs->rootmnt || | 596 | if (mnt == current->fs->root.mnt || |
597 | flags & (MNT_FORCE | MNT_DETACH)) | 597 | flags & (MNT_FORCE | MNT_DETACH)) |
598 | return -EINVAL; | 598 | return -EINVAL; |
599 | 599 | ||
@@ -628,7 +628,7 @@ static int do_umount(struct vfsmount *mnt, int flags) | |||
628 | * /reboot - static binary that would close all descriptors and | 628 | * /reboot - static binary that would close all descriptors and |
629 | * call reboot(9). Then init(8) could umount root and exec /reboot. | 629 | * call reboot(9). Then init(8) could umount root and exec /reboot. |
630 | */ | 630 | */ |
631 | if (mnt == current->fs->rootmnt && !(flags & MNT_DETACH)) { | 631 | if (mnt == current->fs->root.mnt && !(flags & MNT_DETACH)) { |
632 | /* | 632 | /* |
633 | * Special case for "unmounting" root ... | 633 | * Special case for "unmounting" root ... |
634 | * we just try to remount it readonly. | 634 | * we just try to remount it readonly. |
@@ -1559,17 +1559,17 @@ static struct mnt_namespace *dup_mnt_ns(struct mnt_namespace *mnt_ns, | |||
1559 | while (p) { | 1559 | while (p) { |
1560 | q->mnt_ns = new_ns; | 1560 | q->mnt_ns = new_ns; |
1561 | if (fs) { | 1561 | if (fs) { |
1562 | if (p == fs->rootmnt) { | 1562 | if (p == fs->root.mnt) { |
1563 | rootmnt = p; | 1563 | rootmnt = p; |
1564 | fs->rootmnt = mntget(q); | 1564 | fs->root.mnt = mntget(q); |
1565 | } | 1565 | } |
1566 | if (p == fs->pwdmnt) { | 1566 | if (p == fs->pwd.mnt) { |
1567 | pwdmnt = p; | 1567 | pwdmnt = p; |
1568 | fs->pwdmnt = mntget(q); | 1568 | fs->pwd.mnt = mntget(q); |
1569 | } | 1569 | } |
1570 | if (p == fs->altrootmnt) { | 1570 | if (p == fs->altroot.mnt) { |
1571 | altrootmnt = p; | 1571 | altrootmnt = p; |
1572 | fs->altrootmnt = mntget(q); | 1572 | fs->altroot.mnt = mntget(q); |
1573 | } | 1573 | } |
1574 | } | 1574 | } |
1575 | p = next_mnt(p, mnt_ns->root); | 1575 | p = next_mnt(p, mnt_ns->root); |
@@ -1653,18 +1653,15 @@ out1: | |||
1653 | void set_fs_root(struct fs_struct *fs, struct vfsmount *mnt, | 1653 | void set_fs_root(struct fs_struct *fs, struct vfsmount *mnt, |
1654 | struct dentry *dentry) | 1654 | struct dentry *dentry) |
1655 | { | 1655 | { |
1656 | struct dentry *old_root; | 1656 | struct path old_root; |
1657 | struct vfsmount *old_rootmnt; | 1657 | |
1658 | write_lock(&fs->lock); | 1658 | write_lock(&fs->lock); |
1659 | old_root = fs->root; | 1659 | old_root = fs->root; |
1660 | old_rootmnt = fs->rootmnt; | 1660 | fs->root.mnt = mntget(mnt); |
1661 | fs->rootmnt = mntget(mnt); | 1661 | fs->root.dentry = dget(dentry); |
1662 | fs->root = dget(dentry); | ||
1663 | write_unlock(&fs->lock); | 1662 | write_unlock(&fs->lock); |
1664 | if (old_root) { | 1663 | if (old_root.dentry) |
1665 | dput(old_root); | 1664 | path_put(&old_root); |
1666 | mntput(old_rootmnt); | ||
1667 | } | ||
1668 | } | 1665 | } |
1669 | 1666 | ||
1670 | /* | 1667 | /* |
@@ -1674,20 +1671,16 @@ void set_fs_root(struct fs_struct *fs, struct vfsmount *mnt, | |||
1674 | void set_fs_pwd(struct fs_struct *fs, struct vfsmount *mnt, | 1671 | void set_fs_pwd(struct fs_struct *fs, struct vfsmount *mnt, |
1675 | struct dentry *dentry) | 1672 | struct dentry *dentry) |
1676 | { | 1673 | { |
1677 | struct dentry *old_pwd; | 1674 | struct path old_pwd; |
1678 | struct vfsmount *old_pwdmnt; | ||
1679 | 1675 | ||
1680 | write_lock(&fs->lock); | 1676 | write_lock(&fs->lock); |
1681 | old_pwd = fs->pwd; | 1677 | old_pwd = fs->pwd; |
1682 | old_pwdmnt = fs->pwdmnt; | 1678 | fs->pwd.mnt = mntget(mnt); |
1683 | fs->pwdmnt = mntget(mnt); | 1679 | fs->pwd.dentry = dget(dentry); |
1684 | fs->pwd = dget(dentry); | ||
1685 | write_unlock(&fs->lock); | 1680 | write_unlock(&fs->lock); |
1686 | 1681 | ||
1687 | if (old_pwd) { | 1682 | if (old_pwd.dentry) |
1688 | dput(old_pwd); | 1683 | path_put(&old_pwd); |
1689 | mntput(old_pwdmnt); | ||
1690 | } | ||
1691 | } | 1684 | } |
1692 | 1685 | ||
1693 | static void chroot_fs_refs(struct nameidata *old_nd, struct nameidata *new_nd) | 1686 | static void chroot_fs_refs(struct nameidata *old_nd, struct nameidata *new_nd) |
@@ -1702,12 +1695,12 @@ static void chroot_fs_refs(struct nameidata *old_nd, struct nameidata *new_nd) | |||
1702 | if (fs) { | 1695 | if (fs) { |
1703 | atomic_inc(&fs->count); | 1696 | atomic_inc(&fs->count); |
1704 | task_unlock(p); | 1697 | task_unlock(p); |
1705 | if (fs->root == old_nd->path.dentry | 1698 | if (fs->root.dentry == old_nd->path.dentry |
1706 | && fs->rootmnt == old_nd->path.mnt) | 1699 | && fs->root.mnt == old_nd->path.mnt) |
1707 | set_fs_root(fs, new_nd->path.mnt, | 1700 | set_fs_root(fs, new_nd->path.mnt, |
1708 | new_nd->path.dentry); | 1701 | new_nd->path.dentry); |
1709 | if (fs->pwd == old_nd->path.dentry | 1702 | if (fs->pwd.dentry == old_nd->path.dentry |
1710 | && fs->pwdmnt == old_nd->path.mnt) | 1703 | && fs->pwd.mnt == old_nd->path.mnt) |
1711 | set_fs_pwd(fs, new_nd->path.mnt, | 1704 | set_fs_pwd(fs, new_nd->path.mnt, |
1712 | new_nd->path.dentry); | 1705 | new_nd->path.dentry); |
1713 | put_fs_struct(fs); | 1706 | put_fs_struct(fs); |
@@ -1773,8 +1766,8 @@ asmlinkage long sys_pivot_root(const char __user * new_root, | |||
1773 | } | 1766 | } |
1774 | 1767 | ||
1775 | read_lock(¤t->fs->lock); | 1768 | read_lock(¤t->fs->lock); |
1776 | user_nd.path.mnt = mntget(current->fs->rootmnt); | 1769 | user_nd.path = current->fs->root; |
1777 | user_nd.path.dentry = dget(current->fs->root); | 1770 | path_get(¤t->fs->root); |
1778 | read_unlock(¤t->fs->lock); | 1771 | read_unlock(¤t->fs->lock); |
1779 | down_write(&namespace_sem); | 1772 | down_write(&namespace_sem); |
1780 | mutex_lock(&old_nd.path.dentry->d_inode->i_mutex); | 1773 | mutex_lock(&old_nd.path.dentry->d_inode->i_mutex); |