static int autofs_revalidate(struct dentry * dentry, struct nameidata *nd) { struct inode * dir; struct autofs_sb_info *sbi; struct autofs_dir_ent *ent; int res; lock_kernel(); dir = dentry->d_parent->d_inode; sbi = autofs_sbi(dir->i_sb); /* Pending dentry */ if (dentry->d_flags & DCACHE_AUTOFS_PENDING) { if (autofs_oz_mode(sbi)) res = 1; else res = try_to_fill_dentry(dentry, dir->i_sb, sbi); unlock_kernel(); return res; } /* Negative dentry.. invalidate if "old" */ if (!dentry->d_inode) { unlock_kernel(); return (dentry->d_time - jiffies <= AUTOFS_NEGATIVE_TIMEOUT); } /* Check for a non-mountpoint directory */ if (S_ISDIR(dentry->d_inode->i_mode) && !d_mountpoint(dentry)) { if (autofs_oz_mode(sbi)) res = 1; else res = try_to_fill_dentry(dentry, dir->i_sb, sbi); unlock_kernel(); return res; } /* Update the usage list */ if (!autofs_oz_mode(sbi)) { ent = (struct autofs_dir_ent *) dentry->d_time; if (ent) autofs_update_usage(&sbi->dirhash,ent); } unlock_kernel(); return 1; }
/* * Revalidate is called on every cache lookup. Some of those * cache lookups may actually happen while the dentry is not * yet completely filled in, and revalidate has to delay such * lookups.. */ static int autofs4_root_revalidate(struct dentry * dentry, int flags) { struct inode * dir = dentry->d_parent->d_inode; struct autofs_sb_info *sbi = autofs4_sbi(dir->i_sb); struct autofs_info *ino; int oz_mode = autofs4_oz_mode(sbi); /* Pending dentry */ if (autofs4_ispending(dentry)) { if (autofs4_oz_mode(sbi)) return 1; else return try_to_fill_dentry(dentry, dir->i_sb, sbi); } /* Negative dentry.. invalidate if "old" */ if (dentry->d_inode == NULL) return (dentry->d_time - jiffies <= AUTOFS_NEGATIVE_TIMEOUT); ino = autofs4_dentry_ino(dentry); /* Check for a non-mountpoint directory with no contents */ spin_lock(&dcache_lock); if (S_ISDIR(dentry->d_inode->i_mode) && !d_mountpoint(dentry) && list_empty(&dentry->d_subdirs)) { DPRINTK(("autofs_root_revalidate: dentry=%p %.*s, emptydir\n", dentry, dentry->d_name.len, dentry->d_name.name)); spin_unlock(&dcache_lock); if (oz_mode) return 1; else return try_to_fill_dentry(dentry, dir->i_sb, sbi); } spin_unlock(&dcache_lock); /* Update the usage list */ if (!oz_mode) autofs4_update_usage(dentry); return 1; }