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