struct dentry *autofs4_expire_direct(struct super_block *sb, struct vfsmount *mnt, struct autofs_sb_info *sbi, int how) { unsigned long timeout; struct dentry *root = dget(sb->s_root); int do_now = how & AUTOFS_EXP_IMMEDIATE; struct autofs_info *ino; if (!root) return NULL; now = jiffies; timeout = sbi->exp_timeout; spin_lock(&sbi->fs_lock); ino = autofs4_dentry_ino(root); if (ino->flags & AUTOFS_INF_PENDING) goto out; if (!autofs4_direct_busy(mnt, root, timeout, do_now)) { struct autofs_info *ino = autofs4_dentry_ino(root); ino->flags |= AUTOFS_INF_EXPIRING; init_completion(&ino->expire_complete); spin_unlock(&sbi->fs_lock); return root; } out: spin_unlock(&sbi->fs_lock); dput(root); return NULL; }
/* Check if we can expire a direct mount (possibly a tree) */ static struct dentry *autofs4_expire_direct(struct super_block *sb, struct vfsmount *mnt, struct autofs_sb_info *sbi, int how) { unsigned long timeout; struct dentry *root = dget(sb->s_root); int do_now = how & AUTOFS_EXP_IMMEDIATE; if (!root) return NULL; now = jiffies; timeout = sbi->exp_timeout; /* Lock the tree as we must expire as a whole */ spin_lock(&sbi->fs_lock); if (!autofs4_direct_busy(mnt, root, timeout, do_now)) { struct autofs_info *ino = autofs4_dentry_ino(root); /* Set this flag early to catch sys_chdir and the like */ ino->flags |= AUTOFS_INF_EXPIRING; spin_unlock(&sbi->fs_lock); return root; } spin_unlock(&sbi->fs_lock); dput(root); return NULL; }