Signed-off-by: Jeff Layton <jlay...@redhat.com>
---
 fs/namei.c | 43 +++++++++++++++++++++++++------------------
 1 file changed, 25 insertions(+), 18 deletions(-)

diff --git a/fs/namei.c b/fs/namei.c
index 6c75fc1..ac62973 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -3180,34 +3180,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

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to