diff options
Diffstat (limited to 'fs/namespace.c')
-rw-r--r-- | fs/namespace.c | 33 |
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 | ||
1898 | int 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. |