diff options
author | Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> | 2011-12-20 17:01:18 -0500 |
---|---|---|
committer | Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> | 2011-12-20 17:01:18 -0500 |
commit | cb85f123cd2393581bcffad335bfc6bcdd58569c (patch) | |
tree | 7b0de48b2a13ca96251c02245ab906f7efa3ac18 /fs/namespace.c | |
parent | b79d2ff98caee60c07a7598aba3b26acd1655a99 (diff) | |
parent | caca6a03d365883564885f2c1da3e88dcf65d139 (diff) |
Merge commit 'v3.2-rc3' into stable/for-linus-3.3
* commit 'v3.2-rc3': (412 commits)
Linux 3.2-rc3
virtio-pci: make reset operation safer
virtio-mmio: Correct the name of the guest features selector
virtio: add HAS_IOMEM dependency to MMIO platform bus driver
eCryptfs: Extend array bounds for all filename chars
eCryptfs: Flush file in vma close
eCryptfs: Prevent file create race condition
regulator: TPS65910: Fix VDD1/2 voltage selector count
i2c: Make i2cdev_notifier_call static
i2c: Delete ANY_I2C_BUS
i2c: Fix device name for 10-bit slave address
i2c-algo-bit: Generate correct i2c address sequence for 10-bit target
drm: integer overflow in drm_mode_dirtyfb_ioctl()
Revert "of/irq: of_irq_find_parent: check for parent equal to child"
drivers/gpu/vga/vgaarb.c: add missing kfree
drm/radeon/kms/atom: unify i2c gpio table handling
drm/radeon/kms: fix up gpio i2c mask bits for r4xx for real
ttm: Don't return the bo reserved on error path
mount_subtree() pointless use-after-free
iio: fix a leak due to improper use of anon_inode_getfd()
...
Diffstat (limited to 'fs/namespace.c')
-rw-r--r-- | fs/namespace.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/fs/namespace.c b/fs/namespace.c index e5e1c7d1839b..6d3a1963879b 100644 --- a/fs/namespace.c +++ b/fs/namespace.c | |||
@@ -2483,11 +2483,43 @@ struct mnt_namespace *create_mnt_ns(struct vfsmount *mnt) | |||
2483 | __mnt_make_longterm(mnt); | 2483 | __mnt_make_longterm(mnt); |
2484 | new_ns->root = mnt; | 2484 | new_ns->root = mnt; |
2485 | list_add(&new_ns->list, &new_ns->root->mnt_list); | 2485 | list_add(&new_ns->list, &new_ns->root->mnt_list); |
2486 | } else { | ||
2487 | mntput(mnt); | ||
2486 | } | 2488 | } |
2487 | return new_ns; | 2489 | return new_ns; |
2488 | } | 2490 | } |
2489 | EXPORT_SYMBOL(create_mnt_ns); | 2491 | EXPORT_SYMBOL(create_mnt_ns); |
2490 | 2492 | ||
2493 | struct dentry *mount_subtree(struct vfsmount *mnt, const char *name) | ||
2494 | { | ||
2495 | struct mnt_namespace *ns; | ||
2496 | struct super_block *s; | ||
2497 | struct path path; | ||
2498 | int err; | ||
2499 | |||
2500 | ns = create_mnt_ns(mnt); | ||
2501 | if (IS_ERR(ns)) | ||
2502 | return ERR_CAST(ns); | ||
2503 | |||
2504 | err = vfs_path_lookup(mnt->mnt_root, mnt, | ||
2505 | name, LOOKUP_FOLLOW|LOOKUP_AUTOMOUNT, &path); | ||
2506 | |||
2507 | put_mnt_ns(ns); | ||
2508 | |||
2509 | if (err) | ||
2510 | return ERR_PTR(err); | ||
2511 | |||
2512 | /* trade a vfsmount reference for active sb one */ | ||
2513 | s = path.mnt->mnt_sb; | ||
2514 | atomic_inc(&s->s_active); | ||
2515 | mntput(path.mnt); | ||
2516 | /* lock the sucker */ | ||
2517 | down_write(&s->s_umount); | ||
2518 | /* ... and return the root of (sub)tree on it */ | ||
2519 | return path.dentry; | ||
2520 | } | ||
2521 | EXPORT_SYMBOL(mount_subtree); | ||
2522 | |||
2491 | SYSCALL_DEFINE5(mount, char __user *, dev_name, char __user *, dir_name, | 2523 | SYSCALL_DEFINE5(mount, char __user *, dev_name, char __user *, dir_name, |
2492 | char __user *, type, unsigned long, flags, void __user *, data) | 2524 | char __user *, type, unsigned long, flags, void __user *, data) |
2493 | { | 2525 | { |