sysdeps/posix/posix_fallocate*: Make emulated posix_fallocate() work properly
Commit Message
Emulated posix_fallocate() only writes data in one block if block
size is 4096, offset is 4095 and len is 2. The emulated code should
write data in two blocks in the case because it actually crosses two
blocks.
Signed-off-by: Xiao Yang <yangx.jy@cn.fujitsu.com>
---
sysdeps/posix/posix_fallocate.c | 14 ++++++++++++++
sysdeps/posix/posix_fallocate64.c | 14 ++++++++++++++
2 files changed, 28 insertions(+)
Comments
On 2020/1/14 20:53, Xiao Yang wrote:
> Emulated posix_fallocate() only writes data in one block if block
> size is 4096, offset is 4095 and len is 2. The emulated code should
> write data in two blocks in the case because it actually crosses two
> blocks.
>
Hi,
Please ignore this patch because there are some issues on it.
I will send v2 patch shortly.
Thanks,
Xiao Yang
@@ -93,6 +93,20 @@ posix_fallocate (int fd, __off_t offset, __off_t len)
increment = 4096;
}
+ if (offset % increment + len % increment > increment)
+ {
+ if (offset < st.st_size)
+ {
+ unsigned char b;
+ ssize_t rdsize = __pread (fd, &b, 1, offset);
+ if (rdsize < 0)
+ return errno;
+ } else {
+ if (__pwrite (fd, "", 1, offset) != 1)
+ return errno;
+ }
+ }
+
/* Write a null byte to every block. This is racy; we currently
lack a better option. Compare-and-swap against a file mapping
might additional local races, but requires interposition of a
@@ -93,6 +93,20 @@ __posix_fallocate64_l64 (int fd, __off64_t offset, __off64_t len)
increment = 4096;
}
+ if (offset % increment + len % increment > increment)
+ {
+ if (offset < st.st_size)
+ {
+ unsigned char b;
+ ssize_t rdsize = __pread (fd, &b, 1, offset);
+ if (rdsize < 0)
+ return errno;
+ } else {
+ if (__pwrite (fd, "", 1, offset) != 1)
+ return errno;
+ }
+ }
+
/* Write a null byte to every block. This is racy; we currently
lack a better option. Compare-and-swap against a file mapping
might address local races, but requires interposition of a signal