[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 15/30] virtiofsd: Open vhost connection instead of mounting
From: |
Dr. David Alan Gilbert (git) |
Subject: |
[PATCH 15/30] virtiofsd: Open vhost connection instead of mounting |
Date: |
Mon, 21 Oct 2019 11:58:17 +0100 |
From: "Dr. David Alan Gilbert" <address@hidden>
When run with vhost-user options we conect to the QEMU instead
via a socket. Start this off by creating the socket.
Signed-off-by: Dr. David Alan Gilbert <address@hidden>
---
contrib/virtiofsd/fuse_i.h | 7 ++-
contrib/virtiofsd/fuse_lowlevel.c | 53 +++-------------------
contrib/virtiofsd/fuse_virtio.c | 75 +++++++++++++++++++++++++++++++
contrib/virtiofsd/fuse_virtio.h | 23 ++++++++++
4 files changed, 110 insertions(+), 48 deletions(-)
create mode 100644 contrib/virtiofsd/fuse_virtio.c
create mode 100644 contrib/virtiofsd/fuse_virtio.h
diff --git a/contrib/virtiofsd/fuse_i.h b/contrib/virtiofsd/fuse_i.h
index d65af06ff0..27fa50274d 100644
--- a/contrib/virtiofsd/fuse_i.h
+++ b/contrib/virtiofsd/fuse_i.h
@@ -6,9 +6,10 @@
See the file COPYING.LIB
*/
-#define FUSE_USE_VERSION 31
-
+#ifndef FUSE_I_H
+#define FUSE_I_H
+#define FUSE_USE_VERSION 31
#include "fuse.h"
#include "fuse_lowlevel.h"
@@ -119,3 +120,5 @@ void fuse_session_process_buf_int(struct fuse_session *se,
/* room needed in buffer to accommodate header */
#define FUSE_BUFFER_HEADER_SIZE 0x1000
+
+#endif
diff --git a/contrib/virtiofsd/fuse_lowlevel.c
b/contrib/virtiofsd/fuse_lowlevel.c
index d47e4438f3..247667e3f4 100644
--- a/contrib/virtiofsd/fuse_lowlevel.c
+++ b/contrib/virtiofsd/fuse_lowlevel.c
@@ -13,6 +13,7 @@
#include "fuse_kernel.h"
#include "fuse_opt.h"
#include "fuse_misc.h"
+#include "fuse_virtio.h"
#include <stdio.h>
#include <stdlib.h>
@@ -2152,6 +2153,11 @@ struct fuse_session *fuse_session_new(struct fuse_args
*args,
goto out4;
}
+ if (!se->vu_socket_path) {
+ fprintf(stderr, "fuse: missing -o vhost_user_socket option\n");
+ goto out4;
+ }
+
se->bufsize = FUSE_MAX_MAX_PAGES * getpagesize() +
FUSE_BUFFER_HEADER_SIZE;
@@ -2175,52 +2181,7 @@ out1:
int fuse_session_mount(struct fuse_session *se)
{
- int fd;
-
- /*
- * Make sure file descriptors 0, 1 and 2 are open, otherwise chaos
- * would ensue.
- */
- do {
- fd = open("/dev/null", O_RDWR);
- if (fd > 2)
- close(fd);
- } while (fd >= 0 && fd <= 2);
-
- /*
- * To allow FUSE daemons to run without privileges, the caller may open
- * /dev/fuse before launching the file system and pass on the file
- * descriptor by specifying /dev/fd/N as the mount point. Note that the
- * parent process takes care of performing the mount in this case.
- */
- fd = fuse_mnt_parse_fuse_fd(mountpoint);
- if (fd != -1) {
- if (fcntl(fd, F_GETFD) == -1) {
- fuse_log(FUSE_LOG_ERR,
- "fuse: Invalid file descriptor /dev/fd/%u\n",
- fd);
- return -1;
- }
- se->fd = fd;
- return 0;
- }
-
- /* Open channel */
- fd = fuse_kern_mount(mountpoint, se->mo);
- if (fd == -1)
- return -1;
- se->fd = fd;
-
- /* Save mountpoint */
- se->mountpoint = strdup(mountpoint);
- if (se->mountpoint == NULL)
- goto error_out;
-
- return 0;
-
-error_out:
- fuse_kern_unmount(mountpoint, fd);
- return -1;
+ return virtio_session_mount(se);
}
int fuse_session_fd(struct fuse_session *se)
diff --git a/contrib/virtiofsd/fuse_virtio.c b/contrib/virtiofsd/fuse_virtio.c
new file mode 100644
index 0000000000..da8451faa7
--- /dev/null
+++ b/contrib/virtiofsd/fuse_virtio.c
@@ -0,0 +1,75 @@
+/*
+ * virtio-fs glue for FUSE
+ * Copyright (C) 2018 Red Hat, Inc. and/or its affiliates
+ *
+ * Authors:
+ * Dave Gilbert <address@hidden>
+ *
+ * Implements the glue between libfuse and libvhost-user
+ *
+ * This program can be distributed under the terms of the GNU LGPLv2.
+ * See the file COPYING.LIB
+ */
+
+#include "fuse_i.h"
+#include "fuse_kernel.h"
+#include "fuse_misc.h"
+#include "fuse_opt.h"
+#include "fuse_virtio.h"
+
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <sys/un.h>
+#include <unistd.h>
+
+/* From spec */
+struct virtio_fs_config {
+ char tag[36];
+ uint32_t num_queues;
+};
+
+int virtio_session_mount(struct fuse_session *se)
+{
+ struct sockaddr_un un;
+
+ if (strlen(se->vu_socket_path) >= sizeof(un.sun_path)) {
+ fuse_log(FUSE_LOG_ERR, "Socket path too long\n");
+ return -1;
+ }
+
+ /*
+ * Poison the fuse FD so we spot if we accidentally use it;
+ * DO NOT check for this value, check for fuse_lowlevel_is_virtio()
+ */
+ se->fd = 0xdaff0d11;
+
+ /*
+ * Create the Unix socket to communicate with qemu
+ * based on QEMU's vhost-user-bridge
+ */
+ unlink(se->vu_socket_path);
+ strcpy(un.sun_path, se->vu_socket_path);
+ size_t addr_len = sizeof(un.sun_family) + strlen(se->vu_socket_path);
+
+ int listen_sock = socket(AF_UNIX, SOCK_STREAM, 0);
+ if (listen_sock == -1) {
+ fuse_log(FUSE_LOG_ERR, "vhost socket creation: %m\n");
+ return -1;
+ }
+ un.sun_family = AF_UNIX;
+
+ if (bind(listen_sock, (struct sockaddr *)&un, addr_len) == -1) {
+ fuse_log(FUSE_LOG_ERR, "vhost socket bind: %m\n");
+ return -1;
+ }
+
+ if (listen(listen_sock, 1) == -1) {
+ fuse_log(FUSE_LOG_ERR, "vhost socket listen: %m\n");
+ return -1;
+ }
+
+ return -1;
+}
diff --git a/contrib/virtiofsd/fuse_virtio.h b/contrib/virtiofsd/fuse_virtio.h
new file mode 100644
index 0000000000..6652e609e0
--- /dev/null
+++ b/contrib/virtiofsd/fuse_virtio.h
@@ -0,0 +1,23 @@
+/*
+ virtio-fs glue for FUSE
+ Copyright (C) 2018 Red Hat, Inc. and/or its affiliates
+
+ Authors:
+ Dave Gilbert <address@hidden>
+
+ Implements the glue between libfuse and libvhost-user
+
+ This program can be distributed under the terms of the GNU LGPLv2.
+ See the file COPYING.LIB
+*/
+
+#ifndef FUSE_VIRTIO_H
+#define FUSE_VIRTIO_H
+
+#include "fuse_i.h"
+
+struct fuse_session;
+
+int virtio_session_mount(struct fuse_session *se);
+
+#endif
--
2.23.0
- [PATCH 06/30] virtiofsd: Trim down imported files, (continued)
- [PATCH 06/30] virtiofsd: Trim down imported files, Dr. David Alan Gilbert (git), 2019/10/21
- [PATCH 09/30] virtiofsd: Fix fuse_daemonize ignored return values, Dr. David Alan Gilbert (git), 2019/10/21
- [PATCH 08/30] virtiofsd: remove unused notify reply support, Dr. David Alan Gilbert (git), 2019/10/21
- [PATCH 10/30] virtiofsd: Fix common header and define for QEMU builds, Dr. David Alan Gilbert (git), 2019/10/21
- [PATCH 11/30] virtiofsd: fuse: Make iov_length usable outside fuse_lowlevel.c, Dr. David Alan Gilbert (git), 2019/10/21
- [PATCH 12/30] virtiofsd: Make fsync work even if only inode is passed in, Dr. David Alan Gilbert (git), 2019/10/21
- [PATCH 14/30] virtiofsd: add -o source=PATH to help output, Dr. David Alan Gilbert (git), 2019/10/21
- [PATCH 13/30] virtiofsd: Add options for virtio, Dr. David Alan Gilbert (git), 2019/10/21
- [PATCH 15/30] virtiofsd: Open vhost connection instead of mounting,
Dr. David Alan Gilbert (git) <=
- [PATCH 16/30] virtiofsd: Start wiring up vhost-user, Dr. David Alan Gilbert (git), 2019/10/21
- [PATCH 17/30] virtiofsd: Add main virtio loop, Dr. David Alan Gilbert (git), 2019/10/21
- [PATCH 19/30] virtiofsd: Start queue threads, Dr. David Alan Gilbert (git), 2019/10/21
- [PATCH 20/30] virtiofsd: Poll kick_fd for queue, Dr. David Alan Gilbert (git), 2019/10/21
- [PATCH 18/30] virtiofsd: get/set features callbacks, Dr. David Alan Gilbert (git), 2019/10/21
- [PATCH 23/30] virtiofsd: Keep track of replies, Dr. David Alan Gilbert (git), 2019/10/21
- [PATCH 22/30] virtiofsd: Send replies to messages, Dr. David Alan Gilbert (git), 2019/10/21
- [PATCH 21/30] virtiofsd: Start reading commands from queue, Dr. David Alan Gilbert (git), 2019/10/21