dpkg in the guest fails when it tries to use fsync() on a directory:

openat(AT_FDCWD, "/var/lib/dpkg", 
O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 4
fsync(4)                                = -1 EINVAL (Invalid argument)

stracing lkvm shows that this is converted to:

openat(AT_FDCWD, "/root/rootfs-32//var/lib/dpkg", 
O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 368
fsync(0)                = -1 EINVAL (Invalid argument)

In other words, we sync against the wrong file descriptor.  This case
is not handled in the kvmtool code, let's add support for it.

Signed-off-by: Russell King <[email protected]>
---
 virtio/9p.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/virtio/9p.c b/virtio/9p.c
index 2c120fa..5f93e41 100644
--- a/virtio/9p.c
+++ b/virtio/9p.c
@@ -886,17 +886,22 @@ err_out:
 static void virtio_p9_fsync(struct p9_dev *p9dev,
                            struct p9_pdu *pdu, u32 *outlen)
 {
-       int ret;
+       int ret, fd;
        struct p9_fid *fid;
        u32 fid_val, datasync;
 
        virtio_p9_pdu_readf(pdu, "dd", &fid_val, &datasync);
        fid = get_fid(p9dev, fid_val);
 
+       if (fid->dir)
+               fd = dirfd(fid->dir);
+       else
+               fd = fid->fd;
+
        if (datasync)
-               ret = fdatasync(fid->fd);
+               ret = fdatasync(fd);
        else
-               ret = fsync(fid->fd);
+               ret = fsync(fd);
        if (ret < 0)
                goto err_out;
        *outlen = pdu->write_offset;
-- 
2.1.0

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to