|
@@ -485,22 +485,6 @@ static struct dentry *autofs4_lookup(struct inode *dir, struct dentry *dentry, s
|
|
|
DPRINTK("pid = %u, pgrp = %u, catatonic = %d, oz_mode = %d",
|
|
|
current->pid, task_pgrp_nr(current), sbi->catatonic, oz_mode);
|
|
|
|
|
|
- expiring = autofs4_lookup_expiring(sbi, dentry->d_parent, &dentry->d_name);
|
|
|
- if (expiring) {
|
|
|
- /*
|
|
|
- * If we are racing with expire the request might not
|
|
|
- * be quite complete but the directory has been removed
|
|
|
- * so it must have been successful, so just wait for it.
|
|
|
- */
|
|
|
- ino = autofs4_dentry_ino(expiring);
|
|
|
- autofs4_expire_wait(expiring);
|
|
|
- spin_lock(&sbi->lookup_lock);
|
|
|
- if (!list_empty(&ino->expiring))
|
|
|
- list_del_init(&ino->expiring);
|
|
|
- spin_unlock(&sbi->lookup_lock);
|
|
|
- dput(expiring);
|
|
|
- }
|
|
|
-
|
|
|
unhashed = autofs4_lookup_active(sbi, dentry->d_parent, &dentry->d_name);
|
|
|
if (unhashed)
|
|
|
dentry = unhashed;
|
|
@@ -538,14 +522,31 @@ static struct dentry *autofs4_lookup(struct inode *dir, struct dentry *dentry, s
|
|
|
}
|
|
|
|
|
|
if (!oz_mode) {
|
|
|
+ mutex_unlock(&dir->i_mutex);
|
|
|
+ expiring = autofs4_lookup_expiring(sbi,
|
|
|
+ dentry->d_parent,
|
|
|
+ &dentry->d_name);
|
|
|
+ if (expiring) {
|
|
|
+ /*
|
|
|
+ * If we are racing with expire the request might not
|
|
|
+ * be quite complete but the directory has been removed
|
|
|
+ * so it must have been successful, so just wait for it.
|
|
|
+ */
|
|
|
+ ino = autofs4_dentry_ino(expiring);
|
|
|
+ autofs4_expire_wait(expiring);
|
|
|
+ spin_lock(&sbi->lookup_lock);
|
|
|
+ if (!list_empty(&ino->expiring))
|
|
|
+ list_del_init(&ino->expiring);
|
|
|
+ spin_unlock(&sbi->lookup_lock);
|
|
|
+ dput(expiring);
|
|
|
+ }
|
|
|
+
|
|
|
spin_lock(&dentry->d_lock);
|
|
|
dentry->d_flags |= DCACHE_AUTOFS_PENDING;
|
|
|
spin_unlock(&dentry->d_lock);
|
|
|
- if (dentry->d_op && dentry->d_op->d_revalidate) {
|
|
|
- mutex_unlock(&dir->i_mutex);
|
|
|
+ if (dentry->d_op && dentry->d_op->d_revalidate)
|
|
|
(dentry->d_op->d_revalidate)(dentry, nd);
|
|
|
- mutex_lock(&dir->i_mutex);
|
|
|
- }
|
|
|
+ mutex_lock(&dir->i_mutex);
|
|
|
}
|
|
|
|
|
|
/*
|