|
@@ -582,6 +582,7 @@ SYSCALL_DEFINE5(fchownat, int, dfd, const char __user *, filename, uid_t, user,
|
|
|
lookup_flags = (flag & AT_SYMLINK_NOFOLLOW) ? 0 : 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;
|
|
@@ -592,6 +593,10 @@ SYSCALL_DEFINE5(fchownat, int, dfd, const char __user *, filename, uid_t, user,
|
|
|
mnt_drop_write(path.mnt);
|
|
|
out_release:
|
|
|
path_put(&path);
|
|
|
+ if (retry_estale(error, lookup_flags)) {
|
|
|
+ lookup_flags |= LOOKUP_REVAL;
|
|
|
+ goto retry;
|
|
|
+ }
|
|
|
out:
|
|
|
return error;
|
|
|
}
|