< prev index next >
src/java.base/unix/native/libnio/ch/FileDispatcherImpl.c
Print this page
rev 16196 : 8168628: (fc) SIGBUS when extending file size to map it
Summary: Synchronize file extension and subsequent map0(); on Linux use fallocate64() instead of ftruncate64().
Reviewed-by: rehn, simonis, alanb
@@ -1,7 +1,7 @@
/*
- * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2016, 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
@@ -184,10 +184,35 @@
return handle(env,
ftruncate64(fdval(env, fdo), size),
"Truncation failed");
}
+JNIEXPORT jint JNICALL
+Java_sun_nio_ch_FileDispatcherImpl_allocate0(JNIEnv *env, jobject this,
+ jobject fdo, jlong size)
+{
+ jint fd = fdval(env, fdo);
+#if defined(__linux__)
+ /*
+ * On Linux, if the file size is being increased, then ftruncate64()
+ * will modify the metadata value of the size without actually allocating
+ * any blocks which can cause a SIGBUS error if the file is subsequently
+ * memory-mapped.
+ */
+ struct stat64 fbuf;
+
+ if (fstat64(fd, &fbuf) == 0 && size > fbuf.st_blocks*512) {
+ return handle(env,
+ fallocate64(fd, 0, 0, size),
+ "Allocation failed");
+ }
+#endif
+ return handle(env,
+ ftruncate64(fd, size),
+ "Truncation failed");
+}
+
JNIEXPORT jlong JNICALL
Java_sun_nio_ch_FileDispatcherImpl_size0(JNIEnv *env, jobject this, jobject fdo)
{
jint fd = fdval(env, fdo);
struct stat64 fbuf;
< prev index next >