diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/autofs4/autofs_i.h | 2 | ||||
-rw-r--r-- | fs/autofs4/dev-ioctl.c | 29 | ||||
-rw-r--r-- | fs/autofs4/expire.c | 27 |
3 files changed, 20 insertions, 38 deletions
diff --git a/fs/autofs4/autofs_i.h b/fs/autofs4/autofs_i.h index a76803108d06..b7ff33c63101 100644 --- a/fs/autofs4/autofs_i.h +++ b/fs/autofs4/autofs_i.h | |||
@@ -186,6 +186,8 @@ int autofs4_expire_wait(struct dentry *dentry); | |||
186 | int autofs4_expire_run(struct super_block *, struct vfsmount *, | 186 | int autofs4_expire_run(struct super_block *, struct vfsmount *, |
187 | struct autofs_sb_info *, | 187 | struct autofs_sb_info *, |
188 | struct autofs_packet_expire __user *); | 188 | struct autofs_packet_expire __user *); |
189 | int autofs4_do_expire_multi(struct super_block *sb, struct vfsmount *mnt, | ||
190 | struct autofs_sb_info *sbi, int when); | ||
189 | int autofs4_expire_multi(struct super_block *, struct vfsmount *, | 191 | int autofs4_expire_multi(struct super_block *, struct vfsmount *, |
190 | struct autofs_sb_info *, int __user *); | 192 | struct autofs_sb_info *, int __user *); |
191 | struct dentry *autofs4_expire_direct(struct super_block *sb, | 193 | struct dentry *autofs4_expire_direct(struct super_block *sb, |
diff --git a/fs/autofs4/dev-ioctl.c b/fs/autofs4/dev-ioctl.c index 025e105bffea..9e5ae8a4f5c8 100644 --- a/fs/autofs4/dev-ioctl.c +++ b/fs/autofs4/dev-ioctl.c | |||
@@ -525,40 +525,13 @@ static int autofs_dev_ioctl_expire(struct file *fp, | |||
525 | struct autofs_sb_info *sbi, | 525 | struct autofs_sb_info *sbi, |
526 | struct autofs_dev_ioctl *param) | 526 | struct autofs_dev_ioctl *param) |
527 | { | 527 | { |
528 | struct dentry *dentry; | ||
529 | struct vfsmount *mnt; | 528 | struct vfsmount *mnt; |
530 | int err = -EAGAIN; | ||
531 | int how; | 529 | int how; |
532 | 530 | ||
533 | how = param->expire.how; | 531 | how = param->expire.how; |
534 | mnt = fp->f_path.mnt; | 532 | mnt = fp->f_path.mnt; |
535 | 533 | ||
536 | if (autofs_type_trigger(sbi->type)) | 534 | return autofs4_do_expire_multi(sbi->sb, mnt, sbi, how); |
537 | dentry = autofs4_expire_direct(sbi->sb, mnt, sbi, how); | ||
538 | else | ||
539 | dentry = autofs4_expire_indirect(sbi->sb, mnt, sbi, how); | ||
540 | |||
541 | if (dentry) { | ||
542 | struct autofs_info *ino = autofs4_dentry_ino(dentry); | ||
543 | |||
544 | /* | ||
545 | * This is synchronous because it makes the daemon a | ||
546 | * little easier | ||
547 | */ | ||
548 | err = autofs4_wait(sbi, dentry, NFY_EXPIRE); | ||
549 | |||
550 | spin_lock(&sbi->fs_lock); | ||
551 | if (ino->flags & AUTOFS_INF_MOUNTPOINT) { | ||
552 | ino->flags &= ~AUTOFS_INF_MOUNTPOINT; | ||
553 | sbi->sb->s_root->d_mounted++; | ||
554 | } | ||
555 | ino->flags &= ~AUTOFS_INF_EXPIRING; | ||
556 | complete_all(&ino->expire_complete); | ||
557 | spin_unlock(&sbi->fs_lock); | ||
558 | dput(dentry); | ||
559 | } | ||
560 | |||
561 | return err; | ||
562 | } | 535 | } |
563 | 536 | ||
564 | /* Check if autofs mount point is in use */ | 537 | /* Check if autofs mount point is in use */ |
diff --git a/fs/autofs4/expire.c b/fs/autofs4/expire.c index e3bd50776f9e..75f7ddacf7d6 100644 --- a/fs/autofs4/expire.c +++ b/fs/autofs4/expire.c | |||
@@ -478,22 +478,16 @@ int autofs4_expire_run(struct super_block *sb, | |||
478 | return ret; | 478 | return ret; |
479 | } | 479 | } |
480 | 480 | ||
481 | /* Call repeatedly until it returns -EAGAIN, meaning there's nothing | 481 | int autofs4_do_expire_multi(struct super_block *sb, struct vfsmount *mnt, |
482 | more to be done */ | 482 | struct autofs_sb_info *sbi, int when) |
483 | int autofs4_expire_multi(struct super_block *sb, struct vfsmount *mnt, | ||
484 | struct autofs_sb_info *sbi, int __user *arg) | ||
485 | { | 483 | { |
486 | struct dentry *dentry; | 484 | struct dentry *dentry; |
487 | int ret = -EAGAIN; | 485 | int ret = -EAGAIN; |
488 | int do_now = 0; | ||
489 | |||
490 | if (arg && get_user(do_now, arg)) | ||
491 | return -EFAULT; | ||
492 | 486 | ||
493 | if (autofs_type_trigger(sbi->type)) | 487 | if (autofs_type_trigger(sbi->type)) |
494 | dentry = autofs4_expire_direct(sb, mnt, sbi, do_now); | 488 | dentry = autofs4_expire_direct(sb, mnt, sbi, when); |
495 | else | 489 | else |
496 | dentry = autofs4_expire_indirect(sb, mnt, sbi, do_now); | 490 | dentry = autofs4_expire_indirect(sb, mnt, sbi, when); |
497 | 491 | ||
498 | if (dentry) { | 492 | if (dentry) { |
499 | struct autofs_info *ino = autofs4_dentry_ino(dentry); | 493 | struct autofs_info *ino = autofs4_dentry_ino(dentry); |
@@ -516,3 +510,16 @@ int autofs4_expire_multi(struct super_block *sb, struct vfsmount *mnt, | |||
516 | return ret; | 510 | return ret; |
517 | } | 511 | } |
518 | 512 | ||
513 | /* Call repeatedly until it returns -EAGAIN, meaning there's nothing | ||
514 | more to be done */ | ||
515 | int autofs4_expire_multi(struct super_block *sb, struct vfsmount *mnt, | ||
516 | struct autofs_sb_info *sbi, int __user *arg) | ||
517 | { | ||
518 | int do_now = 0; | ||
519 | |||
520 | if (arg && get_user(do_now, arg)) | ||
521 | return -EFAULT; | ||
522 | |||
523 | return autofs4_do_expire_multi(sb, mnt, sbi, do_now); | ||
524 | } | ||
525 | |||