Skip to content

Commit

Permalink
system/physmem: take into account fd_offset for file fallocate
Browse files Browse the repository at this point in the history
Punching a hole in a file with fallocate needs to take into account the
fd_offset value for a correct file location.
But guest_memfd internal use doesn't currently consider fd_offset.

Fixes: 4b870dc ("hostmem-file: add offset option")

Signed-off-by: William Roche <william.roche@oracle.com>
  • Loading branch information
RocheWilliam authored and GitHub Actions Bot committed Jan 21, 2025
1 parent d6430c1 commit ca7611a
Showing 1 changed file with 5 additions and 3 deletions.
8 changes: 5 additions & 3 deletions system/physmem.c
Original file line number Diff line number Diff line change
Expand Up @@ -3655,6 +3655,7 @@ int ram_block_discard_range(RAMBlock *rb, uint64_t start, size_t length)
need_madvise = (rb->page_size == qemu_real_host_page_size());
need_fallocate = rb->fd != -1;
if (need_fallocate) {
uint64_t file_offset = start + rb->fd_offset;
/* For a file, this causes the area of the file to be zero'd
* if read, and for hugetlbfs also causes it to be unmapped
* so a userfault will trigger.
Expand Down Expand Up @@ -3689,18 +3690,18 @@ int ram_block_discard_range(RAMBlock *rb, uint64_t start, size_t length)
}

ret = fallocate(rb->fd, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE,
start, length);
file_offset, length);
if (ret) {
ret = -errno;
error_report("%s: Failed to fallocate %s:%" PRIx64 " +%zx (%d)",
__func__, rb->idstr, start, length, ret);
__func__, rb->idstr, file_offset, length, ret);
goto err;
}
#else
ret = -ENOSYS;
error_report("%s: fallocate not available/file"
"%s:%" PRIx64 " +%zx (%d)",
__func__, rb->idstr, start, length, ret);
__func__, rb->idstr, file_offset, length, ret);
goto err;
#endif
}
Expand Down Expand Up @@ -3747,6 +3748,7 @@ int ram_block_discard_guest_memfd_range(RAMBlock *rb, uint64_t start,
int ret = -1;

#ifdef CONFIG_FALLOCATE_PUNCH_HOLE
/* ignore fd_offset with guest_memfd */
ret = fallocate(rb->guest_memfd, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE,
start, length);

Expand Down

0 comments on commit ca7611a

Please sign in to comment.