diff options
Diffstat (limited to 'fs/afs/mntpt.c')
-rw-r--r-- | fs/afs/mntpt.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/fs/afs/mntpt.c b/fs/afs/mntpt.c index 08c11a0b66bd..b905ae37f912 100644 --- a/fs/afs/mntpt.c +++ b/fs/afs/mntpt.c | |||
@@ -48,8 +48,11 @@ unsigned long afs_mntpt_expiry_timeout = 10 * 60; | |||
48 | * check a symbolic link to see whether it actually encodes a mountpoint | 48 | * check a symbolic link to see whether it actually encodes a mountpoint |
49 | * - sets the AFS_VNODE_MOUNTPOINT flag on the vnode appropriately | 49 | * - sets the AFS_VNODE_MOUNTPOINT flag on the vnode appropriately |
50 | */ | 50 | */ |
51 | int afs_mntpt_check_symlink(struct afs_vnode *vnode) | 51 | int afs_mntpt_check_symlink(struct afs_vnode *vnode, struct key *key) |
52 | { | 52 | { |
53 | struct file file = { | ||
54 | .private_data = key, | ||
55 | }; | ||
53 | struct page *page; | 56 | struct page *page; |
54 | size_t size; | 57 | size_t size; |
55 | char *buf; | 58 | char *buf; |
@@ -58,7 +61,7 @@ int afs_mntpt_check_symlink(struct afs_vnode *vnode) | |||
58 | _enter("{%u,%u}", vnode->fid.vnode, vnode->fid.unique); | 61 | _enter("{%u,%u}", vnode->fid.vnode, vnode->fid.unique); |
59 | 62 | ||
60 | /* read the contents of the symlink into the pagecache */ | 63 | /* read the contents of the symlink into the pagecache */ |
61 | page = read_mapping_page(AFS_VNODE_TO_I(vnode)->i_mapping, 0, NULL); | 64 | page = read_mapping_page(AFS_VNODE_TO_I(vnode)->i_mapping, 0, &file); |
62 | if (IS_ERR(page)) { | 65 | if (IS_ERR(page)) { |
63 | ret = PTR_ERR(page); | 66 | ret = PTR_ERR(page); |
64 | goto out; | 67 | goto out; |
@@ -214,7 +217,7 @@ static void *afs_mntpt_follow_link(struct dentry *dentry, struct nameidata *nd) | |||
214 | struct vfsmount *newmnt; | 217 | struct vfsmount *newmnt; |
215 | int err; | 218 | int err; |
216 | 219 | ||
217 | _enter("%p{%s},{%s:%p{%s}}", | 220 | _enter("%p{%s},{%s:%p{%s},}", |
218 | dentry, | 221 | dentry, |
219 | dentry->d_name.name, | 222 | dentry->d_name.name, |
220 | nd->mnt->mnt_devname, | 223 | nd->mnt->mnt_devname, |
@@ -234,7 +237,8 @@ static void *afs_mntpt_follow_link(struct dentry *dentry, struct nameidata *nd) | |||
234 | err = do_add_mount(newmnt, nd, MNT_SHRINKABLE, &afs_vfsmounts); | 237 | err = do_add_mount(newmnt, nd, MNT_SHRINKABLE, &afs_vfsmounts); |
235 | switch (err) { | 238 | switch (err) { |
236 | case 0: | 239 | case 0: |
237 | path_release(nd); | 240 | mntput(nd->mnt); |
241 | dput(nd->dentry); | ||
238 | nd->mnt = newmnt; | 242 | nd->mnt = newmnt; |
239 | nd->dentry = dget(newmnt->mnt_root); | 243 | nd->dentry = dget(newmnt->mnt_root); |
240 | schedule_delayed_work(&afs_mntpt_expiry_timer, | 244 | schedule_delayed_work(&afs_mntpt_expiry_timer, |