211 lines
6.8 KiB
Diff
211 lines
6.8 KiB
Diff
|
From ed6857bf98e6c8b8080be208ffe15bb678591466 Mon Sep 17 00:00:00 2001
|
||
|
From: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>
|
||
|
Date: Sun, 4 Dec 2011 22:35:28 +0530
|
||
|
Subject: [PATCH 07/25] hw/9pfs: Use the correct file descriptor in Fsdriver
|
||
|
Callback
|
||
|
|
||
|
Fsdriver callback that operate on file descriptor need to
|
||
|
differentiate between directory fd and file fd.
|
||
|
|
||
|
Based on the original patch from Sassan Panahinejad <sassan@sassan.me.uk>
|
||
|
|
||
|
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
|
||
|
---
|
||
|
fsdev/file-op-9p.h | 4 ++--
|
||
|
hw/9pfs/cofile.c | 4 ++--
|
||
|
hw/9pfs/virtio-9p-handle.c | 28 ++++++++++++++++++++++------
|
||
|
hw/9pfs/virtio-9p-local.c | 36 ++++++++++++++++++++++++++----------
|
||
|
hw/9pfs/virtio-9p-synth.c | 5 +++--
|
||
|
5 files changed, 55 insertions(+), 22 deletions(-)
|
||
|
|
||
|
diff --git a/fsdev/file-op-9p.h b/fsdev/file-op-9p.h
|
||
|
index 1928da2..a85ecd3 100644
|
||
|
--- a/fsdev/file-op-9p.h
|
||
|
+++ b/fsdev/file-op-9p.h
|
||
|
@@ -112,10 +112,10 @@ typedef struct FileOperations
|
||
|
ssize_t (*pwritev)(FsContext *, V9fsFidOpenState *,
|
||
|
const struct iovec *, int, off_t);
|
||
|
int (*mkdir)(FsContext *, V9fsPath *, const char *, FsCred *);
|
||
|
- int (*fstat)(FsContext *, V9fsFidOpenState *, struct stat *);
|
||
|
+ int (*fstat)(FsContext *, int, V9fsFidOpenState *, struct stat *);
|
||
|
int (*rename)(FsContext *, const char *, const char *);
|
||
|
int (*truncate)(FsContext *, V9fsPath *, off_t);
|
||
|
- int (*fsync)(FsContext *, V9fsFidOpenState *, int);
|
||
|
+ int (*fsync)(FsContext *, int, V9fsFidOpenState *, int);
|
||
|
int (*statfs)(FsContext *s, V9fsPath *path, struct statfs *stbuf);
|
||
|
ssize_t (*lgetxattr)(FsContext *, V9fsPath *,
|
||
|
const char *, void *, size_t);
|
||
|
diff --git a/hw/9pfs/cofile.c b/hw/9pfs/cofile.c
|
||
|
index 586b038..b15838c 100644
|
||
|
--- a/hw/9pfs/cofile.c
|
||
|
+++ b/hw/9pfs/cofile.c
|
||
|
@@ -71,7 +71,7 @@ int v9fs_co_fstat(V9fsPDU *pdu, V9fsFidState *fidp, struct stat *stbuf)
|
||
|
}
|
||
|
v9fs_co_run_in_worker(
|
||
|
{
|
||
|
- err = s->ops->fstat(&s->ctx, &fidp->fs, stbuf);
|
||
|
+ err = s->ops->fstat(&s->ctx, fidp->fid_type, &fidp->fs, stbuf);
|
||
|
if (err < 0) {
|
||
|
err = -errno;
|
||
|
}
|
||
|
@@ -192,7 +192,7 @@ int v9fs_co_fsync(V9fsPDU *pdu, V9fsFidState *fidp, int datasync)
|
||
|
}
|
||
|
v9fs_co_run_in_worker(
|
||
|
{
|
||
|
- err = s->ops->fsync(&s->ctx, &fidp->fs, datasync);
|
||
|
+ err = s->ops->fsync(&s->ctx, fidp->fid_type, &fidp->fs, datasync);
|
||
|
if (err < 0) {
|
||
|
err = -errno;
|
||
|
}
|
||
|
diff --git a/hw/9pfs/virtio-9p-handle.c b/hw/9pfs/virtio-9p-handle.c
|
||
|
index a62f690..f97d898 100644
|
||
|
--- a/hw/9pfs/virtio-9p-handle.c
|
||
|
+++ b/hw/9pfs/virtio-9p-handle.c
|
||
|
@@ -255,10 +255,17 @@ static int handle_mkdir(FsContext *fs_ctx, V9fsPath *dir_path,
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
-static int handle_fstat(FsContext *fs_ctx, V9fsFidOpenState *fs,
|
||
|
- struct stat *stbuf)
|
||
|
+static int handle_fstat(FsContext *fs_ctx, int fid_type,
|
||
|
+ V9fsFidOpenState *fs, struct stat *stbuf)
|
||
|
{
|
||
|
- return fstat(fs->fd, stbuf);
|
||
|
+ int fd;
|
||
|
+
|
||
|
+ if (fid_type == P9_FID_DIR) {
|
||
|
+ fd = dirfd(fs->dir);
|
||
|
+ } else {
|
||
|
+ fd = fs->fd;
|
||
|
+ }
|
||
|
+ return fstat(fd, stbuf);
|
||
|
}
|
||
|
|
||
|
static int handle_open2(FsContext *fs_ctx, V9fsPath *dir_path, const char *name,
|
||
|
@@ -395,12 +402,21 @@ static int handle_remove(FsContext *ctx, const char *path)
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
-static int handle_fsync(FsContext *ctx, V9fsFidOpenState *fs, int datasync)
|
||
|
+static int handle_fsync(FsContext *ctx, int fid_type,
|
||
|
+ V9fsFidOpenState *fs, int datasync)
|
||
|
{
|
||
|
+ int fd;
|
||
|
+
|
||
|
+ if (fid_type == P9_FID_DIR) {
|
||
|
+ fd = dirfd(fs->dir);
|
||
|
+ } else {
|
||
|
+ fd = fs->fd;
|
||
|
+ }
|
||
|
+
|
||
|
if (datasync) {
|
||
|
- return qemu_fdatasync(fs->fd);
|
||
|
+ return qemu_fdatasync(fd);
|
||
|
} else {
|
||
|
- return fsync(fs->fd);
|
||
|
+ return fsync(fd);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
diff --git a/hw/9pfs/virtio-9p-local.c b/hw/9pfs/virtio-9p-local.c
|
||
|
index 99ef0cd..371a94d 100644
|
||
|
--- a/hw/9pfs/virtio-9p-local.c
|
||
|
+++ b/hw/9pfs/virtio-9p-local.c
|
||
|
@@ -366,11 +366,18 @@ out:
|
||
|
return err;
|
||
|
}
|
||
|
|
||
|
-static int local_fstat(FsContext *fs_ctx,
|
||
|
+static int local_fstat(FsContext *fs_ctx, int fid_type,
|
||
|
V9fsFidOpenState *fs, struct stat *stbuf)
|
||
|
{
|
||
|
- int err;
|
||
|
- err = fstat(fs->fd, stbuf);
|
||
|
+ int err, fd;
|
||
|
+
|
||
|
+ if (fid_type == P9_FID_DIR) {
|
||
|
+ fd = dirfd(fs->dir);
|
||
|
+ } else {
|
||
|
+ fd = fs->fd;
|
||
|
+ }
|
||
|
+
|
||
|
+ err = fstat(fd, stbuf);
|
||
|
if (err) {
|
||
|
return err;
|
||
|
}
|
||
|
@@ -381,19 +388,19 @@ static int local_fstat(FsContext *fs_ctx,
|
||
|
mode_t tmp_mode;
|
||
|
dev_t tmp_dev;
|
||
|
|
||
|
- if (fgetxattr(fs->fd, "user.virtfs.uid",
|
||
|
+ if (fgetxattr(fd, "user.virtfs.uid",
|
||
|
&tmp_uid, sizeof(uid_t)) > 0) {
|
||
|
stbuf->st_uid = tmp_uid;
|
||
|
}
|
||
|
- if (fgetxattr(fs->fd, "user.virtfs.gid",
|
||
|
+ if (fgetxattr(fd, "user.virtfs.gid",
|
||
|
&tmp_gid, sizeof(gid_t)) > 0) {
|
||
|
stbuf->st_gid = tmp_gid;
|
||
|
}
|
||
|
- if (fgetxattr(fs->fd, "user.virtfs.mode",
|
||
|
+ if (fgetxattr(fd, "user.virtfs.mode",
|
||
|
&tmp_mode, sizeof(mode_t)) > 0) {
|
||
|
stbuf->st_mode = tmp_mode;
|
||
|
}
|
||
|
- if (fgetxattr(fs->fd, "user.virtfs.rdev",
|
||
|
+ if (fgetxattr(fd, "user.virtfs.rdev",
|
||
|
&tmp_dev, sizeof(dev_t)) > 0) {
|
||
|
stbuf->st_rdev = tmp_dev;
|
||
|
}
|
||
|
@@ -592,12 +599,21 @@ static int local_remove(FsContext *ctx, const char *path)
|
||
|
return remove(rpath(ctx, path, buffer));
|
||
|
}
|
||
|
|
||
|
-static int local_fsync(FsContext *ctx, V9fsFidOpenState *fs, int datasync)
|
||
|
+static int local_fsync(FsContext *ctx, int fid_type,
|
||
|
+ V9fsFidOpenState *fs, int datasync)
|
||
|
{
|
||
|
+ int fd;
|
||
|
+
|
||
|
+ if (fid_type == P9_FID_DIR) {
|
||
|
+ fd = dirfd(fs->dir);
|
||
|
+ } else {
|
||
|
+ fd = fs->fd;
|
||
|
+ }
|
||
|
+
|
||
|
if (datasync) {
|
||
|
- return qemu_fdatasync(fs->fd);
|
||
|
+ return qemu_fdatasync(fd);
|
||
|
} else {
|
||
|
- return fsync(fs->fd);
|
||
|
+ return fsync(fd);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
diff --git a/hw/9pfs/virtio-9p-synth.c b/hw/9pfs/virtio-9p-synth.c
|
||
|
index f573616..92e0b09 100644
|
||
|
--- a/hw/9pfs/virtio-9p-synth.c
|
||
|
+++ b/hw/9pfs/virtio-9p-synth.c
|
||
|
@@ -166,7 +166,7 @@ static int v9fs_synth_lstat(FsContext *fs_ctx,
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
-static int v9fs_synth_fstat(FsContext *fs_ctx,
|
||
|
+static int v9fs_synth_fstat(FsContext *fs_ctx, int fid_type,
|
||
|
V9fsFidOpenState *fs, struct stat *stbuf)
|
||
|
{
|
||
|
V9fsSynthOpenState *synth_open = fs->private;
|
||
|
@@ -414,7 +414,8 @@ static int v9fs_synth_remove(FsContext *ctx, const char *path)
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
-static int v9fs_synth_fsync(FsContext *ctx, V9fsFidOpenState *fs, int datasync)
|
||
|
+static int v9fs_synth_fsync(FsContext *ctx, int fid_type,
|
||
|
+ V9fsFidOpenState *fs, int datasync)
|
||
|
{
|
||
|
errno = ENOSYS;
|
||
|
return 0;
|
||
|
--
|
||
|
1.7.7.5
|
||
|
|