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 /fs/autofs4 | |
| parent | 589ff870ed60a9ebdd5ec99ec3f5afe1282fe151 (diff) | |
switch follow_down()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/autofs4')
| -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 |
4 files changed, 14 insertions, 16 deletions
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 | } |
