From b5b74d8da7b8c2447941ce1fa18cfaa29b6b2493 Mon Sep 17 00:00:00 2001 From: David Howells Date: Mon, 11 Jul 2011 14:20:57 +0100 Subject: [PATCH] --- yaml --- r: 262066 b: refs/heads/master c: 5a30d8a2b8ddd5102c440c7e5a7c8e1fd729c818 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/fs/namei.c | 24 +++++++++++++++--------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/[refs] b/[refs] index 4739a12d4c06..3034c1ac3d77 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: b4aff1f874f679320c03e3d97b60fc7babfd4623 +refs/heads/master: 5a30d8a2b8ddd5102c440c7e5a7c8e1fd729c818 diff --git a/trunk/fs/namei.c b/trunk/fs/namei.c index f8c69d373793..445fd5da11fa 100644 --- a/trunk/fs/namei.c +++ b/trunk/fs/namei.c @@ -716,19 +716,25 @@ static int follow_automount(struct path *path, unsigned flags, if ((flags & LOOKUP_NO_AUTOMOUNT) && !(flags & LOOKUP_PARENT)) return -EISDIR; /* we actually want to stop here */ - /* We want to mount if someone is trying to open/create a file of any - * type under the mountpoint, wants to traverse through the mountpoint - * or wants to open the mounted directory. - * + /* * We don't want to mount if someone's just doing a stat and they've * set AT_SYMLINK_NOFOLLOW - unless they're stat'ing a directory and * appended a '/' to the name. */ - if (!(flags & LOOKUP_FOLLOW) && - !(flags & (LOOKUP_PARENT | LOOKUP_DIRECTORY | - LOOKUP_OPEN | LOOKUP_CREATE))) - return -EISDIR; - + if (!(flags & LOOKUP_FOLLOW)) { + /* We do, however, want to mount if someone wants to open or + * create a file of any type under the mountpoint, wants to + * traverse through the mountpoint or wants to open the mounted + * directory. + * Also, autofs may mark negative dentries as being automount + * points. These will need the attentions of the daemon to + * instantiate them before they can be used. + */ + if (!(flags & (LOOKUP_PARENT | LOOKUP_DIRECTORY | + LOOKUP_OPEN | LOOKUP_CREATE)) && + path->dentry->d_inode) + return -EISDIR; + } current->total_link_count++; if (current->total_link_count >= 40) return -ELOOP;