diff options
author | Jeff Layton <jlayton@redhat.com> | 2012-12-20 16:04:09 -0500 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2012-12-20 18:50:02 -0500 |
commit | b76d8b82266077dc7098dd13f321a616099a1bd8 (patch) | |
tree | 74213ef0c9ba31a937cddb158d5409d39fc3bee9 /fs | |
parent | 972567f14cbcd437e9a88a73836bbc2ee0720b5f (diff) |
vfs: fix mkdirat to retry once on an ESTALE error
Signed-off-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/namei.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/fs/namei.c b/fs/namei.c index b70c191b7e2b..1beebc1a38c9 100644 --- a/fs/namei.c +++ b/fs/namei.c | |||
@@ -3243,8 +3243,10 @@ SYSCALL_DEFINE3(mkdirat, int, dfd, const char __user *, pathname, umode_t, mode) | |||
3243 | struct dentry *dentry; | 3243 | struct dentry *dentry; |
3244 | struct path path; | 3244 | struct path path; |
3245 | int error; | 3245 | int error; |
3246 | unsigned int lookup_flags = LOOKUP_DIRECTORY; | ||
3246 | 3247 | ||
3247 | dentry = user_path_create(dfd, pathname, &path, LOOKUP_DIRECTORY); | 3248 | retry: |
3249 | dentry = user_path_create(dfd, pathname, &path, lookup_flags); | ||
3248 | if (IS_ERR(dentry)) | 3250 | if (IS_ERR(dentry)) |
3249 | return PTR_ERR(dentry); | 3251 | return PTR_ERR(dentry); |
3250 | 3252 | ||
@@ -3254,6 +3256,10 @@ SYSCALL_DEFINE3(mkdirat, int, dfd, const char __user *, pathname, umode_t, mode) | |||
3254 | if (!error) | 3256 | if (!error) |
3255 | error = vfs_mkdir(path.dentry->d_inode, dentry, mode); | 3257 | error = vfs_mkdir(path.dentry->d_inode, dentry, mode); |
3256 | done_path_create(&path, dentry); | 3258 | done_path_create(&path, dentry); |
3259 | if (retry_estale(error, lookup_flags)) { | ||
3260 | lookup_flags |= LOOKUP_REVAL; | ||
3261 | goto retry; | ||
3262 | } | ||
3257 | return error; | 3263 | return error; |
3258 | } | 3264 | } |
3259 | 3265 | ||