From fe0eedac871a01a1cf71c87ead343fc69aa5d0fb Mon Sep 17 00:00:00 2001 From: Brian Burkhalter Date: Thu, 13 Nov 2025 10:46:16 -0800 Subject: [PATCH 1/4] 8371689: (fs) CopyMoveHelper.copyToForeignTarget use of sourcePosixView is confusing --- .../classes/java/nio/file/CopyMoveHelper.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/java.base/share/classes/java/nio/file/CopyMoveHelper.java b/src/java.base/share/classes/java/nio/file/CopyMoveHelper.java index 357e200e930f4..756818e61d04a 100644 --- a/src/java.base/share/classes/java/nio/file/CopyMoveHelper.java +++ b/src/java.base/share/classes/java/nio/file/CopyMoveHelper.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,6 +27,7 @@ import java.io.InputStream; import java.io.IOException; +import java.nio.file.FileStore; import java.nio.file.attribute.BasicFileAttributes; import java.nio.file.attribute.BasicFileAttributeView; import java.nio.file.attribute.PosixFileAttributes; @@ -109,17 +110,19 @@ static void copyToForeignTarget(Path source, Path target, LinkOption[] linkOptions = (opts.followLinks) ? new LinkOption[0] : new LinkOption[] { LinkOption.NOFOLLOW_LINKS }; - // retrieve source posix view, null if unsupported - final PosixFileAttributeView sourcePosixView = - Files.getFileAttributeView(source, PosixFileAttributeView.class); + FileSystemProvider provider = source.getFileSystem().provider(); + + // retrieve whether source posix view is supported + FileStore fileStore = provider.getFileStore(source); + boolean sourceSupportsPosixFileAttributeView = + fileStore.supportsFileAttributeView(PosixFileAttributeView.class); // attributes of source file BasicFileAttributes sourceAttrs = null; - if (sourcePosixView != null) { + if (sourceSupportsPosixFileAttributeView) sourceAttrs = Files.readAttributes(source, PosixFileAttributes.class, linkOptions); - } if (sourceAttrs == null) sourceAttrs = Files.readAttributes(source, BasicFileAttributes.class, @@ -130,7 +133,6 @@ static void copyToForeignTarget(Path source, Path target, throw new IOException("Copying of symbolic links not supported"); // ensure source can be copied - FileSystemProvider provider = source.getFileSystem().provider(); provider.checkAccess(source, AccessMode.READ); // delete target if it exists and REPLACE_EXISTING is specified @@ -151,7 +153,7 @@ else if (Files.exists(target)) // copy basic and, if supported, POSIX attributes to target if (opts.copyAttributes) { BasicFileAttributeView targetView = null; - if (sourcePosixView != null) { + if (sourceSupportsPosixFileAttributeView) { targetView = Files.getFileAttributeView(target, PosixFileAttributeView.class); } From bebf4a5b942b648fe5c10b851b0c3df43eb660b4 Mon Sep 17 00:00:00 2001 From: Brian Burkhalter Date: Thu, 13 Nov 2025 16:13:18 -0800 Subject: [PATCH 2/4] 8371689: Remove use of FileStore --- .../classes/java/nio/file/CopyMoveHelper.java | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/java.base/share/classes/java/nio/file/CopyMoveHelper.java b/src/java.base/share/classes/java/nio/file/CopyMoveHelper.java index 756818e61d04a..1300034fdb87f 100644 --- a/src/java.base/share/classes/java/nio/file/CopyMoveHelper.java +++ b/src/java.base/share/classes/java/nio/file/CopyMoveHelper.java @@ -27,7 +27,6 @@ import java.io.InputStream; import java.io.IOException; -import java.nio.file.FileStore; import java.nio.file.attribute.BasicFileAttributes; import java.nio.file.attribute.BasicFileAttributeView; import java.nio.file.attribute.PosixFileAttributes; @@ -110,29 +109,28 @@ static void copyToForeignTarget(Path source, Path target, LinkOption[] linkOptions = (opts.followLinks) ? new LinkOption[0] : new LinkOption[] { LinkOption.NOFOLLOW_LINKS }; - FileSystemProvider provider = source.getFileSystem().provider(); - - // retrieve whether source posix view is supported - FileStore fileStore = provider.getFileStore(source); - boolean sourceSupportsPosixFileAttributeView = - fileStore.supportsFileAttributeView(PosixFileAttributeView.class); - // attributes of source file + boolean sourceSupportsPosixAttributes = false; BasicFileAttributes sourceAttrs = null; - if (sourceSupportsPosixFileAttributeView) + try { sourceAttrs = Files.readAttributes(source, PosixFileAttributes.class, linkOptions); - if (sourceAttrs == null) + sourceSupportsPosixAttributes = true; + } catch (UnsupportedOperationException x) { + // posix attributes not supported sourceAttrs = Files.readAttributes(source, BasicFileAttributes.class, linkOptions); + } + assert sourceAttrs != null; if (sourceAttrs.isSymbolicLink()) throw new IOException("Copying of symbolic links not supported"); // ensure source can be copied + FileSystemProvider provider = source.getFileSystem().provider(); provider.checkAccess(source, AccessMode.READ); // delete target if it exists and REPLACE_EXISTING is specified @@ -153,7 +151,7 @@ else if (Files.exists(target)) // copy basic and, if supported, POSIX attributes to target if (opts.copyAttributes) { BasicFileAttributeView targetView = null; - if (sourceSupportsPosixFileAttributeView) { + if (sourceSupportsPosixAttributes) { targetView = Files.getFileAttributeView(target, PosixFileAttributeView.class); } From ad2908486777f28f93cffd4b2c4af8b705e0629e Mon Sep 17 00:00:00 2001 From: Brian Burkhalter Date: Fri, 14 Nov 2025 09:20:45 -0800 Subject: [PATCH 3/4] 8371689: Determine posix attributes support based on the view being retrievable --- .../share/classes/java/nio/file/CopyMoveHelper.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/java.base/share/classes/java/nio/file/CopyMoveHelper.java b/src/java.base/share/classes/java/nio/file/CopyMoveHelper.java index 1300034fdb87f..67c7ac2d332bc 100644 --- a/src/java.base/share/classes/java/nio/file/CopyMoveHelper.java +++ b/src/java.base/share/classes/java/nio/file/CopyMoveHelper.java @@ -109,20 +109,20 @@ static void copyToForeignTarget(Path source, Path target, LinkOption[] linkOptions = (opts.followLinks) ? new LinkOption[0] : new LinkOption[] { LinkOption.NOFOLLOW_LINKS }; + // determine whether the source supports posix attributes + boolean sourceSupportsPosixAttributes = Files.getFileAttributeView + (source, PosixFileAttributeView.class) != null; + // attributes of source file - boolean sourceSupportsPosixAttributes = false; BasicFileAttributes sourceAttrs = null; - try { + if (sourceSupportsPosixAttributes) sourceAttrs = Files.readAttributes(source, PosixFileAttributes.class, linkOptions); - sourceSupportsPosixAttributes = true; - } catch (UnsupportedOperationException x) { - // posix attributes not supported + if (sourceAttrs == null) sourceAttrs = Files.readAttributes(source, BasicFileAttributes.class, linkOptions); - } assert sourceAttrs != null; From e76d29841e99fb5ffa8dd4a59af36aadbd2ce353 Mon Sep 17 00:00:00 2001 From: Brian Burkhalter Date: Fri, 14 Nov 2025 10:18:48 -0800 Subject: [PATCH 4/4] 8371689: Simplify conditional --- src/java.base/share/classes/java/nio/file/CopyMoveHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java.base/share/classes/java/nio/file/CopyMoveHelper.java b/src/java.base/share/classes/java/nio/file/CopyMoveHelper.java index 67c7ac2d332bc..4e5bd7ebba1a4 100644 --- a/src/java.base/share/classes/java/nio/file/CopyMoveHelper.java +++ b/src/java.base/share/classes/java/nio/file/CopyMoveHelper.java @@ -119,7 +119,7 @@ static void copyToForeignTarget(Path source, Path target, sourceAttrs = Files.readAttributes(source, PosixFileAttributes.class, linkOptions); - if (sourceAttrs == null) + else sourceAttrs = Files.readAttributes(source, BasicFileAttributes.class, linkOptions);