lkml.org 
[lkml]   [2012]   [Nov]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v9 10/34] vfs: make rmdir retry on ESTALE errors
    Date
    Signed-off-by: Jeff Layton <jlayton@redhat.com>
    ---
    fs/namei.c | 79 +++++++++++++++++++++++++++++++++-----------------------------
    1 file changed, 42 insertions(+), 37 deletions(-)

    diff --git a/fs/namei.c b/fs/namei.c
    index 1569ccd..0b70e6d 100644
    --- a/fs/namei.c
    +++ b/fs/namei.c
    @@ -3344,49 +3344,54 @@ static long do_rmdir(int dfd, const char __user *pathname)
    struct filename *name;
    struct dentry *dentry;
    struct nameidata nd;
    + unsigned int try = 0;

    - name = user_path_parent(dfd, pathname, &nd, 0);
    - if (IS_ERR(name))
    - return PTR_ERR(name);
    -
    - switch(nd.last_type) {
    - case LAST_DOTDOT:
    - error = -ENOTEMPTY;
    - goto exit1;
    - case LAST_DOT:
    - error = -EINVAL;
    - goto exit1;
    - case LAST_ROOT:
    - error = -EBUSY;
    - goto exit1;
    - }
    + do {
    + name = user_path_parent(dfd, pathname, &nd, try);
    + if (IS_ERR(name))
    + return PTR_ERR(name);
    +
    + switch (nd.last_type) {
    + case LAST_DOTDOT:
    + error = -ENOTEMPTY;
    + goto exit1;
    + case LAST_DOT:
    + error = -EINVAL;
    + goto exit1;
    + case LAST_ROOT:
    + error = -EBUSY;
    + goto exit1;
    + }

    - nd.flags &= ~LOOKUP_PARENT;
    - error = mnt_want_write(nd.path.mnt);
    - if (error)
    - goto exit1;
    + nd.flags &= ~LOOKUP_PARENT;
    + error = mnt_want_write(nd.path.mnt);
    + if (error)
    + goto exit1;

    - mutex_lock_nested(&nd.path.dentry->d_inode->i_mutex, I_MUTEX_PARENT);
    - dentry = lookup_hash(&nd);
    - error = PTR_ERR(dentry);
    - if (IS_ERR(dentry))
    - goto exit2;
    - if (!dentry->d_inode) {
    - error = -ENOENT;
    - goto exit3;
    - }
    - error = security_path_rmdir(&nd.path, dentry);
    - if (error)
    - goto exit3;
    - error = vfs_rmdir(nd.path.dentry->d_inode, dentry);
    + mutex_lock_nested(&nd.path.dentry->d_inode->i_mutex,
    + I_MUTEX_PARENT);
    + dentry = lookup_hash(&nd);
    + if (IS_ERR(dentry)) {
    + error = PTR_ERR(dentry);
    + goto exit2;
    + }
    + if (!dentry->d_inode) {
    + error = -ENOENT;
    + goto exit3;
    + }
    + error = security_path_rmdir(&nd.path, dentry);
    + if (error)
    + goto exit3;
    + error = vfs_rmdir(nd.path.dentry->d_inode, dentry);
    exit3:
    - dput(dentry);
    + dput(dentry);
    exit2:
    - mutex_unlock(&nd.path.dentry->d_inode->i_mutex);
    - mnt_drop_write(nd.path.mnt);
    + mutex_unlock(&nd.path.dentry->d_inode->i_mutex);
    + mnt_drop_write(nd.path.mnt);
    exit1:
    - path_put(&nd.path);
    - putname(name);
    + path_put(&nd.path);
    + putname(name);
    + } while (retry_estale(error, try++));
    return error;
    }

    --
    1.7.11.7


    \
     
     \ /
      Last update: 2012-11-05 18:22    [W:4.092 / U:0.184 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site