diff --git a/fsdev/file-op-9p.h b/fsdev/file-op-9p.h
index 126e60e..81a822a 100644
--- a/fsdev/file-op-9p.h
+++ b/fsdev/file-op-9p.h
@@ -73,12 +73,12 @@ typedef struct FileOperations
     int (*setuid)(FsContext *, uid_t);
     int (*close)(FsContext *, int);
     int (*closedir)(FsContext *, DIR *);
-    DIR *(*opendir)(FsContext *, const char *);
+    int (*opendir)(FsContext *, const char *, DIR **);
     int (*open)(FsContext *, const char *, int);
     int (*open2)(FsContext *, const char *, int, FsCred *);
     void (*rewinddir)(FsContext *, DIR *);
     off_t (*telldir)(FsContext *, DIR *);
-    struct dirent *(*readdir)(FsContext *, DIR *);
+    int (*readdir)(FsContext *, DIR *, struct dirent **);
     void (*seekdir)(FsContext *, DIR *, off_t);
     ssize_t (*preadv)(FsContext *, int, const struct iovec *, int, off_t);
     ssize_t (*pwritev)(FsContext *, int, const struct iovec *, int, off_t);
diff --git a/hw/9pfs/virtio-9p-local.c b/hw/9pfs/virtio-9p-local.c
index 0a015de..afaff78 100644
--- a/hw/9pfs/virtio-9p-local.c
+++ b/hw/9pfs/virtio-9p-local.c
@@ -26,7 +26,7 @@ static int local_lstat(FsContext *fs_ctx, const char *path, struct stat *stbuf)
     int err;
     err =  lstat(rpath(fs_ctx, path), stbuf);
     if (err) {
-        return err;
+        return -errno;
     }
     if (fs_ctx->fs_sm == SM_MAPPED) {
         /* Actual credentials are part of extended attrs */
@@ -51,7 +51,7 @@ static int local_lstat(FsContext *fs_ctx, const char *path, struct stat *stbuf)
                 stbuf->st_rdev = tmp_dev;
         }
     }
-    return err;
+    return 0;
 }
 
 static int local_set_xattr(const char *path, FsCred *credp)
@@ -61,28 +61,28 @@ static int local_set_xattr(const char *path, FsCred *credp)
         err = setxattr(path, "user.virtfs.uid", &credp->fc_uid, sizeof(uid_t),
                 0);
         if (err) {
-            return err;
+            return -errno;
         }
     }
     if (credp->fc_gid != -1) {
         err = setxattr(path, "user.virtfs.gid", &credp->fc_gid, sizeof(gid_t),
                 0);
         if (err) {
-            return err;
+            return -errno;
         }
     }
     if (credp->fc_mode != -1) {
         err = setxattr(path, "user.virtfs.mode", &credp->fc_mode,
                 sizeof(mode_t), 0);
         if (err) {
-            return err;
+            return -errno;
         }
     }
     if (credp->fc_rdev != -1) {
         err = setxattr(path, "user.virtfs.rdev", &credp->fc_rdev,
                 sizeof(dev_t), 0);
         if (err) {
-            return err;
+            return -errno;
         }
     }
     return 0;
@@ -92,7 +92,7 @@ static int local_post_create_passthrough(FsContext *fs_ctx, const char *path,
         FsCred *credp)
 {
     if (chmod(rpath(fs_ctx, path), credp->fc_mode & 07777) < 0) {
-        return -1;
+        return -errno;
     }
     if (lchown(rpath(fs_ctx, path), credp->fc_uid, credp->fc_gid) < 0) {
         /*
@@ -100,7 +100,7 @@ static int local_post_create_passthrough(FsContext *fs_ctx, const char *path,
          * using security model none. Ignore the error
          */
         if (fs_ctx->fs_sm != SM_NONE) {
-            return -1;
+            return -errno;
         }
     }
     return 0;
@@ -114,38 +114,40 @@ static ssize_t local_readlink(FsContext *fs_ctx, const char *path,
         int fd;
         fd = open(rpath(fs_ctx, path), O_RDONLY);
         if (fd == -1) {
-            return -1;
+            return -errno;
         }
         do {
             tsize = read(fd, (void *)buf, bufsz);
         } while (tsize == -1 && errno == EINTR);
         close(fd);
-        return tsize;
+        return tsize >= 0 ? tsize : -errno;
     } else if ((fs_ctx->fs_sm == SM_PASSTHROUGH) ||
                (fs_ctx->fs_sm == SM_NONE)) {
         tsize = readlink(rpath(fs_ctx, path), buf, bufsz);
     }
-    return tsize;
+    return tsize >= 0 ? tsize : -errno;
 }
 
 static int local_close(FsContext *ctx, int fd)
 {
-    return close(fd);
+    return close(fd) ? -errno : 0;
 }
 
 static int local_closedir(FsContext *ctx, DIR *dir)
 {
-    return closedir(dir);
+    return closedir(dir) ? -errno : 0;
 }
 
 static int local_open(FsContext *ctx, const char *path, int flags)
 {
-    return open(rpath(ctx, path), flags);
+    int ret = open(rpath(ctx, path), flags);
+    return ret >= 0 ? ret : -errno;
 }
 
-static DIR *local_opendir(FsContext *ctx, const char *path)
+static int local_opendir(FsContext *ctx, const char *path, DIR **dir)
 {
-    return opendir(rpath(ctx, path));
+    *dir = opendir(rpath(ctx, path));
+    return *dir ? 0 : -errno;
 }
 
 static void local_rewinddir(FsContext *ctx, DIR *dir)
@@ -155,12 +157,15 @@ static void local_rewinddir(FsContext *ctx, DIR *dir)
 
 static off_t local_telldir(FsContext *ctx, DIR *dir)
 {
-    return telldir(dir);
+    int ret = telldir(dir);
+    return ret >= 0 ? ret : -errno;
 }
 
-static struct dirent *local_readdir(FsContext *ctx, DIR *dir)
+static int local_readdir(FsContext *ctx, DIR *dir, struct dirent **dirent)
 {
-    return readdir(dir);
+    *dirent = readdir(dir);
+    return dirent ? 0 : -errno;
+
 }
 
 static void local_seekdir(FsContext *ctx, DIR *dir, off_t off)
@@ -171,14 +176,17 @@ static void local_seekdir(FsContext *ctx, DIR *dir, off_t off)
 static ssize_t local_preadv(FsContext *ctx, int fd, const struct iovec *iov,
                             int iovcnt, off_t offset)
 {
+    int err;
 #ifdef CONFIG_PREADV
-    return preadv(fd, iov, iovcnt, offset);
+    err = preadv(fd, iov, iovcnt, offset);
+    return err >= 0 ? err : -errno;
 #else
     int err = lseek(fd, offset, SEEK_SET);
     if (err == -1) {
-        return err;
+        return -errno;
     } else {
-        return readv(fd, iov, iovcnt);
+        err = readv(fd, iov, iovcnt);
+        return err >= 0 ? err : -errno;
     }
 #endif
 }
@@ -186,27 +194,32 @@ static ssize_t local_preadv(FsContext *ctx, int fd, const struct iovec *iov,
 static ssize_t local_pwritev(FsContext *ctx, int fd, const struct iovec *iov,
                             int iovcnt, off_t offset)
 {
+    int err;
 #ifdef CONFIG_PREADV
-    return pwritev(fd, iov, iovcnt, offset);
+    err = pwritev(fd, iov, iovcnt, offset);
+    return err >= 0 ? err : -errno;
 #else
     int err = lseek(fd, offset, SEEK_SET);
     if (err == -1) {
-        return err;
+        return -errno;
     } else {
-        return writev(fd, iov, iovcnt);
+        err = writev(fd, iov, iovcnt);
+        return err >= 0 ? err : -errno;
     }
 #endif
 }
 
 static int local_chmod(FsContext *fs_ctx, const char *path, FsCred *credp)
 {
+    int ret;
     if (fs_ctx->fs_sm == SM_MAPPED) {
         return local_set_xattr(rpath(fs_ctx, path), credp);
     } else if ((fs_ctx->fs_sm == SM_PASSTHROUGH) ||
                (fs_ctx->fs_sm == SM_NONE)) {
-        return chmod(rpath(fs_ctx, path), credp->fc_mode);
+        ret = chmod(rpath(fs_ctx, path), credp->fc_mode);
+        return ret >= 0 ? ret : -errno;
     }
-    return -1;
+    return -ENOTSUP;
 }
 
 static int local_mknod(FsContext *fs_ctx, const char *path, FsCred *credp)
@@ -218,7 +231,7 @@ static int local_mknod(FsContext *fs_ctx, const char *path, FsCred *credp)
     if (fs_ctx->fs_sm == SM_MAPPED) {
         err = mknod(rpath(fs_ctx, path), SM_LOCAL_MODE_BITS|S_IFREG, 0);
         if (err == -1) {
-            return err;
+            return -errno;
         }
         local_set_xattr(rpath(fs_ctx, path), credp);
         if (err == -1) {
@@ -229,7 +242,7 @@ static int local_mknod(FsContext *fs_ctx, const char *path, FsCred *credp)
                (fs_ctx->fs_sm == SM_NONE)) {
         err = mknod(rpath(fs_ctx, path), credp->fc_mode, credp->fc_rdev);
         if (err == -1) {
-            return err;
+            return -errno;
         }
         err = local_post_create_passthrough(fs_ctx, path, credp);
         if (err == -1) {
@@ -237,12 +250,12 @@ static int local_mknod(FsContext *fs_ctx, const char *path, FsCred *credp)
             goto err_end;
         }
     }
-    return err;
+    return 0;
 
 err_end:
     remove(rpath(fs_ctx, path));
     errno = serrno;
-    return err;
+    return -errno;
 }
 
 static int local_mkdir(FsContext *fs_ctx, const char *path, FsCred *credp)
@@ -254,7 +267,7 @@ static int local_mkdir(FsContext *fs_ctx, const char *path, FsCred *credp)
     if (fs_ctx->fs_sm == SM_MAPPED) {
         err = mkdir(rpath(fs_ctx, path), SM_LOCAL_DIR_MODE_BITS);
         if (err == -1) {
-            return err;
+            return -errno;
         }
         credp->fc_mode = credp->fc_mode|S_IFDIR;
         err = local_set_xattr(rpath(fs_ctx, path), credp);
@@ -266,7 +279,7 @@ static int local_mkdir(FsContext *fs_ctx, const char *path, FsCred *credp)
                (fs_ctx->fs_sm == SM_NONE)) {
         err = mkdir(rpath(fs_ctx, path), credp->fc_mode);
         if (err == -1) {
-            return err;
+            return -errno;
         }
         err = local_post_create_passthrough(fs_ctx, path, credp);
         if (err == -1) {
@@ -274,12 +287,12 @@ static int local_mkdir(FsContext *fs_ctx, const char *path, FsCred *credp)
             goto err_end;
         }
     }
-    return err;
+    return 0;
 
 err_end:
     remove(rpath(fs_ctx, path));
     errno = serrno;
-    return err;
+    return -errno;
 }
 
 static int local_fstat(FsContext *fs_ctx, int fd, struct stat *stbuf)
@@ -287,7 +300,7 @@ static int local_fstat(FsContext *fs_ctx, int fd, struct stat *stbuf)
     int err;
     err = fstat(fd, stbuf);
     if (err) {
-        return err;
+        return -errno;
     }
     if (fs_ctx->fs_sm == SM_MAPPED) {
         /* Actual credentials are part of extended attrs */
@@ -309,7 +322,7 @@ static int local_fstat(FsContext *fs_ctx, int fd, struct stat *stbuf)
                 stbuf->st_rdev = tmp_dev;
         }
     }
-    return err;
+    return 0;
 }
 
 static int local_open2(FsContext *fs_ctx, const char *path, int flags,
@@ -323,7 +336,7 @@ static int local_open2(FsContext *fs_ctx, const char *path, int flags,
     if (fs_ctx->fs_sm == SM_MAPPED) {
         fd = open(rpath(fs_ctx, path), flags, SM_LOCAL_MODE_BITS);
         if (fd == -1) {
-            return fd;
+            return -errno;
         }
         credp->fc_mode = credp->fc_mode|S_IFREG;
         /* Set cleint credentials in xattr */
@@ -336,7 +349,7 @@ static int local_open2(FsContext *fs_ctx, const char *path, int flags,
                (fs_ctx->fs_sm == SM_NONE)) {
         fd = open(rpath(fs_ctx, path), flags, credp->fc_mode);
         if (fd == -1) {
-            return fd;
+            return -errno;
         }
         err = local_post_create_passthrough(fs_ctx, path, credp);
         if (err == -1) {
@@ -350,7 +363,7 @@ err_end:
     close(fd);
     remove(rpath(fs_ctx, path));
     errno = serrno;
-    return err;
+    return -errno;
 }
 
 
@@ -367,7 +380,7 @@ static int local_symlink(FsContext *fs_ctx, const char *oldpath,
         fd = open(rpath(fs_ctx, newpath), O_CREAT|O_EXCL|O_RDWR,
                 SM_LOCAL_MODE_BITS);
         if (fd == -1) {
-            return fd;
+            return -errno;
         }
         /* Write the oldpath (target) to the file. */
         oldpath_size = strlen(oldpath);
@@ -393,7 +406,7 @@ static int local_symlink(FsContext *fs_ctx, const char *oldpath,
                (fs_ctx->fs_sm == SM_NONE)) {
         err = symlink(oldpath, rpath(fs_ctx, newpath));
         if (err) {
-            return err;
+            return -errno;
         }
         err = lchown(rpath(fs_ctx, newpath), credp->fc_uid, credp->fc_gid);
         if (err == -1) {
@@ -408,12 +421,12 @@ static int local_symlink(FsContext *fs_ctx, const char *oldpath,
                 err = 0;
         }
     }
-    return err;
+    return 0;
 
 err_end:
     remove(rpath(fs_ctx, newpath));
     errno = serrno;
-    return err;
+    return -errno;
 }
 
 static int local_link(FsContext *ctx, const char *oldpath, const char *newpath)
@@ -436,12 +449,12 @@ static int local_link(FsContext *ctx, const char *oldpath, const char *newpath)
         errno = serrno;
     }
 
-    return err;
+    return err >= 0 ? err : -errno;
 }
 
 static int local_truncate(FsContext *ctx, const char *path, off_t size)
 {
-    return truncate(rpath(ctx, path), size);
+    return truncate(rpath(ctx, path), size) ? -errno : 0;
 }
 
 static int local_rename(FsContext *ctx, const char *oldpath,
@@ -461,7 +474,7 @@ static int local_rename(FsContext *ctx, const char *oldpath,
         qemu_free(tmp);
     }
 
-    return err;
+    return err >= 0 ? err : -errno;
 
 }
 
@@ -469,14 +482,14 @@ static int local_chown(FsContext *fs_ctx, const char *path, FsCred *credp)
 {
     if ((credp->fc_uid == -1 && credp->fc_gid == -1) ||
             (fs_ctx->fs_sm == SM_PASSTHROUGH)) {
-        return lchown(rpath(fs_ctx, path), credp->fc_uid, credp->fc_gid);
+        return lchown(rpath(fs_ctx, path), credp->fc_uid, credp->fc_gid) ? -errno : 0;
     } else if (fs_ctx->fs_sm == SM_MAPPED) {
         return local_set_xattr(rpath(fs_ctx, path), credp);
     } else if ((fs_ctx->fs_sm == SM_PASSTHROUGH) ||
                (fs_ctx->fs_sm == SM_NONE)) {
-        return lchown(rpath(fs_ctx, path), credp->fc_uid, credp->fc_gid);
+        return lchown(rpath(fs_ctx, path), credp->fc_uid, credp->fc_gid) ? -errno : 0;
     }
-    return -1;
+    return -EINVAL;
 }
 
 static int local_utimensat(FsContext *s, const char *path,
@@ -487,21 +500,21 @@ static int local_utimensat(FsContext *s, const char *path,
 
 static int local_remove(FsContext *ctx, const char *path)
 {
-    return remove(rpath(ctx, path));
+    return remove(rpath(ctx, path)) ? -errno : 0;
 }
 
 static int local_fsync(FsContext *ctx, int fd, int datasync)
 {
     if (datasync) {
-        return qemu_fdatasync(fd);
+        return qemu_fdatasync(fd) ? -errno : 0;
     } else {
-        return fsync(fd);
+        return fsync(fd) ? -errno : 0;
     }
 }
 
 static int local_statfs(FsContext *s, const char *path, struct statfs *stbuf)
 {
-   return statfs(rpath(s, path), stbuf);
+   return statfs(rpath(s, path), stbuf) ? - errno : 0;
 }
 
 static ssize_t local_lgetxattr(FsContext *ctx, const char *path,
diff --git a/hw/9pfs/virtio-9p-xattr.c b/hw/9pfs/virtio-9p-xattr.c
index 03c3d3f..b37ea44 100644
--- a/hw/9pfs/virtio-9p-xattr.c
+++ b/hw/9pfs/virtio-9p-xattr.c
@@ -32,9 +32,14 @@ static XattrOperations *get_xattr_operations(XattrOperations **h,
 ssize_t v9fs_get_xattr(FsContext *ctx, const char *path,
                        const char *name, void *value, size_t size)
 {
+    int ret;
     XattrOperations *xops = get_xattr_operations(ctx->xops, name);
     if (xops) {
-        return xops->getxattr(ctx, path, name, value, size);
+        ret = xops->getxattr(ctx, path, name, value, size);
+        if (ret < 0) {
+            return -errno;
+        }
+        return ret;
     }
     errno = -EOPNOTSUPP;
     return -1;
@@ -117,9 +122,14 @@ err_out:
 int v9fs_set_xattr(FsContext *ctx, const char *path, const char *name,
                    void *value, size_t size, int flags)
 {
+    int ret;
     XattrOperations *xops = get_xattr_operations(ctx->xops, name);
     if (xops) {
-        return xops->setxattr(ctx, path, name, value, size, flags);
+        ret = xops->setxattr(ctx, path, name, value, size, flags);
+        if (ret < 0) {
+            return -errno;
+        }
+        return ret;
     }
     errno = -EOPNOTSUPP;
     return -1;
@@ -129,9 +139,14 @@ int v9fs_set_xattr(FsContext *ctx, const char *path, const char *name,
 int v9fs_remove_xattr(FsContext *ctx,
                       const char *path, const char *name)
 {
+    int ret;
     XattrOperations *xops = get_xattr_operations(ctx->xops, name);
     if (xops) {
-        return xops->removexattr(ctx, path, name);
+        ret = xops->removexattr(ctx, path, name);
+        if (ret < 0) {
+            return -errno;
+        }
+        return ret;
     }
     errno = -EOPNOTSUPP;
     return -1;
diff --git a/hw/9pfs/virtio-9p.c b/hw/9pfs/virtio-9p.c
index 9d72021..374a766 100644
--- a/hw/9pfs/virtio-9p.c
+++ b/hw/9pfs/virtio-9p.c
@@ -110,9 +110,9 @@ static int v9fs_do_open(V9fsState *s, V9fsString *path, int flags)
     return s->ops->open(&s->ctx, path->data, flags);
 }
 
-static DIR *v9fs_do_opendir(V9fsState *s, V9fsString *path)
+static int v9fs_do_opendir(V9fsState *s, V9fsString *path, DIR **dir)
 {
-    return s->ops->opendir(&s->ctx, path->data);
+    return s->ops->opendir(&s->ctx, path->data, dir);
 }
 
 static void v9fs_do_rewinddir(V9fsState *s, DIR *dir)
@@ -125,9 +125,9 @@ static off_t v9fs_do_telldir(V9fsState *s, DIR *dir)
     return s->ops->telldir(&s->ctx, dir);
 }
 
-static struct dirent *v9fs_do_readdir(V9fsState *s, DIR *dir)
+static int v9fs_do_readdir(V9fsState *s, DIR *dir, struct dirent **dirent)
 {
-    return s->ops->readdir(&s->ctx, dir);
+    return s->ops->readdir(&s->ctx, dir, dirent);
 }
 
 static void v9fs_do_seekdir(V9fsState *s, DIR *dir, off_t off)
@@ -1038,8 +1038,7 @@ static int stat_to_v9stat(V9fsState *s, V9fsString *name,
 
     if (v9stat->mode & P9_STAT_MODE_SYMLINK) {
         err = v9fs_do_readlink(s, name, &v9stat->extension);
-        if (err == -1) {
-            err = -errno;
+        if (err < 0) {
             return err;
         }
         v9stat->extension.data[err] = 0;
@@ -1234,8 +1233,7 @@ out:
 
 static void v9fs_stat_post_lstat(V9fsState *s, V9fsStatState *vs, int err)
 {
-    if (err == -1) {
-        err = -errno;
+    if (err < 0) {
         goto out;
     }
 
@@ -1263,9 +1261,8 @@ static void v9fs_stat(V9fsState *s, V9fsPDU *pdu)
     vs->offset = 7;
 
     memset(&vs->v9stat, 0, sizeof(vs->v9stat));
-
     pdu_unmarshal(vs->pdu, vs->offset, "d", &fid);
-
+    
     vs->fidp = lookup_fid(s, fid);
     if (vs->fidp == NULL) {
         err = -ENOENT;
@@ -1285,8 +1282,7 @@ out:
 static void v9fs_getattr_post_lstat(V9fsState *s, V9fsStatStateDotl *vs,
                                                                 int err)
 {
-    if (err == -1) {
-        err = -errno;
+    if (err < 0) {
         goto out;
     }
 
@@ -1348,8 +1344,7 @@ out:
 static void v9fs_setattr_post_truncate(V9fsState *s, V9fsSetattrState *vs,
                                                                   int err)
 {
-    if (err == -1) {
-        err = -errno;
+    if (err < 0) {
         goto out;
     }
     err = vs->offset;
@@ -1361,8 +1356,7 @@ out:
 
 static void v9fs_setattr_post_chown(V9fsState *s, V9fsSetattrState *vs, int err)
 {
-    if (err == -1) {
-        err = -errno;
+    if (err < 0) {
         goto out;
     }
 
@@ -1380,8 +1374,7 @@ out:
 static void v9fs_setattr_post_utimensat(V9fsState *s, V9fsSetattrState *vs,
                                                                    int err)
 {
-    if (err == -1) {
-        err = -errno;
+    if (err < 0) {
         goto out;
     }
 
@@ -1410,8 +1403,7 @@ out:
 
 static void v9fs_setattr_post_chmod(V9fsState *s, V9fsSetattrState *vs, int err)
 {
-    if (err == -1) {
-        err = -errno;
+    if (err < 0) {
         goto out;
     }
 
@@ -1506,7 +1498,7 @@ static void v9fs_walk_marshal(V9fsWalkState *vs)
 static void v9fs_walk_post_newfid_lstat(V9fsState *s, V9fsWalkState *vs,
                                                                 int err)
 {
-    if (err == -1) {
+    if (err < 0) {
         free_fid(s, vs->newfidp->fid);
         v9fs_string_free(&vs->path);
         err = -ENOENT;
@@ -1536,7 +1528,7 @@ out:
 static void v9fs_walk_post_oldfid_lstat(V9fsState *s, V9fsWalkState *vs,
         int err)
 {
-    if (err == -1) {
+    if (err < 0) {
         v9fs_string_free(&vs->path);
         err = -ENOENT;
         goto out;
@@ -1665,8 +1657,7 @@ static int32_t get_iounit(V9fsState *s, V9fsString *name)
 
 static void v9fs_open_post_opendir(V9fsState *s, V9fsOpenState *vs, int err)
 {
-    if (vs->fidp->fs.dir == NULL) {
-        err = -errno;
+    if (err < 0) {
         goto out;
     }
     vs->fidp->fid_type = P9_FID_DIR;
@@ -1689,8 +1680,7 @@ static void v9fs_open_post_getiounit(V9fsState *s, V9fsOpenState *vs)
 
 static void v9fs_open_post_open(V9fsState *s, V9fsOpenState *vs, int err)
 {
-    if (vs->fidp->fs.fd == -1) {
-        err = -errno;
+    if (vs->fidp->fs.fd < 0) {
         goto out;
     }
     vs->fidp->fid_type = P9_FID_FILE;
@@ -1707,14 +1697,13 @@ static void v9fs_open_post_lstat(V9fsState *s, V9fsOpenState *vs, int err)
     int flags;
 
     if (err) {
-        err = -errno;
         goto out;
     }
 
     stat_to_qid(&vs->stbuf, &vs->qid);
 
     if (S_ISDIR(vs->stbuf.st_mode)) {
-        vs->fidp->fs.dir = v9fs_do_opendir(s, &vs->fidp->path);
+        err = v9fs_do_opendir(s, &vs->fidp->path, &vs->fidp->fs.dir);
         v9fs_open_post_opendir(s, vs, err);
     } else {
         if (s->proto_version == V9FS_PROTO_2000L) {
@@ -1778,7 +1767,6 @@ static void v9fs_post_lcreate(V9fsState *s, V9fsLcreateState *vs, int err)
         err = vs->offset;
     } else {
         vs->fidp->fid_type = P9_FID_NONE;
-        err = -errno;
         if (vs->fidp->fs.fd > 0) {
             close(vs->fidp->fs.fd);
         }
@@ -1794,7 +1782,6 @@ static void v9fs_lcreate_post_get_iounit(V9fsState *s, V9fsLcreateState *vs,
         int err)
 {
     if (err) {
-        err = -errno;
         goto out;
     }
     err = v9fs_do_lstat(s, &vs->fullname, &vs->stbuf);
@@ -1806,8 +1793,7 @@ out:
 static void v9fs_lcreate_post_do_open2(V9fsState *s, V9fsLcreateState *vs,
         int err)
 {
-    if (vs->fidp->fs.fd == -1) {
-        err = -errno;
+    if (vs->fidp->fs.fd < 0) {
         goto out;
     }
     vs->fidp->fid_type = P9_FID_FILE;
@@ -1860,9 +1846,6 @@ out:
 
 static void v9fs_post_do_fsync(V9fsState *s, V9fsPDU *pdu, int err)
 {
-    if (err == -1) {
-        err = -errno;
-    }
     complete_pdu(s, pdu, err);
 }
 
@@ -1932,7 +1915,6 @@ static void v9fs_read_post_dir_lstat(V9fsState *s, V9fsReadState *vs,
                                     ssize_t err)
 {
     if (err) {
-        err = -errno;
         goto out;
     }
     err = stat_to_v9stat(s, &vs->name, &vs->stbuf, &vs->v9stat);
@@ -1952,7 +1934,7 @@ static void v9fs_read_post_dir_lstat(V9fsState *s, V9fsReadState *vs,
     v9fs_stat_free(&vs->v9stat);
     v9fs_string_free(&vs->name);
     vs->dir_pos = vs->dent->d_off;
-    vs->dent = v9fs_do_readdir(s, vs->fidp->fs.dir);
+    err = v9fs_do_readdir(s, vs->fidp->fs.dir, &vs->dent);
     v9fs_read_post_readdir(s, vs, err);
     return;
 out:
@@ -1984,7 +1966,7 @@ static void v9fs_read_post_readdir(V9fsState *s, V9fsReadState *vs, ssize_t err)
 
 static void v9fs_read_post_telldir(V9fsState *s, V9fsReadState *vs, ssize_t err)
 {
-    vs->dent = v9fs_do_readdir(s, vs->fidp->fs.dir);
+    v9fs_do_readdir(s, vs->fidp->fs.dir, &vs->dent);
     v9fs_read_post_readdir(s, vs, err);
     return;
 }
@@ -2000,8 +1982,6 @@ static void v9fs_read_post_rewinddir(V9fsState *s, V9fsReadState *vs,
 static void v9fs_read_post_preadv(V9fsState *s, V9fsReadState *vs, ssize_t err)
 {
     if (err  < 0) {
-        /* IO error return the error */
-        err = -errno;
         goto out;
     }
     vs->total += vs->len;
@@ -2017,9 +1997,6 @@ static void v9fs_read_post_preadv(V9fsState *s, V9fsReadState *vs, ssize_t err)
                 vs->off += vs->len;
             }
         } while (vs->len == -1 && errno == EINTR);
-        if (vs->len == -1) {
-            err  = -errno;
-        }
         v9fs_read_post_preadv(s, vs, err);
         return;
     }
@@ -2170,7 +2147,7 @@ static void v9fs_readdir_post_readdir(V9fsState *s, V9fsReadDirState *vs)
         vs->count += len;
         v9fs_string_free(&vs->name);
         vs->saved_dir_pos = vs->dent->d_off;
-        vs->dent = v9fs_do_readdir(s, vs->fidp->fs.dir);
+        v9fs_do_readdir(s, vs->fidp->fs.dir, &vs->dent);
         v9fs_readdir_post_readdir(s, vs);
         return;
     }
@@ -2184,7 +2161,7 @@ static void v9fs_readdir_post_readdir(V9fsState *s, V9fsReadDirState *vs)
 
 static void v9fs_readdir_post_telldir(V9fsState *s, V9fsReadDirState *vs)
 {
-    vs->dent = v9fs_do_readdir(s, vs->fidp->fs.dir);
+    v9fs_do_readdir(s, vs->fidp->fs.dir, &vs->dent);
     v9fs_readdir_post_readdir(s, vs);
     return;
 }
@@ -2236,8 +2213,6 @@ static void v9fs_write_post_pwritev(V9fsState *s, V9fsWriteState *vs,
                                    ssize_t err)
 {
     if (err  < 0) {
-        /* IO error return the error */
-        err = -errno;
         goto out;
     }
     vs->total += vs->len;
@@ -2253,9 +2228,6 @@ static void v9fs_write_post_pwritev(V9fsState *s, V9fsWriteState *vs,
                 vs->off += vs->len;
             }
         } while (vs->len == -1 && errno == EINTR);
-        if (vs->len == -1) {
-            err  = -errno;
-        }
         v9fs_write_post_pwritev(s, vs, err);
         return;
     }
@@ -2394,18 +2366,12 @@ static void v9fs_post_create(V9fsState *s, V9fsCreateState *vs, int err)
 
 static void v9fs_create_post_perms(V9fsState *s, V9fsCreateState *vs, int err)
 {
-    if (err) {
-        err = -errno;
-    }
     v9fs_post_create(s, vs, err);
 }
 
 static void v9fs_create_post_opendir(V9fsState *s, V9fsCreateState *vs,
                                                                     int err)
 {
-    if (!vs->fidp->fs.dir) {
-        err = -errno;
-    }
     vs->fidp->fid_type = P9_FID_DIR;
     v9fs_post_create(s, vs, err);
 }
@@ -2414,11 +2380,10 @@ static void v9fs_create_post_dir_lstat(V9fsState *s, V9fsCreateState *vs,
                                                                     int err)
 {
     if (err) {
-        err = -errno;
         goto out;
     }
 
-    vs->fidp->fs.dir = v9fs_do_opendir(s, &vs->fullname);
+    err = v9fs_do_opendir(s, &vs->fullname, &vs->fidp->fs.dir);
     v9fs_create_post_opendir(s, vs, err);
     return;
 
@@ -2429,7 +2394,6 @@ out:
 static void v9fs_create_post_mkdir(V9fsState *s, V9fsCreateState *vs, int err)
 {
     if (err) {
-        err = -errno;
         goto out;
     }
 
@@ -2446,7 +2410,6 @@ static void v9fs_create_post_fstat(V9fsState *s, V9fsCreateState *vs, int err)
     if (err) {
         vs->fidp->fid_type = P9_FID_NONE;
         close(vs->fidp->fs.fd);
-        err = -errno;
     }
     v9fs_post_create(s, vs, err);
     return;
@@ -2455,7 +2418,6 @@ 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;
         goto out;
     }
     vs->fidp->fid_type = P9_FID_FILE;
@@ -2472,8 +2434,7 @@ out:
 static void v9fs_create_post_lstat(V9fsState *s, V9fsCreateState *vs, int err)
 {
 
-    if (err == 0 || errno != ENOENT) {
-        err = -errno;
+    if (err == 0 || err != -ENOENT) {
         goto out;
     }
 
@@ -2501,7 +2462,6 @@ static void v9fs_create_post_lstat(V9fsState *s, V9fsCreateState *vs, int err)
 
         if (sscanf(vs->extension.data, "%c %u %u", &ctype, &major,
                                         &minor) != 3) {
-            err = -errno;
             v9fs_post_create(s, vs, err);
         }
 
@@ -2583,8 +2543,6 @@ static void v9fs_post_symlink(V9fsState *s, V9fsSymlinkState *vs, int err)
         stat_to_qid(&vs->stbuf, &vs->qid);
         vs->offset += pdu_marshal(vs->pdu, vs->offset, "Q", &vs->qid);
         err = vs->offset;
-    } else {
-        err = -errno;
     }
     complete_pdu(s, vs->pdu, err);
     v9fs_string_free(&vs->name);
@@ -2660,22 +2618,17 @@ static void v9fs_link(V9fsState *s, V9fsPDU *pdu)
 
     dfidp = lookup_fid(s, dfid);
     if (dfidp == NULL) {
-        err = -errno;
         goto out;
     }
 
     oldfidp = lookup_fid(s, oldfid);
     if (oldfidp == NULL) {
-        err = -errno;
         goto out;
     }
 
     v9fs_string_sprintf(&fullname, "%s/%s", dfidp->path.data, name.data);
     err = offset;
     err = v9fs_do_link(s, &oldfidp->path, &fullname);
-    if (err) {
-        err = -errno;
-    }
     v9fs_string_free(&fullname);
 
 out:
@@ -2686,9 +2639,7 @@ out:
 static void v9fs_remove_post_remove(V9fsState *s, V9fsRemoveState *vs,
                                                                 int err)
 {
-    if (err < 0) {
-        err = -errno;
-    } else {
+    if (err == 0) {
         err = vs->offset;
     }
 
@@ -2746,9 +2697,7 @@ static void v9fs_wstat_post_rename(V9fsState *s, V9fsWstatState *vs, int err)
         goto out;
     }
     if (vs->v9stat.length != -1) {
-        if (v9fs_do_truncate(s, &vs->fidp->path, vs->v9stat.length) < 0) {
-            err = -errno;
-        }
+        err = v9fs_do_truncate(s, &vs->fidp->path, vs->v9stat.length);
     }
     v9fs_wstat_post_truncate(s, vs, err);
     return;
@@ -2800,9 +2749,8 @@ static int v9fs_complete_rename(V9fsState *s, V9fsRenameState *vs)
     vs->name.size = strlen(new_name);
 
     if (strcmp(new_name, vs->fidp->path.data) != 0) {
-        if (v9fs_do_rename(s, &vs->fidp->path, &vs->name)) {
-            err = -errno;
-        } else {
+        err = v9fs_do_rename(s, &vs->fidp->path, &vs->name);
+        if (!err) {
             V9fsFidState *fidp;
             /*
             * Fixup fid's pointing to the old name to
@@ -2908,10 +2856,8 @@ static void v9fs_wstat_post_utime(V9fsState *s, V9fsWstatState *vs, int err)
     }
 
     if (vs->v9stat.n_gid != -1 || vs->v9stat.n_uid != -1) {
-        if (v9fs_do_chown(s, &vs->fidp->path, vs->v9stat.n_uid,
-                    vs->v9stat.n_gid)) {
-            err = -errno;
-        }
+        err = v9fs_do_chown(s, &vs->fidp->path, vs->v9stat.n_uid,
+                    vs->v9stat.n_gid);
     }
     v9fs_wstat_post_chown(s, vs, err);
     return;
@@ -2943,9 +2889,7 @@ static void v9fs_wstat_post_chmod(V9fsState *s, V9fsWstatState *vs, int err)
             times[1].tv_nsec = UTIME_OMIT;
         }
 
-        if (v9fs_do_utimensat(s, &vs->fidp->path, times)) {
-            err = -errno;
-        }
+        err = v9fs_do_utimensat(s, &vs->fidp->path, times);
     }
 
     v9fs_wstat_post_utime(s, vs, err);
@@ -2959,9 +2903,6 @@ out:
 
 static void v9fs_wstat_post_fsync(V9fsState *s, V9fsWstatState *vs, int err)
 {
-    if (err == -1) {
-        err = -errno;
-    }
     v9fs_stat_free(&vs->v9stat);
     complete_pdu(s, vs->pdu, err);
     qemu_free(vs);
@@ -2971,8 +2912,7 @@ static void v9fs_wstat_post_lstat(V9fsState *s, V9fsWstatState *vs, int err)
 {
     uint32_t v9_mode;
 
-    if (err == -1) {
-        err = -errno;
+    if (err < 0) {
         goto out;
     }
 
@@ -2985,10 +2925,8 @@ static void v9fs_wstat_post_lstat(V9fsState *s, V9fsWstatState *vs, int err)
             goto out;
     }
 
-    if (v9fs_do_chmod(s, &vs->fidp->path, v9mode_to_mode(vs->v9stat.mode,
-                    &vs->v9stat.extension))) {
-            err = -errno;
-     }
+    err = v9fs_do_chmod(s, &vs->fidp->path, v9mode_to_mode(vs->v9stat.mode,
+                    &vs->v9stat.extension));
     v9fs_wstat_post_chmod(s, vs, err);
     return;
 
@@ -3049,7 +2987,6 @@ static void v9fs_statfs_post_statfs(V9fsState *s, V9fsStatfsState *vs, int err)
     int32_t bsize_factor;
 
     if (err) {
-        err = -errno;
         goto out;
     }
 
@@ -3119,8 +3056,7 @@ out:
 
 static void v9fs_mknod_post_lstat(V9fsState *s, V9fsMkState *vs, int err)
 {
-    if (err == -1) {
-        err = -errno;
+    if (err < 0) {
         goto out;
     }
 
@@ -3136,8 +3072,7 @@ out:
 
 static void v9fs_mknod_post_mknod(V9fsState *s, V9fsMkState *vs, int err)
 {
-    if (err == -1) {
-        err = -errno;
+    if (err < 0) {
         goto out;
     }
 
@@ -3234,7 +3169,6 @@ static void v9fs_lock(V9fsState *s, V9fsPDU *pdu)
         goto out;
     }
     if (err < 0) {
-        err = -errno;
         goto out;
     }
     vs->status = P9_LOCK_SUCCESS;
@@ -3280,7 +3214,6 @@ static void v9fs_getlock(V9fsState *s, V9fsPDU *pdu)
         goto out;
     }
     if (err < 0) {
-        err = -errno;
         goto out;
     }
     vs->glock->type = F_UNLCK;
@@ -3295,8 +3228,7 @@ out:
 
 static void v9fs_mkdir_post_lstat(V9fsState *s, V9fsMkState *vs, int err)
 {
-    if (err == -1) {
-        err = -errno;
+    if (err < 0) {
         goto out;
     }
 
@@ -3312,8 +3244,7 @@ out:
 
 static void v9fs_mkdir_post_mkdir(V9fsState *s, V9fsMkState *vs, int err)
 {
-    if (err == -1) {
-        err = -errno;
+    if (err < 0) {
         goto out;
     }
 
@@ -3366,7 +3297,6 @@ static void v9fs_post_xattr_getvalue(V9fsState *s, V9fsXattrState *vs, int err)
 {
 
     if (err < 0) {
-        err = -errno;
         free_fid(s, vs->xattr_fidp->fid);
         goto out;
     }
@@ -3382,7 +3312,6 @@ out:
 static void v9fs_post_xattr_check(V9fsState *s, V9fsXattrState *vs, ssize_t err)
 {
     if (err < 0) {
-        err = -errno;
         free_fid(s, vs->xattr_fidp->fid);
         goto out;
     }
@@ -3410,7 +3339,6 @@ static void v9fs_post_lxattr_getvalue(V9fsState *s,
                                       V9fsXattrState *vs, int err)
 {
     if (err < 0) {
-        err = -errno;
         free_fid(s, vs->xattr_fidp->fid);
         goto out;
     }
@@ -3427,7 +3355,6 @@ static void v9fs_post_lxattr_check(V9fsState *s,
                                    V9fsXattrState *vs, ssize_t err)
 {
     if (err < 0) {
-        err = -errno;
         free_fid(s, vs->xattr_fidp->fid);
         goto out;
     }
@@ -3548,7 +3475,6 @@ static void v9fs_readlink_post_readlink(V9fsState *s, V9fsReadLinkState *vs,
                                                     int err)
 {
     if (err < 0) {
-        err = -errno;
         goto out;
     }
     vs->offset += pdu_marshal(vs->pdu, vs->offset, "s", &vs->target);
