utimensat: AT_EMPTY_PATH support
authorMiklos Szeredi <mszeredi@redhat.com>
Thu, 14 May 2020 14:44:24 +0000 (16:44 +0200)
committerMiklos Szeredi <mszeredi@redhat.com>
Thu, 14 May 2020 14:44:24 +0000 (16:44 +0200)
This makes it possible to use utimensat on an O_PATH file (including
symlinks).

It supersedes the nonstandard utimensat(fd, NULL, ...) form.

Cc: linux-api@vger.kernel.org
Cc: linux-man@vger.kernel.org
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
fs/utimes.c

index 1d17ce9..b7b9275 100644 (file)
@@ -95,13 +95,13 @@ long do_utimes(int dfd, const char __user *filename, struct timespec64 *times,
                goto out;
        }
 
-       if (flags & ~AT_SYMLINK_NOFOLLOW)
+       if (flags & ~(AT_SYMLINK_NOFOLLOW | AT_EMPTY_PATH))
                goto out;
 
        if (filename == NULL && dfd != AT_FDCWD) {
                struct fd f;
 
-               if (flags & AT_SYMLINK_NOFOLLOW)
+               if (flags)
                        goto out;
 
                f = fdget(dfd);
@@ -117,6 +117,8 @@ long do_utimes(int dfd, const char __user *filename, struct timespec64 *times,
 
                if (!(flags & AT_SYMLINK_NOFOLLOW))
                        lookup_flags |= LOOKUP_FOLLOW;
+               if (flags & AT_EMPTY_PATH)
+                       lookup_flags |= LOOKUP_EMPTY;
 retry:
                error = user_path_at(dfd, filename, lookup_flags, &path);
                if (error)