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 05/20] vfs: fix mknodat to retry on ESTALE errors
    Date
    Signed-off-by: Jeff Layton <jlayton@redhat.com>
    ---
    fs/namei.c | 43 +++++++++++++++++++++++++------------------
    1 file changed, 25 insertions(+), 18 deletions(-)
    diff --git a/fs/namei.c b/fs/namei.c
    index d71be0b..11fc388 100644
    --- a/fs/namei.c
    +++ b/fs/namei.c
    @@ -3176,34 +3176,41 @@ SYSCALL_DEFINE4(mknodat, int, dfd, const char __user *, filename, umode_t, mode,
    struct dentry *dentry;
    struct path path;
    int error;
    + unsigned int try = 0;

    error = may_mknod(mode);
    if (error)
    return error;

    - dentry = user_path_create(dfd, filename, &path, false, false);
    - if (IS_ERR(dentry))
    - return PTR_ERR(dentry);
    + do {
    + dentry = user_path_create(dfd, filename, &path, false, try);
    + if (IS_ERR(dentry))
    + return PTR_ERR(dentry);

    - if (!IS_POSIXACL(path.dentry->d_inode))
    - mode &= ~current_umask();
    - error = security_path_mknod(&path, dentry, mode, dev);
    - if (error)
    - goto out;
    - switch (mode & S_IFMT) {
    - case 0: case S_IFREG:
    - error = vfs_create(path.dentry->d_inode,dentry,mode,true);
    + if (!IS_POSIXACL(path.dentry->d_inode))
    + mode &= ~current_umask();
    + error = security_path_mknod(&path, dentry, mode, dev);
    + if (error)
    + goto out;
    + switch (mode & S_IFMT) {
    + case 0:
    + case S_IFREG:
    + error = vfs_create(path.dentry->d_inode, dentry,
    + mode, true);
    break;
    - case S_IFCHR: case S_IFBLK:
    - error = vfs_mknod(path.dentry->d_inode,dentry,mode,
    + case S_IFCHR:
    + case S_IFBLK:
    + error = vfs_mknod(path.dentry->d_inode, dentry, mode,
    new_decode_dev(dev));
    break;
    - case S_IFIFO: case S_IFSOCK:
    - error = vfs_mknod(path.dentry->d_inode,dentry,mode,0);
    - break;
    - }
    + case S_IFIFO:
    + case S_IFSOCK:
    + error = vfs_mknod(path.dentry->d_inode, dentry,
    + mode, 0);
    + }
    out:
    - done_path_create(&path, dentry);
    + done_path_create(&path, dentry);
    + } while (retry_estale(error, try++));
    return error;
    }

    --
    1.7.11.4


    \
     
     \ /
      Last update: 2012-09-07 17:03    [from the cache]
    ©2003-2014 Jasper Spaans. Advertise on this site