aboutsummaryrefslogtreecommitdiffstats
path: root/fs/namespace.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/namespace.c')
-rw-r--r--fs/namespace.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/fs/namespace.c b/fs/namespace.c
index 9f544f35ed34..bec51e4e0549 100644
--- a/fs/namespace.c
+++ b/fs/namespace.c
@@ -1895,6 +1895,39 @@ static int do_new_mount(struct path *path, char *type, int flags,
1895 return do_add_mount(mnt, path, mnt_flags); 1895 return do_add_mount(mnt, path, mnt_flags);
1896} 1896}
1897 1897
1898int finish_automount(struct vfsmount *m, struct path *path)
1899{
1900 int err;
1901 /* The new mount record should have at least 2 refs to prevent it being
1902 * expired before we get a chance to add it
1903 */
1904 BUG_ON(mnt_get_count(m) < 2);
1905
1906 if (m->mnt_sb == path->mnt->mnt_sb &&
1907 m->mnt_root == path->dentry) {
1908 mnt_clear_expiry(m);
1909 mntput(m);
1910 mntput(m);
1911 return -ELOOP;
1912 }
1913
1914 /* We need to add the mountpoint to the parent. The filesystem may
1915 * have placed it on an expiry list, and so we need to make sure it
1916 * won't be expired under us if do_add_mount() fails (do_add_mount()
1917 * will eat a reference unconditionally).
1918 */
1919 mntget(m);
1920 err = do_add_mount(m, path, path->mnt->mnt_flags | MNT_SHRINKABLE);
1921 if (err) {
1922 mnt_clear_expiry(m);
1923 mntput(m);
1924 mntput(m);
1925 } else {
1926 mntput(m);
1927 }
1928 return err;
1929}
1930
1898/* 1931/*
1899 * add a mount into a namespace's mount tree 1932 * add a mount into a namespace's mount tree
1900 * - this unconditionally eats one of the caller's references to newmnt. 1933 * - this unconditionally eats one of the caller's references to newmnt.