mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-28 07:14:30 +02:00
8202261: (fc) FileChannel.map and RandomAccessFile.setLength should not preallocate space
Reviewed-by: bpb
This commit is contained in:
parent
ccc74fdd60
commit
2df7aa7b9f
9 changed files with 101 additions and 144 deletions
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2001, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2001, 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
|
||||
|
@ -232,25 +232,6 @@ jint
|
|||
handleSetLength(FD fd, jlong length)
|
||||
{
|
||||
int result;
|
||||
#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 sb;
|
||||
|
||||
if (fstat64(fd, &sb) == 0 && length > sb.st_blocks*512) {
|
||||
RESTARTABLE(fallocate64(fd, 0, 0, length), result);
|
||||
// Return on success or if errno is neither EOPNOTSUPP nor ENOSYS
|
||||
if (result == 0) {
|
||||
return 0;
|
||||
} else if (errno != EOPNOTSUPP && errno != ENOSYS) {
|
||||
return result;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
RESTARTABLE(ftruncate64(fd, length), result);
|
||||
return result;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue