diff options
Diffstat (limited to 'fs/autofs4/root.c')
| -rw-r--r-- | fs/autofs4/root.c | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/fs/autofs4/root.c b/fs/autofs4/root.c index 2a771ec66956..62d8d4acb8bb 100644 --- a/fs/autofs4/root.c +++ b/fs/autofs4/root.c | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | * | 12 | * |
| 13 | * ------------------------------------------------------------------------- */ | 13 | * ------------------------------------------------------------------------- */ |
| 14 | 14 | ||
| 15 | #include <linux/capability.h> | ||
| 15 | #include <linux/errno.h> | 16 | #include <linux/errno.h> |
| 16 | #include <linux/stat.h> | 17 | #include <linux/stat.h> |
| 17 | #include <linux/param.h> | 18 | #include <linux/param.h> |
| @@ -86,7 +87,7 @@ static int autofs4_root_readdir(struct file *file, void *dirent, | |||
| 86 | 87 | ||
| 87 | /* Update usage from here to top of tree, so that scan of | 88 | /* Update usage from here to top of tree, so that scan of |
| 88 | top-level directories will give a useful result */ | 89 | top-level directories will give a useful result */ |
| 89 | static void autofs4_update_usage(struct dentry *dentry) | 90 | static void autofs4_update_usage(struct vfsmount *mnt, struct dentry *dentry) |
| 90 | { | 91 | { |
| 91 | struct dentry *top = dentry->d_sb->s_root; | 92 | struct dentry *top = dentry->d_sb->s_root; |
| 92 | 93 | ||
| @@ -95,7 +96,7 @@ static void autofs4_update_usage(struct dentry *dentry) | |||
| 95 | struct autofs_info *ino = autofs4_dentry_ino(dentry); | 96 | struct autofs_info *ino = autofs4_dentry_ino(dentry); |
| 96 | 97 | ||
| 97 | if (ino) { | 98 | if (ino) { |
| 98 | update_atime(dentry->d_inode); | 99 | touch_atime(mnt, dentry); |
| 99 | ino->last_used = jiffies; | 100 | ino->last_used = jiffies; |
| 100 | } | 101 | } |
| 101 | } | 102 | } |
| @@ -143,7 +144,8 @@ static int autofs4_dcache_readdir(struct file * filp, void * dirent, filldir_t f | |||
| 143 | } | 144 | } |
| 144 | 145 | ||
| 145 | while(1) { | 146 | while(1) { |
| 146 | struct dentry *de = list_entry(list, struct dentry, d_child); | 147 | struct dentry *de = list_entry(list, |
| 148 | struct dentry, d_u.d_child); | ||
| 147 | 149 | ||
| 148 | if (!d_unhashed(de) && de->d_inode) { | 150 | if (!d_unhashed(de) && de->d_inode) { |
| 149 | spin_unlock(&dcache_lock); | 151 | spin_unlock(&dcache_lock); |
| @@ -193,6 +195,8 @@ static int autofs4_dir_open(struct inode *inode, struct file *file) | |||
| 193 | if (!empty) | 195 | if (!empty) |
| 194 | d_invalidate(dentry); | 196 | d_invalidate(dentry); |
| 195 | 197 | ||
| 198 | nd.dentry = dentry; | ||
| 199 | nd.mnt = mnt; | ||
| 196 | nd.flags = LOOKUP_DIRECTORY; | 200 | nd.flags = LOOKUP_DIRECTORY; |
| 197 | status = (dentry->d_op->d_revalidate)(dentry, &nd); | 201 | status = (dentry->d_op->d_revalidate)(dentry, &nd); |
| 198 | 202 | ||
| @@ -288,10 +292,10 @@ out: | |||
| 288 | return autofs4_dcache_readdir(file, dirent, filldir); | 292 | return autofs4_dcache_readdir(file, dirent, filldir); |
| 289 | } | 293 | } |
| 290 | 294 | ||
| 291 | static int try_to_fill_dentry(struct dentry *dentry, | 295 | static int try_to_fill_dentry(struct vfsmount *mnt, struct dentry *dentry, int flags) |
| 292 | struct super_block *sb, | ||
| 293 | struct autofs_sb_info *sbi, int flags) | ||
| 294 | { | 296 | { |
| 297 | struct super_block *sb = mnt->mnt_sb; | ||
| 298 | struct autofs_sb_info *sbi = autofs4_sbi(sb); | ||
| 295 | struct autofs_info *de_info = autofs4_dentry_ino(dentry); | 299 | struct autofs_info *de_info = autofs4_dentry_ino(dentry); |
| 296 | int status = 0; | 300 | int status = 0; |
| 297 | 301 | ||
| @@ -366,7 +370,7 @@ static int try_to_fill_dentry(struct dentry *dentry, | |||
| 366 | /* We don't update the usages for the autofs daemon itself, this | 370 | /* We don't update the usages for the autofs daemon itself, this |
| 367 | is necessary for recursive autofs mounts */ | 371 | is necessary for recursive autofs mounts */ |
| 368 | if (!autofs4_oz_mode(sbi)) | 372 | if (!autofs4_oz_mode(sbi)) |
| 369 | autofs4_update_usage(dentry); | 373 | autofs4_update_usage(mnt, dentry); |
| 370 | 374 | ||
| 371 | spin_lock(&dentry->d_lock); | 375 | spin_lock(&dentry->d_lock); |
| 372 | dentry->d_flags &= ~DCACHE_AUTOFS_PENDING; | 376 | dentry->d_flags &= ~DCACHE_AUTOFS_PENDING; |
| @@ -391,7 +395,7 @@ static int autofs4_revalidate(struct dentry * dentry, struct nameidata *nd) | |||
| 391 | /* Pending dentry */ | 395 | /* Pending dentry */ |
| 392 | if (autofs4_ispending(dentry)) { | 396 | if (autofs4_ispending(dentry)) { |
| 393 | if (!oz_mode) | 397 | if (!oz_mode) |
| 394 | status = try_to_fill_dentry(dentry, dir->i_sb, sbi, flags); | 398 | status = try_to_fill_dentry(nd->mnt, dentry, flags); |
| 395 | return status; | 399 | return status; |
| 396 | } | 400 | } |
| 397 | 401 | ||
| @@ -408,14 +412,14 @@ static int autofs4_revalidate(struct dentry * dentry, struct nameidata *nd) | |||
| 408 | dentry, dentry->d_name.len, dentry->d_name.name); | 412 | dentry, dentry->d_name.len, dentry->d_name.name); |
| 409 | spin_unlock(&dcache_lock); | 413 | spin_unlock(&dcache_lock); |
| 410 | if (!oz_mode) | 414 | if (!oz_mode) |
| 411 | status = try_to_fill_dentry(dentry, dir->i_sb, sbi, flags); | 415 | status = try_to_fill_dentry(nd->mnt, dentry, flags); |
| 412 | return status; | 416 | return status; |
| 413 | } | 417 | } |
| 414 | spin_unlock(&dcache_lock); | 418 | spin_unlock(&dcache_lock); |
| 415 | 419 | ||
| 416 | /* Update the usage list */ | 420 | /* Update the usage list */ |
| 417 | if (!oz_mode) | 421 | if (!oz_mode) |
| 418 | autofs4_update_usage(dentry); | 422 | autofs4_update_usage(nd->mnt, dentry); |
| 419 | 423 | ||
| 420 | return 1; | 424 | return 1; |
| 421 | } | 425 | } |
| @@ -488,9 +492,9 @@ static struct dentry *autofs4_lookup(struct inode *dir, struct dentry *dentry, s | |||
| 488 | d_add(dentry, NULL); | 492 | d_add(dentry, NULL); |
| 489 | 493 | ||
| 490 | if (dentry->d_op && dentry->d_op->d_revalidate) { | 494 | if (dentry->d_op && dentry->d_op->d_revalidate) { |
| 491 | up(&dir->i_sem); | 495 | mutex_unlock(&dir->i_mutex); |
| 492 | (dentry->d_op->d_revalidate)(dentry, nd); | 496 | (dentry->d_op->d_revalidate)(dentry, nd); |
| 493 | down(&dir->i_sem); | 497 | mutex_lock(&dir->i_mutex); |
| 494 | } | 498 | } |
| 495 | 499 | ||
| 496 | /* | 500 | /* |
