[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 06/30] exec.c: do not truncate non-empty memory backe
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PULL 06/30] exec.c: do not truncate non-empty memory backend file |
Date: |
Tue, 1 Nov 2016 17:29:19 +0100 |
From: Haozhong Zhang <address@hidden>
For '-object memory-backend-file,mem-path=foo,size=xyz', if the size of
file 'foo' does not match the given size 'xyz', the current QEMU will
truncate the file to the given size, which may corrupt the existing data
in that file. To avoid such data corruption, this patch disables
truncating non-empty backend files.
Signed-off-by: Haozhong Zhang <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Paolo Bonzini <address@hidden>
---
exec.c | 22 +++++++++++++++++++++-
1 file changed, 21 insertions(+), 1 deletion(-)
diff --git a/exec.c b/exec.c
index a19ed21..f471e73 100644
--- a/exec.c
+++ b/exec.c
@@ -1229,6 +1229,15 @@ void qemu_mutex_unlock_ramlist(void)
}
#ifdef __linux__
+static int64_t get_file_size(int fd)
+{
+ int64_t size = lseek(fd, 0, SEEK_END);
+ if (size < 0) {
+ return -errno;
+ }
+ return size;
+}
+
static void *file_ram_alloc(RAMBlock *block,
ram_addr_t memory,
const char *path,
@@ -1240,6 +1249,7 @@ static void *file_ram_alloc(RAMBlock *block,
char *c;
void *area = MAP_FAILED;
int fd = -1;
+ int64_t file_size;
if (kvm_enabled() && !kvm_has_sync_mmu()) {
error_setg(errp,
@@ -1302,6 +1312,8 @@ static void *file_ram_alloc(RAMBlock *block,
}
#endif
+ file_size = get_file_size(fd);
+
if (memory < block->page_size) {
error_setg(errp, "memory size 0x" RAM_ADDR_FMT " must be equal to "
"or larger than page size 0x%zx",
@@ -1316,8 +1328,16 @@ static void *file_ram_alloc(RAMBlock *block,
* hosts, so don't bother bailing out on errors.
* If anything goes wrong with it under other filesystems,
* mmap will fail.
+ *
+ * Do not truncate the non-empty backend file to avoid corrupting
+ * the existing data in the file. Disabling shrinking is not
+ * enough. For example, the current vNVDIMM implementation stores
+ * the guest NVDIMM labels at the end of the backend file. If the
+ * backend file is later extended, QEMU will not be able to find
+ * those labels. Therefore, extending the non-empty backend file
+ * is disabled as well.
*/
- if (ftruncate(fd, memory)) {
+ if (!file_size && ftruncate(fd, memory)) {
perror("ftruncate");
}
--
2.7.4
- [Qemu-devel] [PULL v2 00/30] Misc patches for 2016-10-31, Paolo Bonzini, 2016/11/01
- [Qemu-devel] [PULL 01/30] checkpatch: tweak "struct should normally be const" warning, Paolo Bonzini, 2016/11/01
- [Qemu-devel] [PULL 02/30] nbd: Use CoQueue for free_sema instead of CoMutex, Paolo Bonzini, 2016/11/01
- [Qemu-devel] [PULL 04/30] tests: send error_report to test log, Paolo Bonzini, 2016/11/01
- [Qemu-devel] [PULL 03/30] qemu-error: remove dependency of stubs on monitor, Paolo Bonzini, 2016/11/01
- [Qemu-devel] [PULL 05/30] exec.c: ensure all AddressSpaceDispatch updates under RCU, Paolo Bonzini, 2016/11/01
- [Qemu-devel] [PULL 07/30] exec.c: check memory backend file size with 'size' option, Paolo Bonzini, 2016/11/01
- [Qemu-devel] [PULL 06/30] exec.c: do not truncate non-empty memory backend file,
Paolo Bonzini <=
- [Qemu-devel] [PULL 08/30] nbd: Add qemu-nbd -D for human-readable description, Paolo Bonzini, 2016/11/01
- [Qemu-devel] [PULL 10/30] nbd: Rename NBDRequest to NBDRequestData, Paolo Bonzini, 2016/11/01
- [Qemu-devel] [PULL 09/30] nbd: Treat flags vs. command type as separate fields, Paolo Bonzini, 2016/11/01
- [Qemu-devel] [PULL 13/30] nbd: Share common reply-sending code in server, Paolo Bonzini, 2016/11/01
- [Qemu-devel] [PULL 11/30] nbd: Rename NbdClientSession to NBDClientSession, Paolo Bonzini, 2016/11/01
- [Qemu-devel] [PULL 14/30] nbd: Send message along with server NBD_REP_ERR errors, Paolo Bonzini, 2016/11/01
- [Qemu-devel] [PULL 15/30] nbd: Share common option-sending code in client, Paolo Bonzini, 2016/11/01
- [Qemu-devel] [PULL 18/30] nbd: Less allocation during NBD_OPT_LIST, Paolo Bonzini, 2016/11/01
- [Qemu-devel] [PULL 17/30] nbd: Let client skip portions of server reply, Paolo Bonzini, 2016/11/01
- [Qemu-devel] [PULL 16/30] nbd: Let server know when client gives up negotiation, Paolo Bonzini, 2016/11/01