Patchwork [-V3,2/7] virtio-9p: Rearrange fileop structures

login
register
mail settings
Submitter jvrao
Date May 21, 2010, 9:26 p.m.
Message ID <1274477170-7658-3-git-send-email-jvrao@linux.vnet.ibm.com>
Download mbox | patch
Permalink /patch/53211/
State New
Headers show

Comments

jvrao - May 21, 2010, 9:26 p.m.
Signed-off-by: Venkateswararao Jujjuri <jvrao@linux.vnet.ibm.com>
---
 hw/virtio-9p.c |  185 ++++++++++++++------------------------------------------
 hw/virtio-9p.h |   92 ++++++++++++++++++++++++++++
 2 files changed, 138 insertions(+), 139 deletions(-)
Sripathi Kodi - May 25, 2010, 6:07 p.m.
On Fri, 21 May 2010 14:26:05 -0700
"Venkateswararao Jujjuri (JV)" <jvrao@linux.vnet.ibm.com> wrote:

Hi JV,

While I agree that this patch is nice to have, why is this part of the
security model patchset? Is it required to implement the models?

Thanks,
Sripathi.

> Signed-off-by: Venkateswararao Jujjuri <jvrao@linux.vnet.ibm.com>
> ---
>  hw/virtio-9p.c |  185 ++++++++++++++------------------------------------------
>  hw/virtio-9p.h |   92 ++++++++++++++++++++++++++++
>  2 files changed, 138 insertions(+), 139 deletions(-)
> 
> diff --git a/hw/virtio-9p.c b/hw/virtio-9p.c
> index 8ecd39c..fda3c4a 100644
> --- a/hw/virtio-9p.c
> +++ b/hw/virtio-9p.c
> @@ -21,6 +21,52 @@
>  int dotu = 1;
>  int debug_9p_pdu;
> 
> +enum {
> +    Oread   = 0x00,
> +    Owrite  = 0x01,
> +    Ordwr   = 0x02,
> +    Oexec   = 0x03,
> +    Oexcl   = 0x04,
> +    Otrunc  = 0x10,
> +    Orexec  = 0x20,
> +    Orclose = 0x40,
> +    Oappend = 0x80,
> +};
> +
> +static int omode_to_uflags(int8_t mode)
> +{
> +    int ret = 0;
> +
> +    switch (mode & 3) {
> +    case Oread:
> +        ret = O_RDONLY;
> +        break;
> +    case Ordwr:
> +        ret = O_RDWR;
> +        break;
> +    case Owrite:
> +        ret = O_WRONLY;
> +        break;
> +    case Oexec:
> +        ret = O_RDONLY;
> +        break;
> +    }
> +
> +    if (mode & Otrunc) {
> +        ret |= O_TRUNC;
> +    }
> +
> +    if (mode & Oappend) {
> +        ret |= O_APPEND;
> +    }
> +
> +    if (mode & Oexcl) {
> +        ret |= O_EXCL;
> +    }
> +
> +    return ret;
> +}
> +
>  static int v9fs_do_lstat(V9fsState *s, V9fsString *path, struct stat *stbuf)
>  {
>      return s->ops->lstat(&s->ctx, path->data, stbuf);
> @@ -999,14 +1045,6 @@ out:
>      v9fs_string_free(&aname);
>  }
> 
> -typedef struct V9fsStatState {
> -    V9fsPDU *pdu;
> -    size_t offset;
> -    V9fsStat v9stat;
> -    V9fsFidState *fidp;
> -    struct stat stbuf;
> -} V9fsStatState;
> -
>  static void v9fs_stat_post_lstat(V9fsState *s, V9fsStatState *vs, int err)
>  {
>      if (err == -1) {
> @@ -1057,19 +1095,6 @@ out:
>      qemu_free(vs);
>  }
> 
> -typedef struct V9fsWalkState {
> -    V9fsPDU *pdu;
> -    size_t offset;
> -    int16_t nwnames;
> -    int name_idx;
> -    V9fsQID *qids;
> -    V9fsFidState *fidp;
> -    V9fsFidState *newfidp;
> -    V9fsString path;
> -    V9fsString *wnames;
> -    struct stat stbuf;
> -} V9fsWalkState;
> -
>  static void v9fs_walk_complete(V9fsState *s, V9fsWalkState *vs, int err)
>  {
>      complete_pdu(s, vs->pdu, err);
> @@ -1233,62 +1258,6 @@ out:
>      v9fs_walk_complete(s, vs, err);
>  }
> 
> -typedef struct V9fsOpenState {
> -    V9fsPDU *pdu;
> -    size_t offset;
> -    int8_t mode;
> -    V9fsFidState *fidp;
> -    V9fsQID qid;
> -    struct stat stbuf;
> -
> -} V9fsOpenState;
> -
> -enum {
> -    Oread   = 0x00,
> -    Owrite  = 0x01,
> -    Ordwr   = 0x02,
> -    Oexec   = 0x03,
> -    Oexcl   = 0x04,
> -    Otrunc  = 0x10,
> -    Orexec  = 0x20,
> -    Orclose = 0x40,
> -    Oappend = 0x80,
> -};
> -
> -static int omode_to_uflags(int8_t mode)
> -{
> -    int ret = 0;
> -
> -    switch (mode & 3) {
> -    case Oread:
> -        ret = O_RDONLY;
> -        break;
> -    case Ordwr:
> -        ret = O_RDWR;
> -        break;
> -    case Owrite:
> -        ret = O_WRONLY;
> -        break;
> -    case Oexec:
> -        ret = O_RDONLY;
> -        break;
> -    }
> -
> -    if (mode & Otrunc) {
> -        ret |= O_TRUNC;
> -    }
> -
> -    if (mode & Oappend) {
> -        ret |= O_APPEND;
> -    }
> -
> -    if (mode & Oexcl) {
> -        ret |= O_EXCL;
> -    }
> -
> -    return ret;
> -}
> -
>  static void v9fs_open_post_opendir(V9fsState *s, V9fsOpenState *vs, int err)
>  {
>      if (vs->fidp->dir == NULL) {
> @@ -1391,25 +1360,6 @@ out:
>      complete_pdu(s, pdu, err);
>  }
> 
> -typedef struct V9fsReadState {
> -    V9fsPDU *pdu;
> -    size_t offset;
> -    int32_t count;
> -    int32_t total;
> -    int64_t off;
> -    V9fsFidState *fidp;
> -    struct iovec iov[128]; /* FIXME: bad, bad, bad */
> -    struct iovec *sg;
> -    off_t dir_pos;
> -    struct dirent *dent;
> -    struct stat stbuf;
> -    V9fsString name;
> -    V9fsStat v9stat;
> -    int32_t len;
> -    int32_t cnt;
> -    int32_t max_count;
> -} V9fsReadState;
> -
>  static void v9fs_read_post_readdir(V9fsState *, V9fsReadState *, ssize_t);
> 
>  static void v9fs_read_post_seekdir(V9fsState *s, V9fsReadState *vs, ssize_t err)
> @@ -1597,19 +1547,6 @@ out:
>      qemu_free(vs);
>  }
> 
> -typedef struct V9fsWriteState {
> -    V9fsPDU *pdu;
> -    size_t offset;
> -    int32_t len;
> -    int32_t count;
> -    int32_t total;
> -    int64_t off;
> -    V9fsFidState *fidp;
> -    struct iovec iov[128]; /* FIXME: bad, bad, bad */
> -    struct iovec *sg;
> -    int cnt;
> -} V9fsWriteState;
> -
>  static void v9fs_write_post_writev(V9fsState *s, V9fsWriteState *vs,
>                                     ssize_t err)
>  {
> @@ -1706,19 +1643,6 @@ out:
>      qemu_free(vs);
>  }
> 
> -typedef struct V9fsCreateState {
> -    V9fsPDU *pdu;
> -    size_t offset;
> -    V9fsFidState *fidp;
> -    V9fsQID qid;
> -    int32_t perm;
> -    int8_t mode;
> -    struct stat stbuf;
> -    V9fsString name;
> -    V9fsString extension;
> -    V9fsString fullname;
> -} V9fsCreateState;
> -
>  static void v9fs_post_create(V9fsState *s, V9fsCreateState *vs, int err)
>  {
>      if (err == 0) {
> @@ -1938,12 +1862,6 @@ static void v9fs_flush(V9fsState *s, V9fsPDU *pdu)
>      complete_pdu(s, pdu, 7);
>  }
> 
> -typedef struct V9fsRemoveState {
> -    V9fsPDU *pdu;
> -    size_t offset;
> -    V9fsFidState *fidp;
> -} V9fsRemoveState;
> -
>  static void v9fs_remove_post_remove(V9fsState *s, V9fsRemoveState *vs,
>                                                                  int err)
>  {
> @@ -1986,17 +1904,6 @@ out:
>      qemu_free(vs);
>  }
> 
> -typedef struct V9fsWstatState
> -{
> -    V9fsPDU *pdu;
> -    size_t offset;
> -    int16_t unused;
> -    V9fsStat v9stat;
> -    V9fsFidState *fidp;
> -    struct stat stbuf;
> -    V9fsString nname;
> -} V9fsWstatState;
> -
>  static void v9fs_wstat_post_truncate(V9fsState *s, V9fsWstatState *vs, int err)
>  {
>      if (err < 0) {
> diff --git a/hw/virtio-9p.h b/hw/virtio-9p.h
> index 9b6cbde..992c765 100644
> --- a/hw/virtio-9p.h
> +++ b/hw/virtio-9p.h
> @@ -154,6 +154,98 @@ typedef struct V9fsState
>      enum p9_proto_version proto_version;
>  } V9fsState;
> 
> +typedef struct V9fsCreateState {
> +    V9fsPDU *pdu;
> +    size_t offset;
> +    V9fsFidState *fidp;
> +    V9fsQID qid;
> +    int32_t perm;
> +    int8_t mode;
> +    struct stat stbuf;
> +    V9fsString name;
> +    V9fsString extension;
> +    V9fsString fullname;
> +} V9fsCreateState;
> +
> +typedef struct V9fsStatState {
> +    V9fsPDU *pdu;
> +    size_t offset;
> +    V9fsStat v9stat;
> +    V9fsFidState *fidp;
> +    struct stat stbuf;
> +} V9fsStatState;
> +
> +typedef struct V9fsWalkState {
> +    V9fsPDU *pdu;
> +    size_t offset;
> +    int16_t nwnames;
> +    int name_idx;
> +    V9fsQID *qids;
> +    V9fsFidState *fidp;
> +    V9fsFidState *newfidp;
> +    V9fsString path;
> +    V9fsString *wnames;
> +    struct stat stbuf;
> +} V9fsWalkState;
> +
> +typedef struct V9fsOpenState {
> +    V9fsPDU *pdu;
> +    size_t offset;
> +    int8_t mode;
> +    V9fsFidState *fidp;
> +    V9fsQID qid;
> +    struct stat stbuf;
> +} V9fsOpenState;
> +
> +typedef struct V9fsReadState {
> +    V9fsPDU *pdu;
> +    size_t offset;
> +    int32_t count;
> +    int32_t total;
> +    int64_t off;
> +    V9fsFidState *fidp;
> +    struct iovec iov[128]; /* FIXME: bad, bad, bad */
> +    struct iovec *sg;
> +    off_t dir_pos;
> +    struct dirent *dent;
> +    struct stat stbuf;
> +    V9fsString name;
> +    V9fsStat v9stat;
> +    int32_t len;
> +    int32_t cnt;
> +    int32_t max_count;
> +} V9fsReadState;
> +
> +typedef struct V9fsWriteState {
> +    V9fsPDU *pdu;
> +    size_t offset;
> +    int32_t len;
> +    int32_t count;
> +    int32_t total;
> +    int64_t off;
> +    V9fsFidState *fidp;
> +    struct iovec iov[128]; /* FIXME: bad, bad, bad */
> +    struct iovec *sg;
> +    int cnt;
> +} V9fsWriteState;
> +
> +typedef struct V9fsRemoveState {
> +    V9fsPDU *pdu;
> +    size_t offset;
> +    V9fsFidState *fidp;
> +} V9fsRemoveState;
> +
> +typedef struct V9fsWstatState
> +{
> +    V9fsPDU *pdu;
> +    size_t offset;
> +    int16_t unused;
> +    V9fsStat v9stat;
> +    V9fsFidState *fidp;
> +    struct stat stbuf;
> +    V9fsString nname;
> +} V9fsWstatState;
> +
>  struct virtio_9p_config
>  {
>      /* number of characters in tag */
> -- 
> 1.6.5.2
> 
>
jvrao - May 26, 2010, 8:21 p.m.
Sripathi Kodi wrote:
> On Fri, 21 May 2010 14:26:05 -0700
> "Venkateswararao Jujjuri (JV)" <jvrao@linux.vnet.ibm.com> wrote:
> 
> Hi JV,
> 
> While I agree that this patch is nice to have, why is this part of the
> security model patchset? Is it required to implement the models?

Initially I had a grand plan of making this a substitute for file-op.h.
But later file-op.h got added and this left mostly for consolidation and segregation.
Not really a 'must' for security..but makes code cleaner.

Thanks,
JV

> 
> Thanks,
> Sripathi.
> 
>> Signed-off-by: Venkateswararao Jujjuri <jvrao@linux.vnet.ibm.com>
>> ---
>>  hw/virtio-9p.c |  185 ++++++++++++++------------------------------------------
>>  hw/virtio-9p.h |   92 ++++++++++++++++++++++++++++
>>  2 files changed, 138 insertions(+), 139 deletions(-)
>>
>> diff --git a/hw/virtio-9p.c b/hw/virtio-9p.c
>> index 8ecd39c..fda3c4a 100644
>> --- a/hw/virtio-9p.c
>> +++ b/hw/virtio-9p.c
>> @@ -21,6 +21,52 @@
>>  int dotu = 1;
>>  int debug_9p_pdu;
>>
>> +enum {
>> +    Oread   = 0x00,
>> +    Owrite  = 0x01,
>> +    Ordwr   = 0x02,
>> +    Oexec   = 0x03,
>> +    Oexcl   = 0x04,
>> +    Otrunc  = 0x10,
>> +    Orexec  = 0x20,
>> +    Orclose = 0x40,
>> +    Oappend = 0x80,
>> +};
>> +
>> +static int omode_to_uflags(int8_t mode)
>> +{
>> +    int ret = 0;
>> +
>> +    switch (mode & 3) {
>> +    case Oread:
>> +        ret = O_RDONLY;
>> +        break;
>> +    case Ordwr:
>> +        ret = O_RDWR;
>> +        break;
>> +    case Owrite:
>> +        ret = O_WRONLY;
>> +        break;
>> +    case Oexec:
>> +        ret = O_RDONLY;
>> +        break;
>> +    }
>> +
>> +    if (mode & Otrunc) {
>> +        ret |= O_TRUNC;
>> +    }
>> +
>> +    if (mode & Oappend) {
>> +        ret |= O_APPEND;
>> +    }
>> +
>> +    if (mode & Oexcl) {
>> +        ret |= O_EXCL;
>> +    }
>> +
>> +    return ret;
>> +}
>> +
>>  static int v9fs_do_lstat(V9fsState *s, V9fsString *path, struct stat *stbuf)
>>  {
>>      return s->ops->lstat(&s->ctx, path->data, stbuf);
>> @@ -999,14 +1045,6 @@ out:
>>      v9fs_string_free(&aname);
>>  }
>>
>> -typedef struct V9fsStatState {
>> -    V9fsPDU *pdu;
>> -    size_t offset;
>> -    V9fsStat v9stat;
>> -    V9fsFidState *fidp;
>> -    struct stat stbuf;
>> -} V9fsStatState;
>> -
>>  static void v9fs_stat_post_lstat(V9fsState *s, V9fsStatState *vs, int err)
>>  {
>>      if (err == -1) {
>> @@ -1057,19 +1095,6 @@ out:
>>      qemu_free(vs);
>>  }
>>
>> -typedef struct V9fsWalkState {
>> -    V9fsPDU *pdu;
>> -    size_t offset;
>> -    int16_t nwnames;
>> -    int name_idx;
>> -    V9fsQID *qids;
>> -    V9fsFidState *fidp;
>> -    V9fsFidState *newfidp;
>> -    V9fsString path;
>> -    V9fsString *wnames;
>> -    struct stat stbuf;
>> -} V9fsWalkState;
>> -
>>  static void v9fs_walk_complete(V9fsState *s, V9fsWalkState *vs, int err)
>>  {
>>      complete_pdu(s, vs->pdu, err);
>> @@ -1233,62 +1258,6 @@ out:
>>      v9fs_walk_complete(s, vs, err);
>>  }
>>
>> -typedef struct V9fsOpenState {
>> -    V9fsPDU *pdu;
>> -    size_t offset;
>> -    int8_t mode;
>> -    V9fsFidState *fidp;
>> -    V9fsQID qid;
>> -    struct stat stbuf;
>> -
>> -} V9fsOpenState;
>> -
>> -enum {
>> -    Oread   = 0x00,
>> -    Owrite  = 0x01,
>> -    Ordwr   = 0x02,
>> -    Oexec   = 0x03,
>> -    Oexcl   = 0x04,
>> -    Otrunc  = 0x10,
>> -    Orexec  = 0x20,
>> -    Orclose = 0x40,
>> -    Oappend = 0x80,
>> -};
>> -
>> -static int omode_to_uflags(int8_t mode)
>> -{
>> -    int ret = 0;
>> -
>> -    switch (mode & 3) {
>> -    case Oread:
>> -        ret = O_RDONLY;
>> -        break;
>> -    case Ordwr:
>> -        ret = O_RDWR;
>> -        break;
>> -    case Owrite:
>> -        ret = O_WRONLY;
>> -        break;
>> -    case Oexec:
>> -        ret = O_RDONLY;
>> -        break;
>> -    }
>> -
>> -    if (mode & Otrunc) {
>> -        ret |= O_TRUNC;
>> -    }
>> -
>> -    if (mode & Oappend) {
>> -        ret |= O_APPEND;
>> -    }
>> -
>> -    if (mode & Oexcl) {
>> -        ret |= O_EXCL;
>> -    }
>> -
>> -    return ret;
>> -}
>> -
>>  static void v9fs_open_post_opendir(V9fsState *s, V9fsOpenState *vs, int err)
>>  {
>>      if (vs->fidp->dir == NULL) {
>> @@ -1391,25 +1360,6 @@ out:
>>      complete_pdu(s, pdu, err);
>>  }
>>
>> -typedef struct V9fsReadState {
>> -    V9fsPDU *pdu;
>> -    size_t offset;
>> -    int32_t count;
>> -    int32_t total;
>> -    int64_t off;
>> -    V9fsFidState *fidp;
>> -    struct iovec iov[128]; /* FIXME: bad, bad, bad */
>> -    struct iovec *sg;
>> -    off_t dir_pos;
>> -    struct dirent *dent;
>> -    struct stat stbuf;
>> -    V9fsString name;
>> -    V9fsStat v9stat;
>> -    int32_t len;
>> -    int32_t cnt;
>> -    int32_t max_count;
>> -} V9fsReadState;
>> -
>>  static void v9fs_read_post_readdir(V9fsState *, V9fsReadState *, ssize_t);
>>
>>  static void v9fs_read_post_seekdir(V9fsState *s, V9fsReadState *vs, ssize_t err)
>> @@ -1597,19 +1547,6 @@ out:
>>      qemu_free(vs);
>>  }
>>
>> -typedef struct V9fsWriteState {
>> -    V9fsPDU *pdu;
>> -    size_t offset;
>> -    int32_t len;
>> -    int32_t count;
>> -    int32_t total;
>> -    int64_t off;
>> -    V9fsFidState *fidp;
>> -    struct iovec iov[128]; /* FIXME: bad, bad, bad */
>> -    struct iovec *sg;
>> -    int cnt;
>> -} V9fsWriteState;
>> -
>>  static void v9fs_write_post_writev(V9fsState *s, V9fsWriteState *vs,
>>                                     ssize_t err)
>>  {
>> @@ -1706,19 +1643,6 @@ out:
>>      qemu_free(vs);
>>  }
>>
>> -typedef struct V9fsCreateState {
>> -    V9fsPDU *pdu;
>> -    size_t offset;
>> -    V9fsFidState *fidp;
>> -    V9fsQID qid;
>> -    int32_t perm;
>> -    int8_t mode;
>> -    struct stat stbuf;
>> -    V9fsString name;
>> -    V9fsString extension;
>> -    V9fsString fullname;
>> -} V9fsCreateState;
>> -
>>  static void v9fs_post_create(V9fsState *s, V9fsCreateState *vs, int err)
>>  {
>>      if (err == 0) {
>> @@ -1938,12 +1862,6 @@ static void v9fs_flush(V9fsState *s, V9fsPDU *pdu)
>>      complete_pdu(s, pdu, 7);
>>  }
>>
>> -typedef struct V9fsRemoveState {
>> -    V9fsPDU *pdu;
>> -    size_t offset;
>> -    V9fsFidState *fidp;
>> -} V9fsRemoveState;
>> -
>>  static void v9fs_remove_post_remove(V9fsState *s, V9fsRemoveState *vs,
>>                                                                  int err)
>>  {
>> @@ -1986,17 +1904,6 @@ out:
>>      qemu_free(vs);
>>  }
>>
>> -typedef struct V9fsWstatState
>> -{
>> -    V9fsPDU *pdu;
>> -    size_t offset;
>> -    int16_t unused;
>> -    V9fsStat v9stat;
>> -    V9fsFidState *fidp;
>> -    struct stat stbuf;
>> -    V9fsString nname;
>> -} V9fsWstatState;
>> -
>>  static void v9fs_wstat_post_truncate(V9fsState *s, V9fsWstatState *vs, int err)
>>  {
>>      if (err < 0) {
>> diff --git a/hw/virtio-9p.h b/hw/virtio-9p.h
>> index 9b6cbde..992c765 100644
>> --- a/hw/virtio-9p.h
>> +++ b/hw/virtio-9p.h
>> @@ -154,6 +154,98 @@ typedef struct V9fsState
>>      enum p9_proto_version proto_version;
>>  } V9fsState;
>>
>> +typedef struct V9fsCreateState {
>> +    V9fsPDU *pdu;
>> +    size_t offset;
>> +    V9fsFidState *fidp;
>> +    V9fsQID qid;
>> +    int32_t perm;
>> +    int8_t mode;
>> +    struct stat stbuf;
>> +    V9fsString name;
>> +    V9fsString extension;
>> +    V9fsString fullname;
>> +} V9fsCreateState;
>> +
>> +typedef struct V9fsStatState {
>> +    V9fsPDU *pdu;
>> +    size_t offset;
>> +    V9fsStat v9stat;
>> +    V9fsFidState *fidp;
>> +    struct stat stbuf;
>> +} V9fsStatState;
>> +
>> +typedef struct V9fsWalkState {
>> +    V9fsPDU *pdu;
>> +    size_t offset;
>> +    int16_t nwnames;
>> +    int name_idx;
>> +    V9fsQID *qids;
>> +    V9fsFidState *fidp;
>> +    V9fsFidState *newfidp;
>> +    V9fsString path;
>> +    V9fsString *wnames;
>> +    struct stat stbuf;
>> +} V9fsWalkState;
>> +
>> +typedef struct V9fsOpenState {
>> +    V9fsPDU *pdu;
>> +    size_t offset;
>> +    int8_t mode;
>> +    V9fsFidState *fidp;
>> +    V9fsQID qid;
>> +    struct stat stbuf;
>> +} V9fsOpenState;
>> +
>> +typedef struct V9fsReadState {
>> +    V9fsPDU *pdu;
>> +    size_t offset;
>> +    int32_t count;
>> +    int32_t total;
>> +    int64_t off;
>> +    V9fsFidState *fidp;
>> +    struct iovec iov[128]; /* FIXME: bad, bad, bad */
>> +    struct iovec *sg;
>> +    off_t dir_pos;
>> +    struct dirent *dent;
>> +    struct stat stbuf;
>> +    V9fsString name;
>> +    V9fsStat v9stat;
>> +    int32_t len;
>> +    int32_t cnt;
>> +    int32_t max_count;
>> +} V9fsReadState;
>> +
>> +typedef struct V9fsWriteState {
>> +    V9fsPDU *pdu;
>> +    size_t offset;
>> +    int32_t len;
>> +    int32_t count;
>> +    int32_t total;
>> +    int64_t off;
>> +    V9fsFidState *fidp;
>> +    struct iovec iov[128]; /* FIXME: bad, bad, bad */
>> +    struct iovec *sg;
>> +    int cnt;
>> +} V9fsWriteState;
>> +
>> +typedef struct V9fsRemoveState {
>> +    V9fsPDU *pdu;
>> +    size_t offset;
>> +    V9fsFidState *fidp;
>> +} V9fsRemoveState;
>> +
>> +typedef struct V9fsWstatState
>> +{
>> +    V9fsPDU *pdu;
>> +    size_t offset;
>> +    int16_t unused;
>> +    V9fsStat v9stat;
>> +    V9fsFidState *fidp;
>> +    struct stat stbuf;
>> +    V9fsString nname;
>> +} V9fsWstatState;
>> +
>>  struct virtio_9p_config
>>  {
>>      /* number of characters in tag */
>> -- 
>> 1.6.5.2
>>
>>
>

Patch

diff --git a/hw/virtio-9p.c b/hw/virtio-9p.c
index 8ecd39c..fda3c4a 100644
--- a/hw/virtio-9p.c
+++ b/hw/virtio-9p.c
@@ -21,6 +21,52 @@ 
 int dotu = 1;
 int debug_9p_pdu;
 
+enum {
+    Oread   = 0x00,
+    Owrite  = 0x01,
+    Ordwr   = 0x02,
+    Oexec   = 0x03,
+    Oexcl   = 0x04,
+    Otrunc  = 0x10,
+    Orexec  = 0x20,
+    Orclose = 0x40,
+    Oappend = 0x80,
+};
+
+static int omode_to_uflags(int8_t mode)
+{
+    int ret = 0;
+
+    switch (mode & 3) {
+    case Oread:
+        ret = O_RDONLY;
+        break;
+    case Ordwr:
+        ret = O_RDWR;
+        break;
+    case Owrite:
+        ret = O_WRONLY;
+        break;
+    case Oexec:
+        ret = O_RDONLY;
+        break;
+    }
+
+    if (mode & Otrunc) {
+        ret |= O_TRUNC;
+    }
+
+    if (mode & Oappend) {
+        ret |= O_APPEND;
+    }
+
+    if (mode & Oexcl) {
+        ret |= O_EXCL;
+    }
+
+    return ret;
+}
+
 static int v9fs_do_lstat(V9fsState *s, V9fsString *path, struct stat *stbuf)
 {
     return s->ops->lstat(&s->ctx, path->data, stbuf);
@@ -999,14 +1045,6 @@  out:
     v9fs_string_free(&aname);
 }
 
-typedef struct V9fsStatState {
-    V9fsPDU *pdu;
-    size_t offset;
-    V9fsStat v9stat;
-    V9fsFidState *fidp;
-    struct stat stbuf;
-} V9fsStatState;
-
 static void v9fs_stat_post_lstat(V9fsState *s, V9fsStatState *vs, int err)
 {
     if (err == -1) {
@@ -1057,19 +1095,6 @@  out:
     qemu_free(vs);
 }
 
-typedef struct V9fsWalkState {
-    V9fsPDU *pdu;
-    size_t offset;
-    int16_t nwnames;
-    int name_idx;
-    V9fsQID *qids;
-    V9fsFidState *fidp;
-    V9fsFidState *newfidp;
-    V9fsString path;
-    V9fsString *wnames;
-    struct stat stbuf;
-} V9fsWalkState;
-
 static void v9fs_walk_complete(V9fsState *s, V9fsWalkState *vs, int err)
 {
     complete_pdu(s, vs->pdu, err);
@@ -1233,62 +1258,6 @@  out:
     v9fs_walk_complete(s, vs, err);
 }
 
-typedef struct V9fsOpenState {
-    V9fsPDU *pdu;
-    size_t offset;
-    int8_t mode;
-    V9fsFidState *fidp;
-    V9fsQID qid;
-    struct stat stbuf;
-
-} V9fsOpenState;
-
-enum {
-    Oread   = 0x00,
-    Owrite  = 0x01,
-    Ordwr   = 0x02,
-    Oexec   = 0x03,
-    Oexcl   = 0x04,
-    Otrunc  = 0x10,
-    Orexec  = 0x20,
-    Orclose = 0x40,
-    Oappend = 0x80,
-};
-
-static int omode_to_uflags(int8_t mode)
-{
-    int ret = 0;
-
-    switch (mode & 3) {
-    case Oread:
-        ret = O_RDONLY;
-        break;
-    case Ordwr:
-        ret = O_RDWR;
-        break;
-    case Owrite:
-        ret = O_WRONLY;
-        break;
-    case Oexec:
-        ret = O_RDONLY;
-        break;
-    }
-
-    if (mode & Otrunc) {
-        ret |= O_TRUNC;
-    }
-
-    if (mode & Oappend) {
-        ret |= O_APPEND;
-    }
-
-    if (mode & Oexcl) {
-        ret |= O_EXCL;
-    }
-
-    return ret;
-}
-
 static void v9fs_open_post_opendir(V9fsState *s, V9fsOpenState *vs, int err)
 {
     if (vs->fidp->dir == NULL) {
@@ -1391,25 +1360,6 @@  out:
     complete_pdu(s, pdu, err);
 }
 
-typedef struct V9fsReadState {
-    V9fsPDU *pdu;
-    size_t offset;
-    int32_t count;
-    int32_t total;
-    int64_t off;
-    V9fsFidState *fidp;
-    struct iovec iov[128]; /* FIXME: bad, bad, bad */
-    struct iovec *sg;
-    off_t dir_pos;
-    struct dirent *dent;
-    struct stat stbuf;
-    V9fsString name;
-    V9fsStat v9stat;
-    int32_t len;
-    int32_t cnt;
-    int32_t max_count;
-} V9fsReadState;
-
 static void v9fs_read_post_readdir(V9fsState *, V9fsReadState *, ssize_t);
 
 static void v9fs_read_post_seekdir(V9fsState *s, V9fsReadState *vs, ssize_t err)
@@ -1597,19 +1547,6 @@  out:
     qemu_free(vs);
 }
 
-typedef struct V9fsWriteState {
-    V9fsPDU *pdu;
-    size_t offset;
-    int32_t len;
-    int32_t count;
-    int32_t total;
-    int64_t off;
-    V9fsFidState *fidp;
-    struct iovec iov[128]; /* FIXME: bad, bad, bad */
-    struct iovec *sg;
-    int cnt;
-} V9fsWriteState;
-
 static void v9fs_write_post_writev(V9fsState *s, V9fsWriteState *vs,
                                    ssize_t err)
 {
@@ -1706,19 +1643,6 @@  out:
     qemu_free(vs);
 }
 
-typedef struct V9fsCreateState {
-    V9fsPDU *pdu;
-    size_t offset;
-    V9fsFidState *fidp;
-    V9fsQID qid;
-    int32_t perm;
-    int8_t mode;
-    struct stat stbuf;
-    V9fsString name;
-    V9fsString extension;
-    V9fsString fullname;
-} V9fsCreateState;
-
 static void v9fs_post_create(V9fsState *s, V9fsCreateState *vs, int err)
 {
     if (err == 0) {
@@ -1938,12 +1862,6 @@  static void v9fs_flush(V9fsState *s, V9fsPDU *pdu)
     complete_pdu(s, pdu, 7);
 }
 
-typedef struct V9fsRemoveState {
-    V9fsPDU *pdu;
-    size_t offset;
-    V9fsFidState *fidp;
-} V9fsRemoveState;
-
 static void v9fs_remove_post_remove(V9fsState *s, V9fsRemoveState *vs,
                                                                 int err)
 {
@@ -1986,17 +1904,6 @@  out:
     qemu_free(vs);
 }
 
-typedef struct V9fsWstatState
-{
-    V9fsPDU *pdu;
-    size_t offset;
-    int16_t unused;
-    V9fsStat v9stat;
-    V9fsFidState *fidp;
-    struct stat stbuf;
-    V9fsString nname;
-} V9fsWstatState;
-
 static void v9fs_wstat_post_truncate(V9fsState *s, V9fsWstatState *vs, int err)
 {
     if (err < 0) {
diff --git a/hw/virtio-9p.h b/hw/virtio-9p.h
index 9b6cbde..992c765 100644
--- a/hw/virtio-9p.h
+++ b/hw/virtio-9p.h
@@ -154,6 +154,98 @@  typedef struct V9fsState
     enum p9_proto_version proto_version;
 } V9fsState;
 
+typedef struct V9fsCreateState {
+    V9fsPDU *pdu;
+    size_t offset;
+    V9fsFidState *fidp;
+    V9fsQID qid;
+    int32_t perm;
+    int8_t mode;
+    struct stat stbuf;
+    V9fsString name;
+    V9fsString extension;
+    V9fsString fullname;
+} V9fsCreateState;
+
+typedef struct V9fsStatState {
+    V9fsPDU *pdu;
+    size_t offset;
+    V9fsStat v9stat;
+    V9fsFidState *fidp;
+    struct stat stbuf;
+} V9fsStatState;
+
+typedef struct V9fsWalkState {
+    V9fsPDU *pdu;
+    size_t offset;
+    int16_t nwnames;
+    int name_idx;
+    V9fsQID *qids;
+    V9fsFidState *fidp;
+    V9fsFidState *newfidp;
+    V9fsString path;
+    V9fsString *wnames;
+    struct stat stbuf;
+} V9fsWalkState;
+
+typedef struct V9fsOpenState {
+    V9fsPDU *pdu;
+    size_t offset;
+    int8_t mode;
+    V9fsFidState *fidp;
+    V9fsQID qid;
+    struct stat stbuf;
+} V9fsOpenState;
+
+typedef struct V9fsReadState {
+    V9fsPDU *pdu;
+    size_t offset;
+    int32_t count;
+    int32_t total;
+    int64_t off;
+    V9fsFidState *fidp;
+    struct iovec iov[128]; /* FIXME: bad, bad, bad */
+    struct iovec *sg;
+    off_t dir_pos;
+    struct dirent *dent;
+    struct stat stbuf;
+    V9fsString name;
+    V9fsStat v9stat;
+    int32_t len;
+    int32_t cnt;
+    int32_t max_count;
+} V9fsReadState;
+
+typedef struct V9fsWriteState {
+    V9fsPDU *pdu;
+    size_t offset;
+    int32_t len;
+    int32_t count;
+    int32_t total;
+    int64_t off;
+    V9fsFidState *fidp;
+    struct iovec iov[128]; /* FIXME: bad, bad, bad */
+    struct iovec *sg;
+    int cnt;
+} V9fsWriteState;
+
+typedef struct V9fsRemoveState {
+    V9fsPDU *pdu;
+    size_t offset;
+    V9fsFidState *fidp;
+} V9fsRemoveState;
+
+typedef struct V9fsWstatState
+{
+    V9fsPDU *pdu;
+    size_t offset;
+    int16_t unused;
+    V9fsStat v9stat;
+    V9fsFidState *fidp;
+    struct stat stbuf;
+    V9fsString nname;
+} V9fsWstatState;
+
 struct virtio_9p_config
 {
     /* number of characters in tag */