diff options
Diffstat (limited to 'fs/autofs4')
-rw-r--r-- | fs/autofs4/waitq.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/fs/autofs4/waitq.c b/fs/autofs4/waitq.c index c5f8459c905e..56010056b2e6 100644 --- a/fs/autofs4/waitq.c +++ b/fs/autofs4/waitq.c | |||
@@ -309,6 +309,9 @@ static int validate_request(struct autofs_wait_queue **wait, | |||
309 | * completed while we waited on the mutex ... | 309 | * completed while we waited on the mutex ... |
310 | */ | 310 | */ |
311 | if (notify == NFY_MOUNT) { | 311 | if (notify == NFY_MOUNT) { |
312 | struct dentry *new = NULL; | ||
313 | int valid = 1; | ||
314 | |||
312 | /* | 315 | /* |
313 | * If the dentry was successfully mounted while we slept | 316 | * If the dentry was successfully mounted while we slept |
314 | * on the wait queue mutex we can return success. If it | 317 | * on the wait queue mutex we can return success. If it |
@@ -316,8 +319,20 @@ static int validate_request(struct autofs_wait_queue **wait, | |||
316 | * a multi-mount with no mount at it's base) we can | 319 | * a multi-mount with no mount at it's base) we can |
317 | * continue on and create a new request. | 320 | * continue on and create a new request. |
318 | */ | 321 | */ |
322 | if (!IS_ROOT(dentry)) { | ||
323 | if (dentry->d_inode && d_unhashed(dentry)) { | ||
324 | struct dentry *parent = dentry->d_parent; | ||
325 | new = d_lookup(parent, &dentry->d_name); | ||
326 | if (new) | ||
327 | dentry = new; | ||
328 | } | ||
329 | } | ||
319 | if (have_submounts(dentry)) | 330 | if (have_submounts(dentry)) |
320 | return 0; | 331 | valid = 0; |
332 | |||
333 | if (new) | ||
334 | dput(new); | ||
335 | return valid; | ||
321 | } | 336 | } |
322 | 337 | ||
323 | return 1; | 338 | return 1; |