This series addresses a long standing issue in 9p, where most syscalls accessing file attributes out of file descriptor stop to work in the guest when the file gets unlinked:
open("./test.txt", O_RDWR|O_CREAT, 0666) = 4 unlink("./test.txt") = 0 fstat(4, 0x3fffc22108d0) = -1 ENOENT (No such file or directory) ftruncate(4, 0) = -1 ENOENT (No such file or directory) utimensat(4, NULL, NULL, 0) = -1 ENOENT (No such file or directory) fgetxattr(4, "user.greg", NULL, 0) = -1 ENOENT (No such file or directory) flistxattr(4, NULL, 0) = -1 ENOENT (No such file or directory) fchmod(4, 0) = -1 ENOENT (No such file or directory) fchown(4, -1, -1) = -1 ENOENT (No such file or directory) There is also another case where ftruncate() unexpectedly fails: open("./test.txt", O_RDWR|O_CREAT, 0666) = 4 chmod("./test.txt", 0) = 0 ftruncate(4, 0) = -1 EACCES (Permission denied) Since the open+unlink sequence is widely used in applications, these failures are really a problem, and does not encourage people to using 9p mounts. The root cause for all these errors is that QEMU uses path based syscalls to implement 9p operations on file attributes, even if the fid has an open fd. This series adds new file ops to the internal fsdev API, following the example of already existing fstat, so that backends can access the fid file descriptor and pass it to ftruncate(), fchmod() and friends. This can be tested with a linux guest, provided the 9p client in the kernel is fixed with the following patches, to ensure it passes open fids (fid associated to a valid file descriptor) to the 9p server in QEMU. https://sourceforge.net/p/v9fs/mailman/message/35175775/ With this series and the patched guest kernel, all the failures mentionned above no longer occur. --- Greg Kurz (13): 9p: synth: drop v9fs_ prefix 9p: factour out duplicate code from local_fstat() and local_lstat() 9p: introduce the v9fs_get_fd_fid() helper 9p: getattr: use fstat if we have a fd 9p: introduce ftruncate file op oslib: support futimens() if available 9p: introduce futimens file op 9p: add a fd argument to xattr helpers 9p: introduce fchown file op 9p: introduce fchmod file op 9p: xattr fid to reference file fid 9p: introduce fgetxattr file op 9p: introduce flistxattr file op fsdev/file-op-9p.h | 9 ++ hw/9pfs/9p-handle.c | 85 ++++++++++++--- hw/9pfs/9p-local.c | 213 ++++++++++++++++++++++++++++---------- hw/9pfs/9p-posix-acl.c | 80 ++++++++++---- hw/9pfs/9p-proxy.c | 78 ++++++++++++-- hw/9pfs/9p-synth.c | 249 +++++++++++++++++++++++++++------------------ hw/9pfs/9p-xattr-user.c | 41 +++++-- hw/9pfs/9p-xattr.c | 35 ++++-- hw/9pfs/9p-xattr.h | 67 +++++++----- hw/9pfs/9p.c | 189 +++++++++++++++++++++++++++++----- hw/9pfs/9p.h | 3 + hw/9pfs/cofs.c | 79 ++++++++++++++ hw/9pfs/coth.h | 7 + hw/9pfs/coxattr.c | 42 ++++++++ include/sysemu/os-posix.h | 1 util/oslib-posix.c | 10 ++ 16 files changed, 896 insertions(+), 292 deletions(-) -- Greg