diff options
author | Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> | 2011-05-18 16:04:33 -0700 |
---|---|---|
committer | Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> | 2011-08-08 23:42:58 +0530 |
commit | 8db21ce73aab5e8c47053c9a7d3a833ee62de2d4 (patch) | |
tree | e921a036e89b91687731507d5651e8b47db61b00 /hw/9pfs | |
parent | 172198d4db28d537f9e2cfb8af3fef9cd4d2b543 (diff) |
hw/9pfs: Update v9fs_getattr to use coroutines
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Diffstat (limited to 'hw/9pfs')
-rw-r--r-- | hw/9pfs/virtio-9p.c | 57 | ||||
-rw-r--r-- | hw/9pfs/virtio-9p.h | 8 |
2 files changed, 19 insertions, 46 deletions
diff --git a/hw/9pfs/virtio-9p.c b/hw/9pfs/virtio-9p.c index 69ef717fa3..9fb1b3fe4b 100644 --- a/hw/9pfs/virtio-9p.c +++ b/hw/9pfs/virtio-9p.c @@ -1086,7 +1086,7 @@ static int stat_to_v9stat(V9fsState *s, V9fsString *name, static void stat_to_v9stat_dotl(V9fsState *s, const struct stat *stbuf, - V9fsStatDotl *v9lstat) + V9fsStatDotl *v9lstat) { memset(v9lstat, 0, sizeof(*v9lstat)); @@ -1283,57 +1283,38 @@ out: qemu_free(vs); } -static void v9fs_getattr_post_lstat(V9fsState *s, V9fsStatStateDotl *vs, - int err) -{ - if (err == -1) { - err = -errno; - goto out; - } - - stat_to_v9stat_dotl(s, &vs->stbuf, &vs->v9stat_dotl); - vs->offset += pdu_marshal(vs->pdu, vs->offset, "A", &vs->v9stat_dotl); - err = vs->offset; - -out: - complete_pdu(s, vs->pdu, err); - qemu_free(vs); -} - static void v9fs_getattr(void *opaque) { - V9fsPDU *pdu = opaque; - V9fsState *s = pdu->s; int32_t fid; - V9fsStatStateDotl *vs; - ssize_t err = 0; + size_t offset = 7; + ssize_t retval = 0; + struct stat stbuf; V9fsFidState *fidp; uint64_t request_mask; + V9fsStatDotl v9stat_dotl; + V9fsPDU *pdu = opaque; + V9fsState *s = pdu->s; - vs = qemu_malloc(sizeof(*vs)); - vs->pdu = pdu; - vs->offset = 7; - - memset(&vs->v9stat_dotl, 0, sizeof(vs->v9stat_dotl)); - - pdu_unmarshal(vs->pdu, vs->offset, "dq", &fid, &request_mask); + pdu_unmarshal(pdu, offset, "dq", &fid, &request_mask); fidp = lookup_fid(s, fid); if (fidp == NULL) { - err = -ENOENT; + retval = -ENOENT; goto out; } - - /* Currently we only support BASIC fields in stat, so there is no + /* + * Currently we only support BASIC fields in stat, so there is no * need to look at request_mask. */ - err = v9fs_do_lstat(s, &fidp->path, &vs->stbuf); - v9fs_getattr_post_lstat(s, vs, err); - return; - + retval = v9fs_co_lstat(s, &fidp->path, &stbuf); + if (retval < 0) { + goto out; + } + stat_to_v9stat_dotl(s, &stbuf, &v9stat_dotl); + retval = offset; + retval += pdu_marshal(pdu, offset, "A", &v9stat_dotl); out: - complete_pdu(s, vs->pdu, err); - qemu_free(vs); + complete_pdu(s, pdu, retval); } /* From Linux kernel code */ diff --git a/hw/9pfs/virtio-9p.h b/hw/9pfs/virtio-9p.h index eb6cd23540..a62eda078a 100644 --- a/hw/9pfs/virtio-9p.h +++ b/hw/9pfs/virtio-9p.h @@ -278,14 +278,6 @@ typedef struct V9fsStatDotl { uint64_t st_data_version; } V9fsStatDotl; -typedef struct V9fsStatStateDotl { - V9fsPDU *pdu; - size_t offset; - V9fsStatDotl v9stat_dotl; - struct stat stbuf; -} V9fsStatStateDotl; - - typedef struct V9fsWalkState { V9fsPDU *pdu; size_t offset; |