lkml.org 
[lkml]   [2012]   [Sep]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v6 03/20] vfs: fix readlinkat to retry on ESTALE
    Date
    Signed-off-by: Jeff Layton <jlayton@redhat.com>
    ---
    fs/stat.c | 16 ++++++++++++----
    1 file changed, 12 insertions(+), 4 deletions(-)
    diff --git a/fs/stat.c b/fs/stat.c
    index d90258d..9719df1 100644
    --- a/fs/stat.c
    +++ b/fs/stat.c
    @@ -300,14 +300,21 @@ SYSCALL_DEFINE4(readlinkat, int, dfd, const char __user *, pathname,
    struct path path;
    int error;
    int empty = 0;
    + unsigned int try = 0;
    + unsigned int lookup_flags = LOOKUP_EMPTY;

    if (bufsiz <= 0)
    return -EINVAL;

    - error = user_path_at_empty(dfd, pathname, LOOKUP_EMPTY, &path, &empty);
    - if (!error) {
    - struct inode *inode = path.dentry->d_inode;
    + do {
    + struct inode *inode;
    +
    + error = user_path_at_empty(dfd, pathname, lookup_flags,
    + &path, &empty);
    + if (error)
    + break;

    + inode = path.dentry->d_inode;
    error = empty ? -ENOENT : -EINVAL;
    if (inode->i_op->readlink) {
    error = security_inode_readlink(path.dentry);
    @@ -318,7 +325,8 @@ SYSCALL_DEFINE4(readlinkat, int, dfd, const char __user *, pathname,
    }
    }
    path_put(&path);
    - }
    + lookup_flags |= LOOKUP_REVAL;
    + } while (retry_estale(error, try++));
    return error;
    }

    --
    1.7.11.4


    \
     
     \ /
      Last update: 2012-09-07 17:21    [from the cache]
    ©2003-2011 Jasper Spaans