Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 836fb7e7 authored by Jeff Layton's avatar Jeff Layton Committed by Al Viro
Browse files

vfs: make fstatat retry on ESTALE errors from getattr call

parent b9d6ba94
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -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;
}