src/java.base/unix/classes/sun/nio/fs/UnixFileAttributeViews.java
changeset 57568 460ac76019f4
parent 54692 22866513a80e
--- a/src/java.base/unix/classes/sun/nio/fs/UnixFileAttributeViews.java	Mon Jul 29 10:34:20 2019 -0400
+++ b/src/java.base/unix/classes/sun/nio/fs/UnixFileAttributeViews.java	Mon Jul 29 08:48:52 2019 -0700
@@ -73,6 +73,7 @@
 
             boolean haveFd = false;
             boolean useFutimes = false;
+            boolean useFutimens = false;
             boolean useLutimes = false;
             int fd = -1;
             try {
@@ -84,7 +85,9 @@
                     fd = file.openForAttributeAccess(followLinks);
                     if (fd != -1) {
                         haveFd = true;
-                        useFutimes = futimesSupported();
+                        if (!(useFutimens = futimensSupported())) {
+                            useFutimes = futimesSupported();
+                        }
                     }
                 }
             } catch (UnixException x) {
@@ -112,13 +115,17 @@
                     }
                 }
 
-                // uptime times
-                long modValue = lastModifiedTime.to(TimeUnit.MICROSECONDS);
-                long accessValue= lastAccessTime.to(TimeUnit.MICROSECONDS);
+                // update times
+                TimeUnit timeUnit = useFutimens ?
+                    TimeUnit.NANOSECONDS : TimeUnit.MICROSECONDS;
+                long modValue = lastModifiedTime.to(timeUnit);
+                long accessValue= lastAccessTime.to(timeUnit);
 
                 boolean retry = false;
                 try {
-                    if (useFutimes) {
+                    if (useFutimens) {
+                        futimens(fd, accessValue, modValue);
+                    } else if (useFutimes) {
                         futimes(fd, accessValue, modValue);
                     } else if (useLutimes) {
                         lutimes(file, accessValue, modValue);
@@ -139,7 +146,9 @@
                     if (modValue < 0L) modValue = 0L;
                     if (accessValue < 0L) accessValue= 0L;
                     try {
-                        if (useFutimes) {
+                        if (useFutimens) {
+                            futimens(fd, accessValue, modValue);
+                        } else if (useFutimes) {
                             futimes(fd, accessValue, modValue);
                         } else if (useLutimes) {
                             lutimes(file, accessValue, modValue);