diff --git a/hw/virtio-9p-debug.c b/hw/virtio-9p-debug.c index 85c9900672a32c1d01f23b4404aceab706635554..8f3c321aec23b7b769de8b501f26c21f50ca960d 100644 --- a/hw/virtio-9p-debug.c +++ b/hw/virtio-9p-debug.c @@ -535,6 +535,13 @@ void pprint_pdu(V9fsPDU *pdu) case P9_RCLUNK: fprintf(llogfile, "RCLUNK: ("); break; + case P9_TFSYNC: + fprintf(llogfile, "TFSYNC: ("); + pprint_int32(pdu, 0, &offset, "fid"); + break; + case P9_RFSYNC: + fprintf(llogfile, "RFSYNC: ("); + break; case P9_TLINK: fprintf(llogfile, "TLINK: ("); pprint_int32(pdu, 0, &offset, "fid"); diff --git a/hw/virtio-9p.c b/hw/virtio-9p.c index 8ae233eb80786db9eb03ff48bfd6210a3837c3a1..e8eec7f60a10ca83848fc278a5adddd50e081264 100644 --- a/hw/virtio-9p.c +++ b/hw/virtio-9p.c @@ -1837,6 +1837,32 @@ out: qemu_free(vs); } +static void v9fs_post_do_fsync(V9fsState *s, V9fsPDU *pdu, int err) +{ + if (err == -1) { + err = -errno; + } + complete_pdu(s, pdu, err); +} + +static void v9fs_fsync(V9fsState *s, V9fsPDU *pdu) +{ + int32_t fid; + size_t offset = 7; + V9fsFidState *fidp; + int err; + + pdu_unmarshal(pdu, offset, "d", &fid); + fidp = lookup_fid(s, fid); + if (fidp == NULL) { + err = -ENOENT; + v9fs_post_do_fsync(s, pdu, err); + return; + } + err = v9fs_do_fsync(s, fidp->fs.fd); + v9fs_post_do_fsync(s, pdu, err); +} + static void v9fs_clunk(V9fsState *s, V9fsPDU *pdu) { int32_t fid; @@ -3514,6 +3540,7 @@ static pdu_handler_t *pdu_handlers[] = { [P9_TSTAT] = v9fs_stat, [P9_TWALK] = v9fs_walk, [P9_TCLUNK] = v9fs_clunk, + [P9_TFSYNC] = v9fs_fsync, [P9_TOPEN] = v9fs_open, [P9_TREAD] = v9fs_read, #if 0 diff --git a/hw/virtio-9p.h b/hw/virtio-9p.h index 6a688950e36ad46d10976cd8691c47412d2b76a4..637cea638d91fea44718c2f6be453342a49b9240 100644 --- a/hw/virtio-9p.h +++ b/hw/virtio-9p.h @@ -37,6 +37,8 @@ enum { P9_RXATTRCREATE, P9_TREADDIR = 40, P9_RREADDIR, + P9_TFSYNC = 50, + P9_RFSYNC, P9_TLOCK = 52, P9_RLOCK, P9_TGETLOCK = 54,