1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
id = 1507
title = "export/fuse/fuse.c:fuse_fallocate does not do anything but returns success"
state = "closed"
created_at = "2023-02-25T12:51:18.814Z"
closed_at = "2023-03-12T17:41:43.529Z"
labels = ["Storage"]
url = "https://gitlab.com/qemu-project/qemu/-/issues/1507"
host-os = "Arch Linux"
host-arch = "x86_64"
qemu-version = "QEMU emulator version 7.2.0"
guest-os = "n/a"
guest-arch = "n/a"
description = """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"""
reproduce = """```sh
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
```"""
additional = "n/a"
|