|
@@ -74,7 +74,7 @@ int vfs_fstatat(int dfd, const char __user *filename, struct kstat *stat,
|
|
|
{
|
|
|
struct path path;
|
|
|
int error = -EINVAL;
|
|
|
- int lookup_flags = 0;
|
|
|
+ unsigned int lookup_flags = 0;
|
|
|
|
|
|
if ((flag & ~(AT_SYMLINK_NOFOLLOW | AT_NO_AUTOMOUNT |
|
|
|
AT_EMPTY_PATH)) != 0)
|
|
@@ -84,13 +84,17 @@ int vfs_fstatat(int dfd, const char __user *filename, struct kstat *stat,
|
|
|
lookup_flags |= LOOKUP_FOLLOW;
|
|
|
if (flag & AT_EMPTY_PATH)
|
|
|
lookup_flags |= LOOKUP_EMPTY;
|
|
|
-
|
|
|
+retry:
|
|
|
error = user_path_at(dfd, filename, lookup_flags, &path);
|
|
|
if (error)
|
|
|
goto out;
|
|
|
|
|
|
error = vfs_getattr(path.mnt, path.dentry, stat);
|
|
|
path_put(&path);
|
|
|
+ if (retry_estale(error, lookup_flags)) {
|
|
|
+ lookup_flags |= LOOKUP_REVAL;
|
|
|
+ goto retry;
|
|
|
+ }
|
|
|
out:
|
|
|
return error;
|
|
|
}
|