Sripathi Kodi wrote: > 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?
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 <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 >> >> >