lkml.org 
[lkml]   [2013]   [Sep]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 035/104] cifs: don't instantiate new dentries in readdir for inodes that need to be revalidated immediately
    Date
    3.5.7.22 -stable review patch.  If anyone has any objections, please let me know.

    ------------------

    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).

    Cc: "Stefan (metze) Metzmacher" <metze@samba.org>
    Cc: Sachin Prabhu <sprabhu@redhat.com>
    Reported-and-Tested-by: David McBride <dwm37@cam.ac.uk>
    Signed-off-by: Jeff Layton <jlayton@redhat.com>
    Signed-off-by: Steve French <smfrench@gmail.com>
    [ luis: backported to 3.5: added 'NULL' return ]
    Signed-off-by: Luis Henriques <luis.henriques@canonical.com>
    ---
    fs/cifs/readdir.c | 8 ++++++++
    1 file changed, 8 insertions(+)

    diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c
    index 6cb83b9..8ae4457 100644
    --- a/fs/cifs/readdir.c
    +++ b/fs/cifs/readdir.c
    @@ -107,6 +107,14 @@ cifs_readdir_lookup(struct dentry *parent, struct qstr *name,
    dput(dentry);
    }

    + /*
    + * 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 NULL;
    +
    dentry = d_alloc(parent, name);
    if (dentry == NULL)
    return NULL;
    --
    1.8.3.2


    \
     
     \ /
      Last update: 2013-09-30 13:21    [W:3.429 / U:0.520 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site