On Fri, 21 May 2010 14:26:05 -0700 "Venkateswararao Jujjuri (JV)" <jv...@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 <jv...@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 > >