diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2011-01-17 01:35:23 -0500 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2011-01-17 01:35:23 -0500 |
commit | 19a167af7c97248ec646552ebc9140bc6aa3552a (patch) | |
tree | a521153c80fa6e40b2b4983c5bba21c2e96d1864 /fs/namei.c | |
parent | e78bf5e6cbe837daa6ab628a5f679548742994d3 (diff) |
Take the completion of automount into new helper
... and shift it from namei.c to namespace.c
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/namei.c')
-rw-r--r-- | fs/namei.c | 31 |
1 files changed, 5 insertions, 26 deletions
diff --git a/fs/namei.c b/fs/namei.c index 8f7b41a14882..b753192d8c3f 100644 --- a/fs/namei.c +++ b/fs/namei.c | |||
@@ -923,37 +923,13 @@ static int follow_automount(struct path *path, unsigned flags, | |||
923 | if (!mnt) /* mount collision */ | 923 | if (!mnt) /* mount collision */ |
924 | return 0; | 924 | return 0; |
925 | 925 | ||
926 | /* The new mount record should have at least 2 refs to prevent it being | 926 | err = finish_automount(mnt, path); |
927 | * expired before we get a chance to add it | ||
928 | */ | ||
929 | BUG_ON(mnt_get_count(mnt) < 2); | ||
930 | |||
931 | if (mnt->mnt_sb == path->mnt->mnt_sb && | ||
932 | mnt->mnt_root == path->dentry) { | ||
933 | mnt_clear_expiry(mnt); | ||
934 | mntput(mnt); | ||
935 | mntput(mnt); | ||
936 | return -ELOOP; | ||
937 | } | ||
938 | 927 | ||
939 | /* We need to add the mountpoint to the parent. The filesystem may | ||
940 | * have placed it on an expiry list, and so we need to make sure it | ||
941 | * won't be expired under us if do_add_mount() fails (do_add_mount() | ||
942 | * will eat a reference unconditionally). | ||
943 | */ | ||
944 | mntget(mnt); | ||
945 | err = do_add_mount(mnt, path, path->mnt->mnt_flags | MNT_SHRINKABLE); | ||
946 | switch (err) { | 928 | switch (err) { |
947 | case -EBUSY: | 929 | case -EBUSY: |
948 | /* Someone else made a mount here whilst we were busy */ | 930 | /* Someone else made a mount here whilst we were busy */ |
949 | err = 0; | 931 | return 0; |
950 | default: | ||
951 | mnt_clear_expiry(mnt); | ||
952 | mntput(mnt); | ||
953 | mntput(mnt); | ||
954 | return err; | ||
955 | case 0: | 932 | case 0: |
956 | mntput(mnt); | ||
957 | dput(path->dentry); | 933 | dput(path->dentry); |
958 | if (*need_mntput) | 934 | if (*need_mntput) |
959 | mntput(path->mnt); | 935 | mntput(path->mnt); |
@@ -961,7 +937,10 @@ static int follow_automount(struct path *path, unsigned flags, | |||
961 | path->dentry = dget(mnt->mnt_root); | 937 | path->dentry = dget(mnt->mnt_root); |
962 | *need_mntput = true; | 938 | *need_mntput = true; |
963 | return 0; | 939 | return 0; |
940 | default: | ||
941 | return err; | ||
964 | } | 942 | } |
943 | |||
965 | } | 944 | } |
966 | 945 | ||
967 | /* | 946 | /* |