Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

8293121: (fs) Refactor UnixFileSystem copying into generic Unix, Linux, and BSD implementations #10093

Closed
wants to merge 4 commits into from
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
88 changes: 88 additions & 0 deletions src/java.base/linux/classes/sun/nio/fs/LinuxCopyFile.java
@@ -0,0 +1,88 @@
/*
* Copyright (c) 2022, 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
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/

package sun.nio.fs;

import java.nio.file.*;
import java.io.IOException;
import java.util.*;
import static sun.nio.fs.LinuxNativeDispatcher.*;
import static sun.nio.fs.UnixConstants.*;

/**
* Linux implementation of UnixCopyFile
*/

class LinuxCopyFile extends UnixCopyFile {
LinuxCopyFile() {
super();
}

@Override
protected void bufferedCopy(int dst, int src, long address,
int size, long addressToPollForCancel)
throws UnixException
{
int advice = POSIX_FADV_SEQUENTIAL | // sequential data access
POSIX_FADV_NOREUSE | // will access only once
POSIX_FADV_WILLNEED; // will access in near future
posix_fadvise(src, 0, 0, advice);

super.bufferedCopy(dst, src, address, size, addressToPollForCancel);
}

@Override
protected int directCopy(int dst, int src, long addressToPollForCancel)
throws UnixException
{
int advice = POSIX_FADV_SEQUENTIAL | // sequential data access
POSIX_FADV_NOREUSE | // will access only once
POSIX_FADV_WILLNEED; // will access in near future
posix_fadvise(src, 0, 0, advice);

return directCopy0(dst, src, addressToPollForCancel);
}

// -- native methods --

/**
* Copies data between file descriptors {@code src} and {@code dst} using
* a platform-specific function or system call possibly having kernel
* support.
*
* @param dst destination file descriptor
* @param src source file descriptor
* @param addressToPollForCancel address to check for cancellation
* (a non-zero value written to this address indicates cancel)
*
* @return 0 on success, UNAVAILABLE if the platform function would block,
* UNSUPPORTED_CASE if the call does not work with the given
* parameters, or UNSUPPORTED if direct copying is not supported
* on this platform
*/
private static native int directCopy0(int dst, int src,
long addressToPollForCancel)
throws UnixException;
}
15 changes: 9 additions & 6 deletions src/java.base/linux/classes/sun/nio/fs/LinuxFileSystem.java
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2008, 2019, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2008, 2022, 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
Expand All @@ -25,9 +25,14 @@

package sun.nio.fs;

import java.nio.file.*;
import java.nio.file.FileStore;
import java.nio.file.WatchService;
import java.io.IOException;
import java.util.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import static sun.nio.fs.LinuxNativeDispatcher.*;

/**
Expand All @@ -36,7 +41,7 @@

class LinuxFileSystem extends UnixFileSystem {
LinuxFileSystem(UnixFileSystemProvider provider, String dir) {
super(provider, dir);
super(provider, dir, new LinuxCopyFile());
}

@Override
Expand Down Expand Up @@ -121,8 +126,6 @@ List<UnixMountEntry> getMountEntries() {
return getMountEntries("/etc/mtab");
}



@Override
FileStore getFileStore(UnixMountEntry entry) throws IOException {
return new LinuxFileStore(this, entry);
Expand Down
Expand Up @@ -62,6 +62,12 @@ static native int getmntent0(long fp, UnixMountEntry entry, long buffer, int buf
*/
static native void endmntent(long stream) throws UnixException;

/**
* int posix_fadvise(int fd, off_t offset, off_t len, int advice);
*/
static native int posix_fadvise(int fd, long offset, long len, int advice)
throws UnixException;

// initialize
private static native void init();

Expand Down
94 changes: 94 additions & 0 deletions src/java.base/linux/native/libnio/fs/LinuxCopyFile.c
@@ -0,0 +1,94 @@
/*
* Copyright (c) 2022, 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
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/

#include "jni.h"
#include "jni_util.h"
#include "jlong.h"

#include "nio.h"

#include <stdlib.h>
#include <unistd.h>
#include <errno.h>

#include <sys/sendfile.h>
#include <fcntl.h>

#include "sun_nio_fs_LinuxCopyFile.h"

#define RESTARTABLE(_cmd, _result) do { \
do { \
_result = _cmd; \
} while((_result == -1) && (errno == EINTR)); \
} while(0)

static void throwUnixException(JNIEnv* env, int errnum) {
jobject x = JNU_NewObjectByName(env, "sun/nio/fs/UnixException",
"(I)V", errnum);
if (x != NULL) {
(*env)->Throw(env, x);
}
}

// Copy all bytes from src to dst, within the kernel if possible,
// and return zero, otherwise return the appropriate status code.
//
// Return value
// 0 on success
// IOS_UNAVAILABLE if the platform function would block
// IOS_UNSUPPORTED_CASE if the call does not work with the given parameters
// IOS_UNSUPPORTED if direct copying is not supported on this platform
// IOS_THROWN if a Java exception is thrown
//
JNIEXPORT jint JNICALL
Java_sun_nio_fs_LinuxCopyFile_directCopy0
(JNIEnv* env, jclass this, jint dst, jint src, jlong cancelAddress)
{
volatile jint* cancel = (jint*)jlong_to_ptr(cancelAddress);

// Transfer within the kernel
const size_t count = cancel != NULL ?
1048576 : // 1 MB to give cancellation a chance
0x7ffff000; // maximum number of bytes that sendfile() can transfer
ssize_t bytes_sent;

do {
RESTARTABLE(sendfile64(dst, src, NULL, count), bytes_sent);
if (bytes_sent < 0) {
if (errno == EAGAIN)
return IOS_UNAVAILABLE;
if (errno == EINVAL || errno == ENOSYS)
return IOS_UNSUPPORTED_CASE;
throwUnixException(env, errno);
return IOS_THROWN;
}
if (cancel != NULL && *cancel != 0) {
throwUnixException(env, ECANCELED);
return IOS_THROWN;
}
} while (bytes_sent > 0);

return 0;
}
12 changes: 10 additions & 2 deletions src/java.base/linux/native/libnio/fs/LinuxNativeDispatcher.c
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2008, 2019, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2008, 2022, 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
Expand Down Expand Up @@ -33,6 +33,7 @@
#include <dlfcn.h>
#include <errno.h>
#include <mntent.h>
#include <fcntl.h>

#include "sun_nio_fs_LinuxNativeDispatcher.h"

Expand Down Expand Up @@ -139,6 +140,13 @@ JNIEXPORT void JNICALL
Java_sun_nio_fs_LinuxNativeDispatcher_endmntent(JNIEnv* env, jclass this, jlong stream)
{
FILE* fp = jlong_to_ptr(stream);
/* FIXME - man page doesn't explain how errors are returned */
// The endmntent() function always returns 1.
endmntent(fp);
}

JNIEXPORT jint JNICALL
Java_sun_nio_fs_LinuxNativeDispatcher_posix_1fadvise(JNIEnv* env, jclass this,
jint fd, jlong offset, jlong len, jint advice)
{
return posix_fadvise((int)fd, (off_t)offset, (off_t)len, (int)advice);
bplb marked this conversation as resolved.
Show resolved Hide resolved
}
50 changes: 50 additions & 0 deletions src/java.base/macosx/classes/sun/nio/fs/BsdCopyFile.java
@@ -0,0 +1,50 @@
/*
* Copyright (c) 2022, 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
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/

package sun.nio.fs;

/**
* Bsd implementation of UnixCopyFile
*/

class BsdCopyFile extends UnixCopyFile {

BsdCopyFile() {
super();
}

@Override
protected int directCopy(int dst, int src, long addressToPollForCancel)
throws UnixException
{
return directCopy0(dst, src, addressToPollForCancel);
}

// -- native methods --

private static native int directCopy0(int dst, int src,
long addressToPollForCancel)
throws UnixException;
}
12 changes: 8 additions & 4 deletions src/java.base/macosx/classes/sun/nio/fs/BsdFileSystem.java
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2008, 2022, 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
Expand All @@ -25,10 +25,14 @@

package sun.nio.fs;

import java.nio.file.*;
import java.io.IOException;
import java.util.*;
import java.nio.file.FileStore;
import java.nio.file.WatchService;
import java.security.AccessController;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import sun.security.action.GetPropertyAction;

/**
Expand All @@ -38,7 +42,7 @@
class BsdFileSystem extends UnixFileSystem {

BsdFileSystem(UnixFileSystemProvider provider, String dir) {
super(provider, dir);
super(provider, dir, new BsdCopyFile());
}

@Override
Expand Down