For a mmeory backend file, e.g. -object memory-backend-file,mem-path=foo,size=SZ,... the size of the backend file 'foo' is specified by the 'size' option. If the specified size 'SZ' does not match the actual size of file 'foo', QEMU will truncate the backend file 'foo'. In certain usage scenarios (e.g. vNVDIMM), the truncation may corrupt the existing data in the file.
Patch 1 in this series avoids such data corruption by disabling truncating non-empty backend files. If a non-existing file, an empty file or a directory is specified by 'mem-path' option, QEMU will truncate the backend file to the size specified by 'size' option. Patch 2 adds an additional check to avoid creating a memory backend that can not be hold in the backend file. For a non-empty backend file, if its size is smaller than 'size' option, QEMU will report error. Patch 3 makes the option 'size' optional. It's to avoid the misusing of 'size' option. If the user is uncertain about the backend file size, they can skip the 'size' option and let QEMU use the actual file size. If a non-existing file, an empty file or a directory is specified by 'mem-path' option, the 'size' option is still needed. Changes since v1: * Fix errors in v1 patches. * Split truncation skip and size check into separate patches. * Do not error out for backend file whose size is unknown. * Only error out when file size is smaller than 'size' option. * Change the error handling path of file_backend_memory_alloc(). * Do not duplicate the setting of block->used_length/max_length in file_ram_alloc(). Haozhong Zhang (3): exec.c: do not truncate non-empty memory backend file exec.c: check memory backend file size with 'size' option hostmem-file: make option 'size' optional backends/hostmem-file.c | 28 ++++++++++++++++++------- exec.c | 56 +++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 65 insertions(+), 19 deletions(-) -- 2.10.1