src/java.base/unix/native/libnio/ch/FileDispatcherImpl.c
changeset 49897 117501815bed
parent 47428 d72d7d55c765
child 57826 bf4c808a4488
--- a/src/java.base/unix/native/libnio/ch/FileDispatcherImpl.c	Thu Apr 26 12:25:36 2018 +0530
+++ b/src/java.base/unix/native/libnio/ch/FileDispatcherImpl.c	Thu Apr 26 09:04:18 2018 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2018, 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
@@ -23,40 +23,42 @@
  * questions.
  */
 
-#include "jni.h"
-#include "jni_util.h"
-#include "jvm.h"
-#include "jlong.h"
-#include "sun_nio_ch_FileDispatcherImpl.h"
-#include "java_lang_Long.h"
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <fcntl.h>
 #include <sys/uio.h>
 #include <unistd.h>
+#include <sys/stat.h>
 #include <sys/statvfs.h>
+
 #if defined(__linux__)
 #include <linux/fs.h>
 #include <sys/ioctl.h>
 #endif
-#include "nio.h"
-#include "nio_util.h"
 
-#ifdef _ALLBSD_SOURCE
+#if defined(_ALLBSD_SOURCE)
+#define lseek64 lseek
 #define stat64 stat
 #define flock64 flock
 #define off64_t off_t
 #define F_SETLKW64 F_SETLKW
 #define F_SETLK64 F_SETLK
-
 #define pread64 pread
 #define pwrite64 pwrite
 #define ftruncate64 ftruncate
 #define fstat64 fstat
-
 #define fdatasync fsync
 #endif
 
+#include "jni.h"
+#include "jni_util.h"
+#include "jvm.h"
+#include "jlong.h"
+#include "nio.h"
+#include "nio_util.h"
+#include "sun_nio_ch_FileDispatcherImpl.h"
+#include "java_lang_Long.h"
+
 static int preCloseFD = -1;     /* File descriptor to which we dup other fd's
                                    before closing them for real */
 
@@ -142,6 +144,20 @@
     return IOS_THROWN;
 }
 
+JNIEXPORT jlong JNICALL
+Java_sun_nio_ch_FileDispatcherImpl_seek0(JNIEnv *env, jclass clazz,
+                                         jobject fdo, jlong offset)
+{
+    jint fd = fdval(env, fdo);
+    off64_t result;
+    if (offset < 0) {
+        result = lseek64(fd, 0, SEEK_CUR);
+    } else {
+        result = lseek64(fd, offset, SEEK_SET);
+    }
+    return handle(env, (jlong)result, "lseek64 failed");
+}
+
 JNIEXPORT jint JNICALL
 Java_sun_nio_ch_FileDispatcherImpl_force0(JNIEnv *env, jobject this,
                                           jobject fdo, jboolean md)
@@ -187,30 +203,6 @@
                   "Truncation failed");
 }
 
-JNIEXPORT jint JNICALL
-Java_sun_nio_ch_FileDispatcherImpl_allocate0(JNIEnv *env, jobject this,
-                                             jobject fdo, jlong size)
-{
-#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.
-     */
-    // Return on success or if errno is neither EOPNOTSUPP nor ENOSYS
-    int result = fallocate64(fdval(env, fdo), 0, 0, size);
-    if (result == 0) {
-        return 0;
-    } else if (errno != EOPNOTSUPP && errno != ENOSYS) {
-        return handle(env, result, "Allocation failed");
-    }
-#endif
-    return handle(env,
-                  ftruncate64(fdval(env, fdo), size),
-                  "Truncation failed");
-}
-
 JNIEXPORT jlong JNICALL
 Java_sun_nio_ch_FileDispatcherImpl_size0(JNIEnv *env, jobject this, jobject fdo)
 {