| From 757c4f6260febff982276818bb946df89c1105aa Mon Sep 17 00:00:00 2001 |
| From: Jeff Layton <jlayton@redhat.com> |
| Date: Wed, 7 Aug 2013 10:29:08 -0400 |
| Subject: cifs: don't instantiate new dentries in readdir for inodes that need to be revalidated immediately |
| |
| From: Jeff Layton <jlayton@redhat.com> |
| |
| commit 757c4f6260febff982276818bb946df89c1105aa upstream. |
| |
| David reported that commit c2b93e06 (cifs: only set ops for inodes in |
| I_NEW state) caused a regression with mfsymlinks. Prior to that patch, |
| if a mfsymlink dentry was instantiated at readdir time, the inode would |
| get a new set of ops when it was revalidated. After that patch, this |
| did not occur. |
| |
| This patch addresses this by simply skipping instantiating dentries in |
| the readdir codepath when we know that they will need to be immediately |
| revalidated. The next attempt to use that dentry will cause a new lookup |
| to occur (which is basically what we want to happen anyway). |
| |
| Reported-and-Tested-by: David McBride <dwm37@cam.ac.uk> |
| Cc: "Stefan (metze) Metzmacher" <metze@samba.org> |
| Cc: Sachin Prabhu <sprabhu@redhat.com> |
| Signed-off-by: Jeff Layton <jlayton@redhat.com> |
| Signed-off-by: Steve French <smfrench@gmail.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/cifs/readdir.c | 8 ++++++++ |
| 1 file changed, 8 insertions(+) |
| |
| --- a/fs/cifs/readdir.c |
| +++ b/fs/cifs/readdir.c |
| @@ -111,6 +111,14 @@ cifs_prime_dcache(struct dentry *parent, |
| return; |
| } |
| |
| + /* |
| + * If we know that the inode will need to be revalidated immediately, |
| + * then don't create a new dentry for it. We'll end up doing an on |
| + * the wire call either way and this spares us an invalidation. |
| + */ |
| + if (fattr->cf_flags & CIFS_FATTR_NEED_REVAL) |
| + return; |
| + |
| dentry = d_alloc(parent, name); |
| if (!dentry) |
| return; |