diff options
Diffstat (limited to 'fs/namespace.c')
-rw-r--r-- | fs/namespace.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/fs/namespace.c b/fs/namespace.c index 79bd8a46e1e7..2fa9fdf7d6f5 100644 --- a/fs/namespace.c +++ b/fs/namespace.c | |||
@@ -40,7 +40,7 @@ static inline int sysfs_init(void) | |||
40 | __cacheline_aligned_in_smp DEFINE_SPINLOCK(vfsmount_lock); | 40 | __cacheline_aligned_in_smp DEFINE_SPINLOCK(vfsmount_lock); |
41 | 41 | ||
42 | static struct list_head *mount_hashtable; | 42 | static struct list_head *mount_hashtable; |
43 | static int hash_mask, hash_bits; | 43 | static int hash_mask __read_mostly, hash_bits __read_mostly; |
44 | static kmem_cache_t *mnt_cache; | 44 | static kmem_cache_t *mnt_cache; |
45 | 45 | ||
46 | static inline unsigned long hash(struct vfsmount *mnt, struct dentry *dentry) | 46 | static inline unsigned long hash(struct vfsmount *mnt, struct dentry *dentry) |
@@ -537,7 +537,6 @@ lives_below_in_same_fs(struct dentry *d, struct dentry *dentry) | |||
537 | static struct vfsmount *copy_tree(struct vfsmount *mnt, struct dentry *dentry) | 537 | static struct vfsmount *copy_tree(struct vfsmount *mnt, struct dentry *dentry) |
538 | { | 538 | { |
539 | struct vfsmount *res, *p, *q, *r, *s; | 539 | struct vfsmount *res, *p, *q, *r, *s; |
540 | struct list_head *h; | ||
541 | struct nameidata nd; | 540 | struct nameidata nd; |
542 | 541 | ||
543 | res = q = clone_mnt(mnt, dentry); | 542 | res = q = clone_mnt(mnt, dentry); |
@@ -546,8 +545,7 @@ static struct vfsmount *copy_tree(struct vfsmount *mnt, struct dentry *dentry) | |||
546 | q->mnt_mountpoint = mnt->mnt_mountpoint; | 545 | q->mnt_mountpoint = mnt->mnt_mountpoint; |
547 | 546 | ||
548 | p = mnt; | 547 | p = mnt; |
549 | for (h = mnt->mnt_mounts.next; h != &mnt->mnt_mounts; h = h->next) { | 548 | list_for_each_entry(r, &mnt->mnt_mounts, mnt_child) { |
550 | r = list_entry(h, struct vfsmount, mnt_child); | ||
551 | if (!lives_below_in_same_fs(r->mnt_mountpoint, dentry)) | 549 | if (!lives_below_in_same_fs(r->mnt_mountpoint, dentry)) |
552 | continue; | 550 | continue; |
553 | 551 | ||
@@ -1334,8 +1332,12 @@ asmlinkage long sys_pivot_root(const char __user *new_root, const char __user *p | |||
1334 | error = -EINVAL; | 1332 | error = -EINVAL; |
1335 | if (user_nd.mnt->mnt_root != user_nd.dentry) | 1333 | if (user_nd.mnt->mnt_root != user_nd.dentry) |
1336 | goto out2; /* not a mountpoint */ | 1334 | goto out2; /* not a mountpoint */ |
1335 | if (user_nd.mnt->mnt_parent == user_nd.mnt) | ||
1336 | goto out2; /* not attached */ | ||
1337 | if (new_nd.mnt->mnt_root != new_nd.dentry) | 1337 | if (new_nd.mnt->mnt_root != new_nd.dentry) |
1338 | goto out2; /* not a mountpoint */ | 1338 | goto out2; /* not a mountpoint */ |
1339 | if (new_nd.mnt->mnt_parent == new_nd.mnt) | ||
1340 | goto out2; /* not attached */ | ||
1339 | tmp = old_nd.mnt; /* make sure we can reach put_old from new_root */ | 1341 | tmp = old_nd.mnt; /* make sure we can reach put_old from new_root */ |
1340 | spin_lock(&vfsmount_lock); | 1342 | spin_lock(&vfsmount_lock); |
1341 | if (tmp != new_nd.mnt) { | 1343 | if (tmp != new_nd.mnt) { |