Patchwork [10/29,virtio-9p] coroutine and threading for open2

login
register
mail settings
Submitter jvrao
Date May 25, 2011, 11:52 p.m.
Message ID <1306367597-797-11-git-send-email-jvrao@linux.vnet.ibm.com>
Download mbox | patch
Permalink /patch/97453/
State New
Headers show

Comments

jvrao - May 25, 2011, 11:52 p.m.
Signed-off-by: Venkateswararao Jujjuri "<jvrao@linux.vnet.ibm.com>
---
 hw/9pfs/cofile.c         |   21 +++++++++++++++++++++
 hw/9pfs/virtio-9p-coth.h |    1 +
 hw/9pfs/virtio-9p.c      |   45 +++++++++++++--------------------------------
 3 files changed, 35 insertions(+), 32 deletions(-)

Patch

diff --git a/hw/9pfs/cofile.c b/hw/9pfs/cofile.c
index 4a3ca21..4b0d96c 100644
--- a/hw/9pfs/cofile.c
+++ b/hw/9pfs/cofile.c
@@ -60,3 +60,24 @@  int v9fs_co_open(V9fsState *s, V9fsFidState *fidp, int flags)
         });
     return err;
 }
+
+int v9fs_co_open2(V9fsState *s, V9fsFidState *fidp, char *fullname, gid_t gid,
+                  int flags, int mode)
+{
+    int err;
+    FsCred cred;
+
+    cred_init(&cred);
+    cred.fc_mode = mode & 07777;
+    cred.fc_uid = fidp->uid;
+    cred.fc_gid = gid;
+    v9fs_co_run_in_worker(
+        {
+            fidp->fs.fd = s->ops->open2(&s->ctx, fullname, flags, &cred);
+            err = 0;
+            if (fidp->fs.fd == -1) {
+                err = -errno;
+            }
+        });
+    return err;
+}
diff --git a/hw/9pfs/virtio-9p-coth.h b/hw/9pfs/virtio-9p-coth.h
index 1df7063..f9610b9 100644
--- a/hw/9pfs/virtio-9p-coth.h
+++ b/hw/9pfs/virtio-9p-coth.h
@@ -79,4 +79,5 @@  extern int v9fs_co_rename(V9fsState *, V9fsString *, V9fsString *);
 extern int v9fs_co_fstat(V9fsState *, int, struct stat *);
 extern int v9fs_co_opendir(V9fsState *, V9fsFidState *);
 extern int v9fs_co_open(V9fsState *, V9fsFidState *, int);
+extern int v9fs_co_open2(V9fsState *, V9fsFidState *, char *, gid_t, int, int);
 #endif
diff --git a/hw/9pfs/virtio-9p.c b/hw/9pfs/virtio-9p.c
index 49de67c..f535134 100644
--- a/hw/9pfs/virtio-9p.c
+++ b/hw/9pfs/virtio-9p.c
@@ -149,20 +149,6 @@  static int v9fs_do_fstat(V9fsState *s, int fd, struct stat *stbuf)
     return s->ops->fstat(&s->ctx, fd, stbuf);
 }
 
-static int v9fs_do_open2(V9fsState *s, char *fullname, uid_t uid, gid_t gid,
-        int flags, int mode)
-{
-    FsCred cred;
-
-    cred_init(&cred);
-    cred.fc_uid = uid;
-    cred.fc_gid = gid;
-    cred.fc_mode = mode & 07777;
-    flags = flags;
-
-    return s->ops->open2(&s->ctx, fullname, flags, &cred);
-}
-
 static int v9fs_do_symlink(V9fsState *s, V9fsFidState *fidp,
         const char *oldpath, const char *newpath, gid_t gid)
 {
@@ -1632,34 +1618,30 @@  static void v9fs_lcreate(void *opaque)
         err = -ENOENT;
         goto out;
     }
-
     v9fs_string_sprintf(&fullname, "%s/%s", fidp->path.data, name.data);
 
     /* Ignore direct disk access hint until the server supports it. */
     flags &= ~O_DIRECT;
 
-    fidp->fs.fd = v9fs_do_open2(pdu->s, fullname.data, fidp->uid,
-                                gid, flags, mode);
-    if (fidp->fs.fd == -1) {
-        err = -errno;
+    err = v9fs_co_open2(pdu->s, fidp, fullname.data, gid, flags, mode);
+    if (err < 0) {
         goto out;
     }
     fidp->fid_type = P9_FID_FILE;
     iounit =  get_iounit(pdu->s, &fullname);
 
-    err = v9fs_do_lstat(pdu->s, &fullname, &stbuf);
-    if (err == 0) {
-        v9fs_string_copy(&fidp->path, &fullname);
-        stat_to_qid(&stbuf, &qid);
-        offset += pdu_marshal(pdu, offset, "Qd", &qid, iounit);
-        err = offset;
-    } else {
-        fidp->fid_type = P9_FID_NONE; /*TODO:Why are we keeping this fid?*/
-        err = -errno;
+    err = v9fs_co_lstat(pdu->s, &fullname, &stbuf);
+    if (err < 0) {
+        fidp->fid_type = P9_FID_NONE;
         if (fidp->fs.fd > 0) {
             close(fidp->fs.fd);
         }
+        goto out;
     }
+    v9fs_string_copy(&fidp->path, &fullname);
+    stat_to_qid(&stbuf, &qid);
+    offset += pdu_marshal(pdu, offset, "Qd", &qid, iounit);
+    err = offset;
 out:
     complete_pdu(pdu->s, pdu, err);
     v9fs_string_free(&name);
@@ -2240,8 +2222,7 @@  static void v9fs_create_post_fstat(V9fsState *s, V9fsCreateState *vs, int err)
 
 static void v9fs_create_post_open2(V9fsState *s, V9fsCreateState *vs, int err)
 {
-    if (vs->fidp->fs.fd == -1) {
-        err = -errno;
+    if (err < 0) {
         goto out;
     }
     vs->fidp->fid_type = P9_FID_FILE;
@@ -2316,8 +2297,8 @@  static void v9fs_create_post_lstat(V9fsState *s, V9fsCreateState *vs, int err)
                 0, vs->fidp->uid, -1);
         v9fs_post_create(s, vs, err);
     } else {
-        vs->fidp->fs.fd = v9fs_do_open2(s, vs->fullname.data, vs->fidp->uid,
-                -1, omode_to_uflags(vs->mode)|O_CREAT, vs->perm);
+        err = v9fs_co_open2(s, vs->fidp, vs->fullname.data, -1,
+                omode_to_uflags(vs->mode)|O_CREAT, vs->perm);
 
         v9fs_create_post_open2(s, vs, err);
     }