8230085: (fs) FileStore::isReadOnly is always true on macOS Catalina

Reviewed-by: alanb
This commit is contained in:
Brian Burkhalter 2019-09-13 16:03:31 -07:00
parent c0e1f9ee6c
commit c57ad7ffc0
4 changed files with 44 additions and 17 deletions

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2008, 2019, 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
@ -62,22 +62,14 @@ class BsdFileStore
}
// step 2: find mount point
UnixPath parent = path.getParent();
while (parent != null) {
UnixFileAttributes attrs = null;
try {
attrs = UnixFileAttributes.get(parent, true);
} catch (UnixException x) {
x.rethrowAsIOException(parent);
}
if (attrs.dev() != dev())
break;
path = parent;
parent = parent.getParent();
byte[] dir = null;
try {
dir = BsdNativeDispatcher.getmntonname(path);
} catch (UnixException x) {
x.rethrowAsIOException(path);
}
// step 3: lookup mounted file systems
byte[] dir = path.asByteArray();
for (UnixMountEntry entry: fs.getMountEntries()) {
if (Arrays.equals(dir, entry.dir()))
return entry;

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2008, 2019, 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
@ -51,6 +51,20 @@ class BsdNativeDispatcher extends UnixNativeDispatcher {
*/
static native void endfsstat(long iter) throws UnixException;
/**
* int statfs(const char *path, struct statfs *buf);
* returns buf->f_mntonname (directory on which mounted)
*/
static byte[] getmntonname(UnixPath path) throws UnixException {
NativeBuffer pathBuffer = copyToNativeBuffer(path);
try {
return getmntonname0(pathBuffer.address());
} finally {
pathBuffer.release();
}
}
static native byte[] getmntonname0(long pathAddress) throws UnixException;
// initialize field IDs
private static native void initIDs();

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2008, 2019, 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
@ -203,3 +203,24 @@ Java_sun_nio_fs_BsdNativeDispatcher_endfsstat(JNIEnv* env, jclass this, jlong va
free(iter);
}
}
JNIEXPORT jbyteArray JNICALL
Java_sun_nio_fs_BsdNativeDispatcher_getmntonname0(JNIEnv *env, jclass this,
jlong pathAddress)
{
struct statfs buf;
const char* path = (const char*)jlong_to_ptr(pathAddress);
if (statfs(path, &buf) != 0) {
throwUnixException(env, errno);
}
jsize len = strlen(buf.f_mntonname);
jbyteArray mntonname = (*env)->NewByteArray(env, len);
if (mntonname != NULL) {
(*env)->SetByteArrayRegion(env, mntonname, 0, len,
(jbyte*)buf.f_mntonname);
}
return mntonname;
}

View file

@ -33,7 +33,7 @@ class UnixNativeDispatcher {
protected UnixNativeDispatcher() { }
// returns a NativeBuffer containing the given path
private static NativeBuffer copyToNativeBuffer(UnixPath path) {
static NativeBuffer copyToNativeBuffer(UnixPath path) {
byte[] cstr = path.getByteArrayForSysCalls();
int size = cstr.length + 1;
NativeBuffer buffer = NativeBuffers.getNativeBufferFromCache(size);