diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2009-04-18 13:58:15 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2009-06-11 21:36:01 -0400 |
commit | 9393bd07cf218ca51d0e627653f906a9d76a9131 (patch) | |
tree | 402205fe6336028df48cd65b31da0482f0b0bb41 | |
parent | 589ff870ed60a9ebdd5ec99ec3f5afe1282fe151 (diff) |
switch follow_down()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r-- | fs/afs/mntpt.c | 2 | ||||
-rw-r--r-- | fs/autofs/dirhash.c | 5 | ||||
-rw-r--r-- | fs/autofs4/autofs_i.h | 6 | ||||
-rw-r--r-- | fs/autofs4/dev-ioctl.c | 2 | ||||
-rw-r--r-- | fs/autofs4/expire.c | 15 | ||||
-rw-r--r-- | fs/autofs4/root.c | 7 | ||||
-rw-r--r-- | fs/cifs/cifs_dfs_ref.c | 2 | ||||
-rw-r--r-- | fs/namei.c | 12 | ||||
-rw-r--r-- | fs/namespace.c | 4 | ||||
-rw-r--r-- | fs/nfs/namespace.c | 2 | ||||
-rw-r--r-- | fs/nfsd/vfs.c | 3 | ||||
-rw-r--r-- | include/linux/namei.h | 2 |
12 files changed, 29 insertions, 33 deletions
diff --git a/fs/afs/mntpt.c b/fs/afs/mntpt.c index 2b9e2d03a390..c52be53f6946 100644 --- a/fs/afs/mntpt.c +++ b/fs/afs/mntpt.c | |||
@@ -244,7 +244,7 @@ static void *afs_mntpt_follow_link(struct dentry *dentry, struct nameidata *nd) | |||
244 | case -EBUSY: | 244 | case -EBUSY: |
245 | /* someone else made a mount here whilst we were busy */ | 245 | /* someone else made a mount here whilst we were busy */ |
246 | while (d_mountpoint(nd->path.dentry) && | 246 | while (d_mountpoint(nd->path.dentry) && |
247 | follow_down(&nd->path.mnt, &nd->path.dentry)) | 247 | follow_down(&nd->path)) |
248 | ; | 248 | ; |
249 | err = 0; | 249 | err = 0; |
250 | default: | 250 | default: |
diff --git a/fs/autofs/dirhash.c b/fs/autofs/dirhash.c index 4eb4d8dfb2f1..2316e944a109 100644 --- a/fs/autofs/dirhash.c +++ b/fs/autofs/dirhash.c | |||
@@ -85,13 +85,12 @@ struct autofs_dir_ent *autofs_expire(struct super_block *sb, | |||
85 | } | 85 | } |
86 | path.mnt = mnt; | 86 | path.mnt = mnt; |
87 | path_get(&path); | 87 | path_get(&path); |
88 | if (!follow_down(&path.mnt, &path.dentry)) { | 88 | if (!follow_down(&path)) { |
89 | path_put(&path); | 89 | path_put(&path); |
90 | DPRINTK(("autofs: not expirable (not a mounted directory): %s\n", ent->name)); | 90 | DPRINTK(("autofs: not expirable (not a mounted directory): %s\n", ent->name)); |
91 | continue; | 91 | continue; |
92 | } | 92 | } |
93 | while (d_mountpoint(path.dentry) && | 93 | while (d_mountpoint(path.dentry) && follow_down(&path)); |
94 | follow_down(&path.mnt, &path.dentry)) | ||
95 | ; | 94 | ; |
96 | umount_ok = may_umount(path.mnt); | 95 | umount_ok = may_umount(path.mnt); |
97 | path_put(&path); | 96 | path_put(&path); |
diff --git a/fs/autofs4/autofs_i.h b/fs/autofs4/autofs_i.h index b7ff33c63101..8f7cdde41733 100644 --- a/fs/autofs4/autofs_i.h +++ b/fs/autofs4/autofs_i.h | |||
@@ -223,12 +223,12 @@ int autofs4_wait(struct autofs_sb_info *,struct dentry *, enum autofs_notify); | |||
223 | int autofs4_wait_release(struct autofs_sb_info *,autofs_wqt_t,int); | 223 | int autofs4_wait_release(struct autofs_sb_info *,autofs_wqt_t,int); |
224 | void autofs4_catatonic_mode(struct autofs_sb_info *); | 224 | void autofs4_catatonic_mode(struct autofs_sb_info *); |
225 | 225 | ||
226 | static inline int autofs4_follow_mount(struct vfsmount **mnt, struct dentry **dentry) | 226 | static inline int autofs4_follow_mount(struct path *path) |
227 | { | 227 | { |
228 | int res = 0; | 228 | int res = 0; |
229 | 229 | ||
230 | while (d_mountpoint(*dentry)) { | 230 | while (d_mountpoint(path->dentry)) { |
231 | int followed = follow_down(mnt, dentry); | 231 | int followed = follow_down(path); |
232 | if (!followed) | 232 | if (!followed) |
233 | break; | 233 | break; |
234 | res = 1; | 234 | res = 1; |
diff --git a/fs/autofs4/dev-ioctl.c b/fs/autofs4/dev-ioctl.c index 670407576b25..f3da2eb51f56 100644 --- a/fs/autofs4/dev-ioctl.c +++ b/fs/autofs4/dev-ioctl.c | |||
@@ -562,7 +562,7 @@ static int autofs_dev_ioctl_ismountpoint(struct file *fp, | |||
562 | err = have_submounts(path.dentry); | 562 | err = have_submounts(path.dentry); |
563 | 563 | ||
564 | if (path.mnt->mnt_mountpoint != path.mnt->mnt_root) { | 564 | if (path.mnt->mnt_mountpoint != path.mnt->mnt_root) { |
565 | if (follow_down(&path.mnt, &path.dentry)) | 565 | if (follow_down(&path)) |
566 | magic = path.mnt->mnt_sb->s_magic; | 566 | magic = path.mnt->mnt_sb->s_magic; |
567 | } | 567 | } |
568 | } | 568 | } |
diff --git a/fs/autofs4/expire.c b/fs/autofs4/expire.c index 3077d8f16523..aa39ae83f019 100644 --- a/fs/autofs4/expire.c +++ b/fs/autofs4/expire.c | |||
@@ -48,19 +48,19 @@ static inline int autofs4_can_expire(struct dentry *dentry, | |||
48 | static int autofs4_mount_busy(struct vfsmount *mnt, struct dentry *dentry) | 48 | static int autofs4_mount_busy(struct vfsmount *mnt, struct dentry *dentry) |
49 | { | 49 | { |
50 | struct dentry *top = dentry; | 50 | struct dentry *top = dentry; |
51 | struct path path = {.mnt = mnt, .dentry = dentry}; | ||
51 | int status = 1; | 52 | int status = 1; |
52 | 53 | ||
53 | DPRINTK("dentry %p %.*s", | 54 | DPRINTK("dentry %p %.*s", |
54 | dentry, (int)dentry->d_name.len, dentry->d_name.name); | 55 | dentry, (int)dentry->d_name.len, dentry->d_name.name); |
55 | 56 | ||
56 | mntget(mnt); | 57 | path_get(&path); |
57 | dget(dentry); | ||
58 | 58 | ||
59 | if (!follow_down(&mnt, &dentry)) | 59 | if (!follow_down(&path)) |
60 | goto done; | 60 | goto done; |
61 | 61 | ||
62 | if (is_autofs4_dentry(dentry)) { | 62 | if (is_autofs4_dentry(path.dentry)) { |
63 | struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb); | 63 | struct autofs_sb_info *sbi = autofs4_sbi(path.dentry->d_sb); |
64 | 64 | ||
65 | /* This is an autofs submount, we can't expire it */ | 65 | /* This is an autofs submount, we can't expire it */ |
66 | if (autofs_type_indirect(sbi->type)) | 66 | if (autofs_type_indirect(sbi->type)) |
@@ -70,7 +70,7 @@ static int autofs4_mount_busy(struct vfsmount *mnt, struct dentry *dentry) | |||
70 | * Otherwise it's an offset mount and we need to check | 70 | * Otherwise it's an offset mount and we need to check |
71 | * if we can umount its mount, if there is one. | 71 | * if we can umount its mount, if there is one. |
72 | */ | 72 | */ |
73 | if (!d_mountpoint(dentry)) { | 73 | if (!d_mountpoint(path.dentry)) { |
74 | status = 0; | 74 | status = 0; |
75 | goto done; | 75 | goto done; |
76 | } | 76 | } |
@@ -86,8 +86,7 @@ static int autofs4_mount_busy(struct vfsmount *mnt, struct dentry *dentry) | |||
86 | status = 0; | 86 | status = 0; |
87 | done: | 87 | done: |
88 | DPRINTK("returning = %d", status); | 88 | DPRINTK("returning = %d", status); |
89 | dput(dentry); | 89 | path_put(&path); |
90 | mntput(mnt); | ||
91 | return status; | 90 | return status; |
92 | } | 91 | } |
93 | 92 | ||
diff --git a/fs/autofs4/root.c b/fs/autofs4/root.c index e383bf0334f1..b96a3c57359d 100644 --- a/fs/autofs4/root.c +++ b/fs/autofs4/root.c | |||
@@ -181,7 +181,7 @@ static void *autofs4_follow_link(struct dentry *dentry, struct nameidata *nd) | |||
181 | nd->flags); | 181 | nd->flags); |
182 | /* | 182 | /* |
183 | * For an expire of a covered direct or offset mount we need | 183 | * For an expire of a covered direct or offset mount we need |
184 | * to beeak out of follow_down() at the autofs mount trigger | 184 | * to break out of follow_down() at the autofs mount trigger |
185 | * (d_mounted--), so we can see the expiring flag, and manage | 185 | * (d_mounted--), so we can see the expiring flag, and manage |
186 | * the blocking and following here until the expire is completed. | 186 | * the blocking and following here until the expire is completed. |
187 | */ | 187 | */ |
@@ -190,7 +190,7 @@ static void *autofs4_follow_link(struct dentry *dentry, struct nameidata *nd) | |||
190 | if (ino->flags & AUTOFS_INF_EXPIRING) { | 190 | if (ino->flags & AUTOFS_INF_EXPIRING) { |
191 | spin_unlock(&sbi->fs_lock); | 191 | spin_unlock(&sbi->fs_lock); |
192 | /* Follow down to our covering mount. */ | 192 | /* Follow down to our covering mount. */ |
193 | if (!follow_down(&nd->path.mnt, &nd->path.dentry)) | 193 | if (!follow_down(&nd->path)) |
194 | goto done; | 194 | goto done; |
195 | goto follow; | 195 | goto follow; |
196 | } | 196 | } |
@@ -230,8 +230,7 @@ follow: | |||
230 | * to follow it. | 230 | * to follow it. |
231 | */ | 231 | */ |
232 | if (d_mountpoint(dentry)) { | 232 | if (d_mountpoint(dentry)) { |
233 | if (!autofs4_follow_mount(&nd->path.mnt, | 233 | if (!autofs4_follow_mount(&nd->path)) { |
234 | &nd->path.dentry)) { | ||
235 | status = -ENOENT; | 234 | status = -ENOENT; |
236 | goto out_error; | 235 | goto out_error; |
237 | } | 236 | } |
diff --git a/fs/cifs/cifs_dfs_ref.c b/fs/cifs/cifs_dfs_ref.c index 83d62759c7c7..3bb11be8b6a8 100644 --- a/fs/cifs/cifs_dfs_ref.c +++ b/fs/cifs/cifs_dfs_ref.c | |||
@@ -275,7 +275,7 @@ static int add_mount_helper(struct vfsmount *newmnt, struct nameidata *nd, | |||
275 | case -EBUSY: | 275 | case -EBUSY: |
276 | /* someone else made a mount here whilst we were busy */ | 276 | /* someone else made a mount here whilst we were busy */ |
277 | while (d_mountpoint(nd->path.dentry) && | 277 | while (d_mountpoint(nd->path.dentry) && |
278 | follow_down(&nd->path.mnt, &nd->path.dentry)) | 278 | follow_down(&nd->path)) |
279 | ; | 279 | ; |
280 | err = 0; | 280 | err = 0; |
281 | default: | 281 | default: |
diff --git a/fs/namei.c b/fs/namei.c index 8c1f48ae68e7..4d49a3eee6d4 100644 --- a/fs/namei.c +++ b/fs/namei.c | |||
@@ -731,16 +731,16 @@ static void follow_mount(struct vfsmount **mnt, struct dentry **dentry) | |||
731 | /* no need for dcache_lock, as serialization is taken care in | 731 | /* no need for dcache_lock, as serialization is taken care in |
732 | * namespace.c | 732 | * namespace.c |
733 | */ | 733 | */ |
734 | int follow_down(struct vfsmount **mnt, struct dentry **dentry) | 734 | int follow_down(struct path *path) |
735 | { | 735 | { |
736 | struct vfsmount *mounted; | 736 | struct vfsmount *mounted; |
737 | 737 | ||
738 | mounted = lookup_mnt(*mnt, *dentry); | 738 | mounted = lookup_mnt(path->mnt, path->dentry); |
739 | if (mounted) { | 739 | if (mounted) { |
740 | dput(*dentry); | 740 | dput(path->dentry); |
741 | mntput(*mnt); | 741 | mntput(path->mnt); |
742 | *mnt = mounted; | 742 | path->mnt = mounted; |
743 | *dentry = dget(mounted->mnt_root); | 743 | path->dentry = dget(mounted->mnt_root); |
744 | return 1; | 744 | return 1; |
745 | } | 745 | } |
746 | return 0; | 746 | return 0; |
diff --git a/fs/namespace.c b/fs/namespace.c index c85962206aad..ba5237be1cf9 100644 --- a/fs/namespace.c +++ b/fs/namespace.c | |||
@@ -1601,7 +1601,7 @@ static int do_move_mount(struct path *path, char *old_name) | |||
1601 | 1601 | ||
1602 | down_write(&namespace_sem); | 1602 | down_write(&namespace_sem); |
1603 | while (d_mountpoint(path->dentry) && | 1603 | while (d_mountpoint(path->dentry) && |
1604 | follow_down(&path->mnt, &path->dentry)) | 1604 | follow_down(path)) |
1605 | ; | 1605 | ; |
1606 | err = -EINVAL; | 1606 | err = -EINVAL; |
1607 | if (!check_mnt(path->mnt) || !check_mnt(old_path.mnt)) | 1607 | if (!check_mnt(path->mnt) || !check_mnt(old_path.mnt)) |
@@ -1695,7 +1695,7 @@ int do_add_mount(struct vfsmount *newmnt, struct path *path, | |||
1695 | down_write(&namespace_sem); | 1695 | down_write(&namespace_sem); |
1696 | /* Something was mounted here while we slept */ | 1696 | /* Something was mounted here while we slept */ |
1697 | while (d_mountpoint(path->dentry) && | 1697 | while (d_mountpoint(path->dentry) && |
1698 | follow_down(&path->mnt, &path->dentry)) | 1698 | follow_down(path)) |
1699 | ; | 1699 | ; |
1700 | err = -EINVAL; | 1700 | err = -EINVAL; |
1701 | if (!(mnt_flags & MNT_SHRINKABLE) && !check_mnt(path->mnt)) | 1701 | if (!(mnt_flags & MNT_SHRINKABLE) && !check_mnt(path->mnt)) |
diff --git a/fs/nfs/namespace.c b/fs/nfs/namespace.c index 64a288ee046d..f01caec84463 100644 --- a/fs/nfs/namespace.c +++ b/fs/nfs/namespace.c | |||
@@ -154,7 +154,7 @@ out_err: | |||
154 | goto out; | 154 | goto out; |
155 | out_follow: | 155 | out_follow: |
156 | while (d_mountpoint(nd->path.dentry) && | 156 | while (d_mountpoint(nd->path.dentry) && |
157 | follow_down(&nd->path.mnt, &nd->path.dentry)) | 157 | follow_down(&nd->path)) |
158 | ; | 158 | ; |
159 | err = 0; | 159 | err = 0; |
160 | goto out; | 160 | goto out; |
diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index 7b2b3f775326..99f835753596 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c | |||
@@ -105,8 +105,7 @@ nfsd_cross_mnt(struct svc_rqst *rqstp, struct dentry **dpp, | |||
105 | .dentry = dget(dentry)}; | 105 | .dentry = dget(dentry)}; |
106 | int err = 0; | 106 | int err = 0; |
107 | 107 | ||
108 | while (follow_down(&path.mnt, &path.dentry) && | 108 | while (d_mountpoint(path.dentry) && follow_down(&path)) |
109 | d_mountpoint(path.dentry)) | ||
110 | ; | 109 | ; |
111 | 110 | ||
112 | exp2 = rqst_exp_get_by_name(rqstp, &path); | 111 | exp2 = rqst_exp_get_by_name(rqstp, &path); |
diff --git a/include/linux/namei.h b/include/linux/namei.h index 9cd5a717be3b..d870ae2faedc 100644 --- a/include/linux/namei.h +++ b/include/linux/namei.h | |||
@@ -78,7 +78,7 @@ extern void release_open_intent(struct nameidata *); | |||
78 | extern struct dentry *lookup_one_len(const char *, struct dentry *, int); | 78 | extern struct dentry *lookup_one_len(const char *, struct dentry *, int); |
79 | extern struct dentry *lookup_one_noperm(const char *, struct dentry *); | 79 | extern struct dentry *lookup_one_noperm(const char *, struct dentry *); |
80 | 80 | ||
81 | extern int follow_down(struct vfsmount **, struct dentry **); | 81 | extern int follow_down(struct path *); |
82 | extern int follow_up(struct path *); | 82 | extern int follow_up(struct path *); |
83 | 83 | ||
84 | extern struct dentry *lock_rename(struct dentry *, struct dentry *); | 84 | extern struct dentry *lock_rename(struct dentry *, struct dentry *); |