From b41e95d34877c1917ba9fca7ca8f5d4122d4c619 Mon Sep 17 00:00:00 2001 From: "Venkateswararao Jujjuri (JV)" Date: Wed, 22 Sep 2010 17:18:33 -0700 Subject: [PATCH] [virtio-9p] Introduce server side TFSYNC/RFSYNC for dotl SYNOPSIS size[4] Tfsync tag[2] fid[4] size[4] Rfsync tag[2] DESCRIPTION The Tfsync transaction transfers ("flushes") all modified in-core data of file identified by fid to the disk device (or other permanent storage device) where that file resides. Signed-off-by: Venkateswararao Jujjuri --- hw/virtio-9p-debug.c | 7 +++++++ hw/virtio-9p.c | 27 +++++++++++++++++++++++++++ hw/virtio-9p.h | 2 ++ 3 files changed, 36 insertions(+) diff --git a/hw/virtio-9p-debug.c b/hw/virtio-9p-debug.c index 85c9900..8f3c321 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 8ae233e..e8eec7f 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 6a68895..637cea6 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, -- 2.7.4