]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - fs/autofs4/expire.c
autofs4: fix sparse warning in waitq.c:autofs4_expire_indirect()
[linux-2.6-omap-h63xx.git] / fs / autofs4 / expire.c
index b8ce02607d66bacd03d60acad9b99ffd9e48d7d2..cfa12db8f41b6129cfdbe4e0a47e66bcf705d4d9 100644 (file)
@@ -32,7 +32,7 @@ static inline int autofs4_can_expire(struct dentry *dentry,
 
        if (!do_now) {
                /* Too young to die */
-               if (time_after(ino->last_used + timeout, now))
+               if (!timeout || time_after(ino->last_used + timeout, now))
                        return 0;
 
                /* update last_used here :-
@@ -174,6 +174,12 @@ static int autofs4_tree_busy(struct vfsmount *mnt,
                        struct autofs_info *ino = autofs4_dentry_ino(p);
                        unsigned int ino_count = atomic_read(&ino->count);
 
+                       /*
+                        * Clean stale dentries below that have not been
+                        * invalidated after a mount fail during lookup
+                        */
+                       d_invalidate(p);
+
                        /* allow for dget above and top is already dgot */
                        if (p == top)
                                ino_count += 2;
@@ -247,7 +253,7 @@ static struct dentry *autofs4_expire_direct(struct super_block *sb,
        struct dentry *root = dget(sb->s_root);
        int do_now = how & AUTOFS_EXP_IMMEDIATE;
 
-       if (!sbi->exp_timeout || !root)
+       if (!root)
                return NULL;
 
        now = jiffies;
@@ -287,7 +293,7 @@ static struct dentry *autofs4_expire_indirect(struct super_block *sb,
        int do_now = how & AUTOFS_EXP_IMMEDIATE;
        int exp_leaves = how & AUTOFS_EXP_LEAVES;
 
-       if ( !sbi->exp_timeout || !root )
+       if (!root)
                return NULL;
 
        now = jiffies;
@@ -327,7 +333,7 @@ static struct dentry *autofs4_expire_indirect(struct super_block *sb,
                        /* Can we expire this guy */
                        if (autofs4_can_expire(dentry, timeout, do_now)) {
                                expired = dentry;
-                               break;
+                               goto found;
                        }
                        goto next;
                }
@@ -346,7 +352,7 @@ static struct dentry *autofs4_expire_indirect(struct super_block *sb,
                                inf->flags |= AUTOFS_INF_EXPIRING;
                                spin_unlock(&sbi->fs_lock);
                                expired = dentry;
-                               break;
+                               goto found;
                        }
                        spin_unlock(&sbi->fs_lock);
                /*
@@ -357,7 +363,7 @@ static struct dentry *autofs4_expire_indirect(struct super_block *sb,
                        expired = autofs4_check_leaves(mnt, dentry, timeout, do_now);
                        if (expired) {
                                dput(dentry);
-                               break;
+                               goto found;
                        }
                }
 next:
@@ -365,19 +371,16 @@ next:
                spin_lock(&dcache_lock);
                next = next->next;
        }
-
-       if (expired) {
-               DPRINTK("returning %p %.*s",
-                       expired, (int)expired->d_name.len, expired->d_name.name);
-               spin_lock(&dcache_lock);
-               list_del(&expired->d_parent->d_subdirs);
-               list_add(&expired->d_parent->d_subdirs, &expired->d_u.d_child);
-               spin_unlock(&dcache_lock);
-               return expired;
-       }
        spin_unlock(&dcache_lock);
-
        return NULL;
+
+found:
+       DPRINTK("returning %p %.*s",
+               expired, (int)expired->d_name.len, expired->d_name.name);
+       spin_lock(&dcache_lock);
+       list_move(&expired->d_parent->d_subdirs, &expired->d_u.d_child);
+       spin_unlock(&dcache_lock);
+       return expired;
 }
 
 /* Perform an expiry operation */