[PATCH v3 0/6] 9pfs: Fix ftruncate-after-unlink

Greg Kurz posted 6 patches 2 weeks, 6 days ago
fsdev/file-op-9p.h                    |  5 +++
hw/9pfs/9p-local.c                    | 49 ++++++++++++++++++++-------
hw/9pfs/9p-synth.c                    | 22 ++++++++++++
hw/9pfs/9p-util.h                     |  1 +
hw/9pfs/9p.c                          | 21 +++++++++---
hw/9pfs/cofs.c                        | 37 ++++++++++++++++++++
hw/9pfs/coth.h                        |  4 +++
tests/qtest/libqos/virtio-9p-client.c | 49 +++++++++++++++++++++++++++
tests/qtest/libqos/virtio-9p-client.h | 34 +++++++++++++++++++
tests/qtest/virtio-9p-test.c          | 15 ++++++++
10 files changed, 219 insertions(+), 18 deletions(-)
[PATCH v3 0/6] 9pfs: Fix ftruncate-after-unlink
Posted by Greg Kurz 2 weeks, 6 days ago
QEMU 9.2 already fixed the long standing limitation of failing fstat() on
unlinked files. This series does something similar for ftruncate().

The following program can be straced inside the guest with a shared fs in
passthrough mode over 9p2000.L.

int main(void)
{
	struct stat st;
	int fd = creat("./foo", 0000);

	ftruncate(fd, 100);
	unlink("./foo");
	ftruncate(fd, 1000);
}

Before :

creat("./foo", 000)                     = 3
ftruncate(3, 100)                       = -1 EACCES (Permission denied)
unlink("./foo")                         = 0
ftruncate(3, 1000)                      = -1 ENOENT (No such file or directory)

After :

creat("./foo", 000)                     = 3
ftruncate(3, 100)                       = 0
unlink("./foo")                         = 0
ftruncate(3, 1000)                      = 0

Cheers,

--
Greg

Christian Schoenebeck (1):
  tests/9p: add 'Tsetattr' request to test client

Greg Kurz (5):
  9pfs: local : Introduce local_fid_fd() helper
  9pfs: Don't use file descriptors in core code
  9pfs: Introduce ftruncate file op
  9pfs: Introduce futimens file op
  tests/9p: Test `Tsetattr` can truncate unlinked file

 fsdev/file-op-9p.h                    |  5 +++
 hw/9pfs/9p-local.c                    | 49 ++++++++++++++++++++-------
 hw/9pfs/9p-synth.c                    | 22 ++++++++++++
 hw/9pfs/9p-util.h                     |  1 +
 hw/9pfs/9p.c                          | 21 +++++++++---
 hw/9pfs/cofs.c                        | 37 ++++++++++++++++++++
 hw/9pfs/coth.h                        |  4 +++
 tests/qtest/libqos/virtio-9p-client.c | 49 +++++++++++++++++++++++++++
 tests/qtest/libqos/virtio-9p-client.h | 34 +++++++++++++++++++
 tests/qtest/virtio-9p-test.c          | 15 ++++++++
 10 files changed, 219 insertions(+), 18 deletions(-)

-- 
2.48.1
Re: [PATCH v3 0/6] 9pfs: Fix ftruncate-after-unlink
Posted by Christian Schoenebeck 2 weeks ago
On Wednesday, March 12, 2025 4:29:26 PM CET Greg Kurz wrote:
> QEMU 9.2 already fixed the long standing limitation of failing fstat() on
> unlinked files. This series does something similar for ftruncate().
> 
> The following program can be straced inside the guest with a shared fs in
> passthrough mode over 9p2000.L.
> 
> int main(void)
> {
> 	struct stat st;
> 	int fd = creat("./foo", 0000);
> 
> 	ftruncate(fd, 100);
> 	unlink("./foo");
> 	ftruncate(fd, 1000);
> }
> 
> Before :
> 
> creat("./foo", 000)                     = 3
> ftruncate(3, 100)                       = -1 EACCES (Permission denied)
> unlink("./foo")                         = 0
> ftruncate(3, 1000)                      = -1 ENOENT (No such file or directory)
> 
> After :
> 
> creat("./foo", 000)                     = 3
> ftruncate(3, 100)                       = 0
> unlink("./foo")                         = 0
> ftruncate(3, 1000)                      = 0
> 
> Cheers,
> 
> --
> Greg
> 
> Christian Schoenebeck (1):
>   tests/9p: add 'Tsetattr' request to test client
> 
> Greg Kurz (5):
>   9pfs: local : Introduce local_fid_fd() helper
>   9pfs: Don't use file descriptors in core code
>   9pfs: Introduce ftruncate file op
>   9pfs: Introduce futimens file op
>   tests/9p: Test `Tsetattr` can truncate unlinked file
> 
>  fsdev/file-op-9p.h                    |  5 +++
>  hw/9pfs/9p-local.c                    | 49 ++++++++++++++++++++-------
>  hw/9pfs/9p-synth.c                    | 22 ++++++++++++
>  hw/9pfs/9p-util.h                     |  1 +
>  hw/9pfs/9p.c                          | 21 +++++++++---
>  hw/9pfs/cofs.c                        | 37 ++++++++++++++++++++
>  hw/9pfs/coth.h                        |  4 +++
>  tests/qtest/libqos/virtio-9p-client.c | 49 +++++++++++++++++++++++++++
>  tests/qtest/libqos/virtio-9p-client.h | 34 +++++++++++++++++++
>  tests/qtest/virtio-9p-test.c          | 15 ++++++++
>  10 files changed, 219 insertions(+), 18 deletions(-)
> 
>

Queued on 9p.next:
https://github.com/cschoenebeck/qemu/commits/9p.next

Thanks!

/Christian