From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=38488 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PvveV-0000v3-6X for qemu-devel@nongnu.org; Sat, 05 Mar 2011 12:52:28 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PvveT-0003pI-Pq for qemu-devel@nongnu.org; Sat, 05 Mar 2011 12:52:26 -0500 Received: from e23smtp05.au.ibm.com ([202.81.31.147]:47217) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PvveT-0003oV-9i for qemu-devel@nongnu.org; Sat, 05 Mar 2011 12:52:25 -0500 Received: from d23relay04.au.ibm.com (d23relay04.au.ibm.com [202.81.31.246]) by e23smtp05.au.ibm.com (8.14.4/8.13.1) with ESMTP id p25HknB1019422 for ; Sun, 6 Mar 2011 04:46:49 +1100 Received: from d23av02.au.ibm.com (d23av02.au.ibm.com [9.190.235.138]) by d23relay04.au.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id p25HqNRO1831020 for ; Sun, 6 Mar 2011 04:52:23 +1100 Received: from d23av02.au.ibm.com (loopback [127.0.0.1]) by d23av02.au.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id p25HqNrS019458 for ; Sun, 6 Mar 2011 04:52:23 +1100 From: "Aneesh Kumar K.V" Date: Sat, 5 Mar 2011 23:22:09 +0530 Message-Id: <1299347533-17047-4-git-send-email-aneesh.kumar@linux.vnet.ibm.com> In-Reply-To: <1299347533-17047-1-git-send-email-aneesh.kumar@linux.vnet.ibm.com> References: <1299347533-17047-1-git-send-email-aneesh.kumar@linux.vnet.ibm.com> Subject: [Qemu-devel] [PATCH -V3 4/8] hw/9pfs: Implement syncfs List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: aliguori@us.ibm.com, "Aneesh Kumar K.V" SYNOPSIS size[4] Tsyncfs tag[2] fid[4] size[4] Rsyncfs tag[2] DESCRIPTION The Tsyncfs transaction transfers ("flushes") all modified data of file system identified by fid to the disk device. The operation is equivalent to calling sync() on the file system. Signed-off-by: Aneesh Kumar K.V --- hw/9pfs/virtio-9p-local.c | 9 +++++++++ hw/9pfs/virtio-9p.c | 31 +++++++++++++++++++++++++++++++ hw/9pfs/virtio-9p.h | 2 ++ hw/file-op-9p.h | 1 + 4 files changed, 43 insertions(+), 0 deletions(-) diff --git a/hw/9pfs/virtio-9p-local.c b/hw/9pfs/virtio-9p-local.c index 0a015de..43ff37c 100644 --- a/hw/9pfs/virtio-9p-local.c +++ b/hw/9pfs/virtio-9p-local.c @@ -528,6 +528,14 @@ static int local_lremovexattr(FsContext *ctx, return v9fs_remove_xattr(ctx, path, name); } +static int local_syncfs(FsContext *ctx, int fd) +{ + /* + * We should be doing per file system sync here. + */ + sync(); + return 0; +} FileOperations local_ops = { .lstat = local_lstat, @@ -560,4 +568,5 @@ FileOperations local_ops = { .llistxattr = local_llistxattr, .lsetxattr = local_lsetxattr, .lremovexattr = local_lremovexattr, + .syncfs = local_syncfs, }; diff --git a/hw/9pfs/virtio-9p.c b/hw/9pfs/virtio-9p.c index c4b0198..ce09e55 100644 --- a/hw/9pfs/virtio-9p.c +++ b/hw/9pfs/virtio-9p.c @@ -299,6 +299,10 @@ static int v9fs_do_lremovexattr(V9fsState *s, V9fsString *path, xattr_name->data); } +static int v9fs_do_syncfs(V9fsState *s, int fd) +{ + return s->ops->syncfs(&s->ctx, fd); +} static void v9fs_string_init(V9fsString *str) { @@ -1978,6 +1982,32 @@ static void v9fs_fsync(V9fsState *s, V9fsPDU *pdu) v9fs_post_do_fsync(s, pdu, err); } +static void v9fs_post_do_syncfs(V9fsState *s, V9fsPDU *pdu, int err) +{ + if (err == -1) { + err = -errno; + } + complete_pdu(s, pdu, err); +} + +static void v9fs_syncfs(V9fsState *s, V9fsPDU *pdu) +{ + int err; + int32_t fid; + size_t offset = 7; + V9fsFidState *fidp; + + pdu_unmarshal(pdu, offset, "d", &fid); + fidp = lookup_fid(s, fid); + if (fidp == NULL) { + err = -ENOENT; + v9fs_post_do_syncfs(s, pdu, err); + return; + } + err = v9fs_do_syncfs(s, fidp->fsmap.fs.fd); + v9fs_post_do_syncfs(s, pdu, err); +} + static void v9fs_clunk(V9fsState *s, V9fsPDU *pdu) { int32_t fid; @@ -3676,6 +3706,7 @@ static pdu_handler_t *pdu_handlers[] = { [P9_TWALK] = v9fs_walk, [P9_TCLUNK] = v9fs_clunk, [P9_TFSYNC] = v9fs_fsync, + [P9_TSYNCFS] = v9fs_syncfs, [P9_TOPEN] = v9fs_open, [P9_TREAD] = v9fs_read, #if 0 diff --git a/hw/9pfs/virtio-9p.h b/hw/9pfs/virtio-9p.h index 68d5906..b0f8210 100644 --- a/hw/9pfs/virtio-9p.h +++ b/hw/9pfs/virtio-9p.h @@ -13,6 +13,8 @@ #define VIRTIO_9P_MOUNT_TAG 0 enum { + P9_TSYNCFS = 0, + P9_RSYNCFS, P9_TLERROR = 6, P9_RLERROR, P9_TSTATFS = 8, diff --git a/hw/file-op-9p.h b/hw/file-op-9p.h index 126e60e..e306305 100644 --- a/hw/file-op-9p.h +++ b/hw/file-op-9p.h @@ -94,6 +94,7 @@ typedef struct FileOperations int (*lsetxattr)(FsContext *, const char *, const char *, void *, size_t, int); int (*lremovexattr)(FsContext *, const char *, const char *); + int (*syncfs)(FsContext *, int); void *opaque; } FileOperations; -- 1.7.1