Blame SOURCES/nodejs-revert-statx.patch

27dddf
Subject: [PATCH] Revert "linux: use statx() to obtain file birth time"
27dddf
27dddf
This reverts libuv commit 19d8eb0c92fda8931b14d2daac71a0644ebe4695.
27dddf
---
27dddf
 src/unix/fs.c             | 80 ---------------------------------------
27dddf
 src/unix/linux-syscalls.c | 28 --------------
27dddf
 src/unix/linux-syscalls.h | 35 -----------------
27dddf
 3 files changed, 143 deletions(-)
27dddf
27dddf
statx() is available on kernel 4.11 and later, so reverting this change for
27dddf
older kernel.
27dddf
27dddf
Resolves: #1759152
27dddf
27dddf
Node.js issue for this bug:
27dddf
https://github.com/nodejs/node/issues/29916
27dddf
27dddf
Node.js Upstream PR that caused the regression:
27dddf
https://github.com/nodejs/node/pull/26707
27dddf
27dddf
Node.js Upstrema commit that caused the regression:
27dddf
https://github.com/nodejs/node/commit/7e5ef4a0e1
27dddf
27dddf
libuv upstream PR that caused the regression:
27dddf
https://github.com/libuv/libuv/pull/2184
27dddf
27dddf
libuv upstream commit that caused the regression:
27dddf
https://github.com/libuv/libuv/commit/19d8eb0c
27dddf
27dddf
diff -rup node-v10.16.3-orig/deps/uv/src/unix/fs.c node-v10.16.3/deps/uv/src/unix/fs.c
27dddf
--- node-v10.16.3-orig/deps/uv/src/unix/fs.c	2019-10-10 00:18:43.056277041 +0200
27dddf
+++ node-v10.16.3/deps/uv/src/unix/fs.c	2019-10-10 00:19:52.295021237 +0200
27dddf
@@ -1105,82 +1105,10 @@ static void uv__to_stat(struct stat* src
27dddf
 }
27dddf
 
27dddf
 
27dddf
-static int uv__fs_statx(int fd,
27dddf
-                        const char* path,
27dddf
-                        int is_fstat,
27dddf
-                        int is_lstat,
27dddf
-                        uv_stat_t* buf) {
27dddf
-  STATIC_ASSERT(UV_ENOSYS != -1);
27dddf
-#ifdef __linux__
27dddf
-  static int no_statx;
27dddf
-  struct uv__statx statxbuf;
27dddf
-  int dirfd;
27dddf
-  int flags;
27dddf
-  int mode;
27dddf
-  int rc;
27dddf
-
27dddf
-  if (no_statx)
27dddf
-    return UV_ENOSYS;
27dddf
-
27dddf
-  dirfd = AT_FDCWD;
27dddf
-  flags = 0; /* AT_STATX_SYNC_AS_STAT */
27dddf
-  mode = 0xFFF; /* STATX_BASIC_STATS + STATX_BTIME */
27dddf
-
27dddf
-  if (is_fstat) {
27dddf
-    dirfd = fd;
27dddf
-    flags |= 0x1000; /* AT_EMPTY_PATH */
27dddf
-  }
27dddf
-
27dddf
-  if (is_lstat)
27dddf
-    flags |= AT_SYMLINK_NOFOLLOW;
27dddf
-
27dddf
-  rc = uv__statx(dirfd, path, flags, mode, &statxbuf);
27dddf
-
27dddf
-  if (rc == -1) {
27dddf
-    /* EPERM happens when a seccomp filter rejects the system call.
27dddf
-     * Has been observed with libseccomp < 2.3.3 and docker < 18.04.
27dddf
-     */
27dddf
-    if (errno != EINVAL && errno != EPERM && errno != ENOSYS)
27dddf
-      return -1;
27dddf
-
27dddf
-    no_statx = 1;
27dddf
-    return UV_ENOSYS;
27dddf
-  }
27dddf
-
27dddf
-  buf->st_dev = 256 * statxbuf.stx_dev_major + statxbuf.stx_dev_minor;
27dddf
-  buf->st_mode = statxbuf.stx_mode;
27dddf
-  buf->st_nlink = statxbuf.stx_nlink;
27dddf
-  buf->st_uid = statxbuf.stx_uid;
27dddf
-  buf->st_gid = statxbuf.stx_gid;
27dddf
-  buf->st_rdev = statxbuf.stx_rdev_major;
27dddf
-  buf->st_ino = statxbuf.stx_ino;
27dddf
-  buf->st_size = statxbuf.stx_size;
27dddf
-  buf->st_blksize = statxbuf.stx_blksize;
27dddf
-  buf->st_blocks = statxbuf.stx_blocks;
27dddf
-  buf->st_atim.tv_sec = statxbuf.stx_atime.tv_sec;
27dddf
-  buf->st_atim.tv_nsec = statxbuf.stx_atime.tv_nsec;
27dddf
-  buf->st_mtim.tv_sec = statxbuf.stx_mtime.tv_sec;
27dddf
-  buf->st_mtim.tv_nsec = statxbuf.stx_mtime.tv_nsec;
27dddf
-  buf->st_ctim.tv_sec = statxbuf.stx_ctime.tv_sec;
27dddf
-  buf->st_ctim.tv_nsec = statxbuf.stx_ctime.tv_nsec;
27dddf
-  buf->st_birthtim.tv_sec = statxbuf.stx_btime.tv_sec;
27dddf
-  buf->st_birthtim.tv_nsec = statxbuf.stx_btime.tv_nsec;
27dddf
-
27dddf
-  return 0;
27dddf
-#else
27dddf
-  return UV_ENOSYS;
27dddf
-#endif /* __linux__ */
27dddf
-}
27dddf
-
27dddf
-
27dddf
 static int uv__fs_stat(const char *path, uv_stat_t *buf) {
27dddf
   struct stat pbuf;
27dddf
   int ret;
27dddf
 
27dddf
-  ret = uv__fs_statx(-1, path, /* is_fstat */ 0, /* is_lstat */ 0, buf);
27dddf
-  if (ret != UV_ENOSYS)
27dddf
-    return ret;
27dddf
-
27dddf
   ret = stat(path, &pbuf);
27dddf
   if (ret == 0)
27dddf
     uv__to_stat(&pbuf, buf);
27dddf
@@ -1193,10 +1121,6 @@ static int uv__fs_lstat(const char *path
27dddf
   struct stat pbuf;
27dddf
   int ret;
27dddf
 
27dddf
-  ret = uv__fs_statx(-1, path, /* is_fstat */ 0, /* is_lstat */ 1, buf);
27dddf
-  if (ret != UV_ENOSYS)
27dddf
-    return ret;
27dddf
-
27dddf
   ret = lstat(path, &pbuf);
27dddf
   if (ret == 0)
27dddf
     uv__to_stat(&pbuf, buf);
27dddf
@@ -1209,10 +1133,6 @@ static int uv__fs_fstat(int fd, uv_stat_
27dddf
   struct stat pbuf;
27dddf
   int ret;
27dddf
 
27dddf
-  ret = uv__fs_statx(fd, "", /* is_fstat */ 1, /* is_lstat */ 0, buf);
27dddf
-  if (ret != UV_ENOSYS)
27dddf
-    return ret;
27dddf
-
27dddf
   ret = fstat(fd, &pbuf);
27dddf
   if (ret == 0)
27dddf
     uv__to_stat(&pbuf, buf);
27dddf
Only in node-v10.16.3/deps/uv/src/unix: fs.c.orig
27dddf
diff -rup node-v10.16.3-orig/deps/uv/src/unix/linux-syscalls.c node-v10.16.3/deps/uv/src/unix/linux-syscalls.c
27dddf
--- node-v10.16.3-orig/deps/uv/src/unix/linux-syscalls.c	2019-10-10 00:18:43.057277051 +0200
27dddf
+++ node-v10.16.3/deps/uv/src/unix/linux-syscalls.c	2019-10-10 00:19:52.295021237 +0200
27dddf
@@ -187,21 +187,6 @@
27dddf
 # endif
27dddf
 #endif /* __NR_pwritev */
27dddf
 
27dddf
-#ifndef __NR_statx
27dddf
-# if defined(__x86_64__)
27dddf
-#  define __NR_statx 332
27dddf
-# elif defined(__i386__)
27dddf
-#  define __NR_statx 383
27dddf
-# elif defined(__aarch64__)
27dddf
-#  define __NR_statx 397
27dddf
-# elif defined(__arm__)
27dddf
-#  define __NR_statx (UV_SYSCALL_BASE + 397)
27dddf
-# elif defined(__ppc__)
27dddf
-#  define __NR_statx 383
27dddf
-# elif defined(__s390__)
27dddf
-#  define __NR_statx 379
27dddf
-# endif
27dddf
-#endif /* __NR_statx */
27dddf
 
27dddf
 int uv__accept4(int fd, struct sockaddr* addr, socklen_t* addrlen, int flags) {
27dddf
 #if defined(__i386__)
27dddf
@@ -350,17 +335,4 @@ int uv__dup3(int oldfd, int newfd, int f
27dddf
 #else
27dddf
   return errno = ENOSYS, -1;
27dddf
 #endif
27dddf
-}
27dddf
-
27dddf
-
27dddf
-int uv__statx(int dirfd,
27dddf
-              const char* path,
27dddf
-              int flags,
27dddf
-              unsigned int mask,
27dddf
-              struct uv__statx* statxbuf) {
27dddf
-#if defined(__NR_statx)
27dddf
-  return syscall(__NR_statx, dirfd, path, flags, mask, statxbuf);
27dddf
-#else
27dddf
-  return errno = ENOSYS, -1;
27dddf
-#endif
27dddf
 }
27dddf
diff -rup node-v10.16.3-orig/deps/uv/src/unix/linux-syscalls.h node-v10.16.3/deps/uv/src/unix/linux-syscalls.h
27dddf
--- node-v10.16.3-orig/deps/uv/src/unix/linux-syscalls.h	2019-10-10 00:18:43.057277051 +0200
27dddf
+++ node-v10.16.3/deps/uv/src/unix/linux-syscalls.h	2019-10-10 00:19:52.295021237 +0200
27dddf
@@ -80,36 +80,6 @@
27dddf
 #define UV__IN_DELETE_SELF    0x400
27dddf
 #define UV__IN_MOVE_SELF      0x800
27dddf
 
27dddf
-struct uv__statx_timestamp {
27dddf
-  int64_t tv_sec;
27dddf
-  uint32_t tv_nsec;
27dddf
-  int32_t unused0;
27dddf
-};
27dddf
-
27dddf
-struct uv__statx {
27dddf
-  uint32_t stx_mask;
27dddf
-  uint32_t stx_blksize;
27dddf
-  uint64_t stx_attributes;
27dddf
-  uint32_t stx_nlink;
27dddf
-  uint32_t stx_uid;
27dddf
-  uint32_t stx_gid;
27dddf
-  uint16_t stx_mode;
27dddf
-  uint16_t unused0;
27dddf
-  uint64_t stx_ino;
27dddf
-  uint64_t stx_size;
27dddf
-  uint64_t stx_blocks;
27dddf
-  uint64_t stx_attributes_mask;
27dddf
-  struct uv__statx_timestamp stx_atime;
27dddf
-  struct uv__statx_timestamp stx_btime;
27dddf
-  struct uv__statx_timestamp stx_ctime;
27dddf
-  struct uv__statx_timestamp stx_mtime;
27dddf
-  uint32_t stx_rdev_major;
27dddf
-  uint32_t stx_rdev_minor;
27dddf
-  uint32_t stx_dev_major;
27dddf
-  uint32_t stx_dev_minor;
27dddf
-  uint64_t unused1[14];
27dddf
-};
27dddf
-
27dddf
 struct uv__inotify_event {
27dddf
   int32_t wd;
27dddf
   uint32_t mask;
27dddf
@@ -143,10 +113,5 @@ int uv__sendmmsg(int fd,
27dddf
 ssize_t uv__preadv(int fd, const struct iovec *iov, int iovcnt, int64_t offset);
27dddf
 ssize_t uv__pwritev(int fd, const struct iovec *iov, int iovcnt, int64_t offset);
27dddf
 int uv__dup3(int oldfd, int newfd, int flags);
27dddf
-int uv__statx(int dirfd,
27dddf
-              const char* path,
27dddf
-              int flags,
27dddf
-              unsigned int mask,
27dddf
-              struct uv__statx* statxbuf);
27dddf
 
27dddf
 #endif /* UV_LINUX_SYSCALL_H_ */