autofs4 - fix get_next_positive_dentry()

The initialization condition in fs/autofs4/expire.c:get_next_positive_dentry()
appears to be incorrect. If prev == NULL I believe that root should be
returned.

Further down, at the current dentry check for it being simple_positive()
it looks like the d_lock for dentry p should be dropped instead of dentry
ret, otherwise when p is assinged to ret we end up with no lock on p and
a lost lock on ret, which leads to a deadlock.

Signed-off-by: Ian Kent <raven@themaw.net>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>

authored by Ian Kent and committed by Al Viro c14cc63a 6845a44a

+2 -2
+2 -2
fs/autofs4/expire.c
··· 96 struct dentry *p, *ret; 97 98 if (prev == NULL) 99 - return dget(prev); 100 101 spin_lock(&autofs4_lock); 102 relock: ··· 133 spin_lock_nested(&ret->d_lock, DENTRY_D_LOCK_NESTED); 134 /* Negative dentry - try next */ 135 if (!simple_positive(ret)) { 136 - spin_unlock(&ret->d_lock); 137 p = ret; 138 goto again; 139 }
··· 96 struct dentry *p, *ret; 97 98 if (prev == NULL) 99 + return dget(root); 100 101 spin_lock(&autofs4_lock); 102 relock: ··· 133 spin_lock_nested(&ret->d_lock, DENTRY_D_LOCK_NESTED); 134 /* Negative dentry - try next */ 135 if (!simple_positive(ret)) { 136 + spin_unlock(&p->d_lock); 137 p = ret; 138 goto again; 139 }