[PATCH v7 27/49] vfs: fix symlinkat to retry on ESTALE errors

2012-10-01 Thread Jeff Layton
Signed-off-by: Jeff Layton 
---
 fs/namei.c | 22 +-
 1 file changed, 13 insertions(+), 9 deletions(-)

diff --git a/fs/namei.c b/fs/namei.c
index dd1d519..fb9d36f 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -3528,21 +3528,25 @@ SYSCALL_DEFINE3(symlinkat, const char __user *, oldname,
struct getname_info *from;
struct dentry *dentry;
struct path path;
+   unsigned int try = 0;
 
from = getname(oldname);
if (IS_ERR(from))
return PTR_ERR(from);
 
-   dentry = user_path_create(newdfd, newname, , false, false);
-   error = PTR_ERR(dentry);
-   if (IS_ERR(dentry))
-   goto out_putname;
+   do {
+   dentry = user_path_create(newdfd, newname, , false, false);
+   if (IS_ERR(dentry)) {
+   error = PTR_ERR(dentry);
+   break;
+   }
 
-   error = security_path_symlink(, dentry, from->name);
-   if (!error)
-   error = vfs_symlink(path.dentry->d_inode, dentry, from->name);
-   done_path_create(, dentry);
-out_putname:
+   error = security_path_symlink(, dentry, from->name);
+   if (!error)
+   error = vfs_symlink(path.dentry->d_inode, dentry,
+   from->name);
+   done_path_create(, dentry);
+   } while (retry_estale(error, try++));
putname(from);
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/


[PATCH v7 27/49] vfs: fix symlinkat to retry on ESTALE errors

2012-10-01 Thread Jeff Layton
Signed-off-by: Jeff Layton jlay...@redhat.com
---
 fs/namei.c | 22 +-
 1 file changed, 13 insertions(+), 9 deletions(-)

diff --git a/fs/namei.c b/fs/namei.c
index dd1d519..fb9d36f 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -3528,21 +3528,25 @@ SYSCALL_DEFINE3(symlinkat, const char __user *, oldname,
struct getname_info *from;
struct dentry *dentry;
struct path path;
+   unsigned int try = 0;
 
from = getname(oldname);
if (IS_ERR(from))
return PTR_ERR(from);
 
-   dentry = user_path_create(newdfd, newname, path, false, false);
-   error = PTR_ERR(dentry);
-   if (IS_ERR(dentry))
-   goto out_putname;
+   do {
+   dentry = user_path_create(newdfd, newname, path, false, false);
+   if (IS_ERR(dentry)) {
+   error = PTR_ERR(dentry);
+   break;
+   }
 
-   error = security_path_symlink(path, dentry, from-name);
-   if (!error)
-   error = vfs_symlink(path.dentry-d_inode, dentry, from-name);
-   done_path_create(path, dentry);
-out_putname:
+   error = security_path_symlink(path, dentry, from-name);
+   if (!error)
+   error = vfs_symlink(path.dentry-d_inode, dentry,
+   from-name);
+   done_path_create(path, dentry);
+   } while (retry_estale(error, try++));
putname(from);
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/