Skip to content

export/fuse/fuse.c:fuse_fallocate does not do anything but returns success

Host environment

  • Operating system: Arch Linux
  • OS/kernel version: 6.1.12-arch1-1
  • Architecture: x86_64
  • QEMU flavor: qemu-system-x86_64
  • QEMU version: QEMU emulator version 7.2.0
  • QEMU command line: qemu-storage-daemon --blockdev node-name=node0,driver=raw,file.driver=file,file.filename=/tmp/data --export type=fuse,id=node0-export,node-name=node0,mountpoint=/tmp/fuse_exp,writable=on

Description of problem

block/export/fuse.c:fuse_fallocate with FALLOC_FL_PUNCH_HOLE does not do anything even though it returns 0 (success). A later read incorrectly returns old data instead of zeros. Should probably return EOPNOTSUPP.

FALLOC_FL_PUNCH_HOLE:

Within the specified range, partial filesystem blocks are zeroed, and whole filesystem blocks are removed from the file. After a successful call, subsequent reads from this range will return zeros. https://man7.org/linux/man-pages/man2/fallocate.2.html

Steps to reproduce

touch /tmp/data /tmp/fuse_exp 
dd if=/dev/random of=/tmp/data count=1000 bs=1M
qemu-storage-daemon --blockdev node-name=node0,driver=raw,file.driver=file,file.filename=/tmp/data --export type=fuse,id=node0-export,node-name=node0,mountpoint=/tmp/fuse_exp,writable=on

hexdump /tmp/fuse_exp -n 16
# 0000000 4d5f db2d 57ab 02f6 f9c2 d2f1 0c1b 4b86
fallocate -l 1G --punch-hole /tmp/fuse_exp
echo $?
# 0
hexdump /tmp/fuse_exp -n 16
# 0000000 4d5f db2d 57ab 02f6 f9c2 d2f1 0c1b 4b86


hexdump /tmp/data -n 16
# 0000000 4d5f db2d 57ab 02f6 f9c2 d2f1 0c1b 4b86
fallocate -l 1G --punch-hole /tmp/data
hexdump /tmp/data -n 16
# 0000000 0000 0000 0000 0000 0000 0000 0000 0000

# sudo bpftrace -e 'uretprobe:/usr/bin/qemu-storage-daemon:blk_co_pdiscard { printf("ret=%d\n",retval); }'
# ret=0
# sudo bpftrace -e 'kretfunc:fuse_file_fallocate { printf("len=%d \t mode=%d ret=%d\n", args->length , args->mode,retval); }'
# len=1073741824   mode=3 ret=0
Edited by lukts30
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information