[PATCH v7 22/49] vfs: make fstatat retry on ESTALE errors from getattr call

2012-10-01 Thread Jeff Layton
Signed-off-by: Jeff Layton 
---
 fs/stat.c | 16 ++--
 1 file changed, 10 insertions(+), 6 deletions(-)

diff --git a/fs/stat.c b/fs/stat.c
index 4078022..7f1602a 100644
--- a/fs/stat.c
+++ b/fs/stat.c
@@ -74,7 +74,8 @@ int vfs_fstatat(int dfd, const char __user *filename, struct 
kstat *stat,
 {
struct path path;
int error = -EINVAL;
-   int lookup_flags = 0;
+   unsigned int try = 0;
+   unsigned int lookup_flags = 0;
 
if ((flag & ~(AT_SYMLINK_NOFOLLOW | AT_NO_AUTOMOUNT |
  AT_EMPTY_PATH)) != 0)
@@ -85,12 +86,15 @@ int vfs_fstatat(int dfd, const char __user *filename, 
struct kstat *stat,
if (flag & AT_EMPTY_PATH)
lookup_flags |= LOOKUP_EMPTY;
 
-   error = user_path_at(dfd, filename, lookup_flags, );
-   if (error)
-   goto out;
+   do {
+   error = user_path_at(dfd, filename, lookup_flags, );
+   if (error)
+   break;
 
-   error = vfs_getattr(path.mnt, path.dentry, stat);
-   path_put();
+   error = vfs_getattr(path.mnt, path.dentry, stat);
+   path_put();
+   lookup_flags |= LOOKUP_REVAL;
+   } while (retry_estale(error, try++));
 out:
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 22/49] vfs: make fstatat retry on ESTALE errors from getattr call

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

diff --git a/fs/stat.c b/fs/stat.c
index 4078022..7f1602a 100644
--- a/fs/stat.c
+++ b/fs/stat.c
@@ -74,7 +74,8 @@ int vfs_fstatat(int dfd, const char __user *filename, struct 
kstat *stat,
 {
struct path path;
int error = -EINVAL;
-   int lookup_flags = 0;
+   unsigned int try = 0;
+   unsigned int lookup_flags = 0;
 
if ((flag  ~(AT_SYMLINK_NOFOLLOW | AT_NO_AUTOMOUNT |
  AT_EMPTY_PATH)) != 0)
@@ -85,12 +86,15 @@ int vfs_fstatat(int dfd, const char __user *filename, 
struct kstat *stat,
if (flag  AT_EMPTY_PATH)
lookup_flags |= LOOKUP_EMPTY;
 
-   error = user_path_at(dfd, filename, lookup_flags, path);
-   if (error)
-   goto out;
+   do {
+   error = user_path_at(dfd, filename, lookup_flags, path);
+   if (error)
+   break;
 
-   error = vfs_getattr(path.mnt, path.dentry, stat);
-   path_put(path);
+   error = vfs_getattr(path.mnt, path.dentry, stat);
+   path_put(path);
+   lookup_flags |= LOOKUP_REVAL;
+   } while (retry_estale(error, try++));
 out:
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/