@@ -506,12 +506,17 @@ SYSCALL_DEFINE3(fchmodat, int, dfd, const char __user *, filename, umode_t, mode
{
struct path path;
int error;
+ unsigned int try = 0;
+ int lookup_flags = LOOKUP_FOLLOW;
- error = user_path_at(dfd, filename, LOOKUP_FOLLOW, &path);
- if (!error) {
+ do {
+ error = user_path_at(dfd, filename, lookup_flags, &path);
+ if (error)
+ break;
error = chmod_common(&path, mode);
path_put(&path);
- }
+ lookup_flags |= LOOKUP_REVAL;
+ } while (retry_estale(error, try++));
return error;
}
Signed-off-by: Jeff Layton <jlayton@redhat.com> --- fs/open.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)