All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Dr. David Alan Gilbert (git)" <dgilbert@redhat.com>
To: qemu-devel@nongnu.org, mst@redhat.com,
	marcandre.lureau@redhat.com, stefanha@redhat.com
Cc: piaojun@huawei.com, eguan@linux.alibaba.com, vgoyal@Redhat.com
Subject: [PATCH 15/30] virtiofsd: Open vhost connection instead of mounting
Date: Mon, 21 Oct 2019 11:58:17 +0100	[thread overview]
Message-ID: <20191021105832.36574-16-dgilbert@redhat.com> (raw)
In-Reply-To: <20191021105832.36574-1-dgilbert@redhat.com>

From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>

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 <dgilbert@redhat.com>
---
 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  <dgilbert@redhat.com>
+ *
+ * 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  <dgilbert@redhat.com>
+
+  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



  parent reply	other threads:[~2019-10-21 11:05 UTC|newest]

Thread overview: 61+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-10-21 10:58 [PATCH 00/30] virtiofs daemon (base) Dr. David Alan Gilbert (git)
2019-10-21 10:58 ` [PATCH 01/30] virtiofsd: Pull in upstream headers Dr. David Alan Gilbert (git)
2019-10-21 10:58 ` [PATCH 02/30] virtiofsd: Pull in kernel's fuse.h Dr. David Alan Gilbert (git)
2019-10-24 11:10   ` Michael S. Tsirkin
2019-10-24 14:28     ` Dr. David Alan Gilbert
2019-10-24 11:13   ` Michael S. Tsirkin
2019-10-24 15:49     ` Dr. David Alan Gilbert
2019-10-21 10:58 ` [PATCH 03/30] virtiofsd: Add auxiliary .c's Dr. David Alan Gilbert (git)
2019-10-21 10:58 ` [PATCH 04/30] virtiofsd: Add fuse_lowlevel.c Dr. David Alan Gilbert (git)
2019-10-24 11:11   ` Michael S. Tsirkin
2019-10-24 14:31     ` Dr. David Alan Gilbert
2019-10-21 10:58 ` [PATCH 05/30] virtiofsd: Add passthrough_ll Dr. David Alan Gilbert (git)
2019-10-21 10:58 ` [PATCH 06/30] virtiofsd: Trim down imported files Dr. David Alan Gilbert (git)
2019-10-21 10:58 ` [PATCH 07/30] virtiofsd: remove mountpoint dummy argument Dr. David Alan Gilbert (git)
2019-10-21 10:58 ` [PATCH 08/30] virtiofsd: remove unused notify reply support Dr. David Alan Gilbert (git)
2019-10-21 10:58 ` [PATCH 09/30] virtiofsd: Fix fuse_daemonize ignored return values Dr. David Alan Gilbert (git)
2019-10-21 10:58 ` [PATCH 10/30] virtiofsd: Fix common header and define for QEMU builds Dr. David Alan Gilbert (git)
2019-10-21 10:58 ` [PATCH 11/30] virtiofsd: fuse: Make iov_length usable outside fuse_lowlevel.c Dr. David Alan Gilbert (git)
2019-10-21 14:47   ` Marc-André Lureau
2019-10-22 10:01     ` Dr. David Alan Gilbert
2019-10-21 10:58 ` [PATCH 12/30] virtiofsd: Make fsync work even if only inode is passed in Dr. David Alan Gilbert (git)
2019-10-21 10:58 ` [PATCH 13/30] virtiofsd: Add options for virtio Dr. David Alan Gilbert (git)
2019-10-21 10:58 ` [PATCH 14/30] virtiofsd: add -o source=PATH to help output Dr. David Alan Gilbert (git)
2019-10-21 10:58 ` Dr. David Alan Gilbert (git) [this message]
2019-10-21 10:58 ` [PATCH 16/30] virtiofsd: Start wiring up vhost-user Dr. David Alan Gilbert (git)
2019-10-21 10:58 ` [PATCH 17/30] virtiofsd: Add main virtio loop Dr. David Alan Gilbert (git)
2019-10-21 14:51   ` Marc-André Lureau
2019-10-22 11:07     ` Dr. David Alan Gilbert
2019-11-14 14:13       ` Stefan Hajnoczi
2019-10-21 10:58 ` [PATCH 18/30] virtiofsd: get/set features callbacks Dr. David Alan Gilbert (git)
2019-10-21 10:58 ` [PATCH 19/30] virtiofsd: Start queue threads Dr. David Alan Gilbert (git)
2019-10-21 10:58 ` [PATCH 20/30] virtiofsd: Poll kick_fd for queue Dr. David Alan Gilbert (git)
2019-10-21 10:58 ` [PATCH 21/30] virtiofsd: Start reading commands from queue Dr. David Alan Gilbert (git)
2019-10-21 14:57   ` Marc-André Lureau
2019-10-22 10:28     ` Dr. David Alan Gilbert
2019-10-21 10:58 ` [PATCH 22/30] virtiofsd: Send replies to messages Dr. David Alan Gilbert (git)
2019-10-21 10:58 ` [PATCH 23/30] virtiofsd: Keep track of replies Dr. David Alan Gilbert (git)
2019-10-21 10:58 ` [PATCH 24/30] virtiofsd: Add Makefile wiring for virtiofsd contrib Dr. David Alan Gilbert (git)
2019-10-21 10:58 ` [PATCH 25/30] virtiofsd: Fast path for virtio read Dr. David Alan Gilbert (git)
2019-10-21 10:58 ` [PATCH 26/30] virtiofsd: add --fd=FDNUM fd passing option Dr. David Alan Gilbert (git)
2019-10-21 10:58 ` [PATCH 27/30] virtiofsd: make -f (foreground) the default Dr. David Alan Gilbert (git)
2019-10-21 10:58 ` [PATCH 28/30] virtiofsd: add vhost-user.json file Dr. David Alan Gilbert (git)
2019-10-21 10:58 ` [PATCH 29/30] virtiofsd: add --print-capabilities option Dr. David Alan Gilbert (git)
2019-10-21 10:58 ` [PATCH 30/30] virtiofs: Add maintainers entry Dr. David Alan Gilbert (git)
     [not found] ` <157166664425.24734.3489596262271351160@37313f22b938>
2019-10-21 14:33   ` [PATCH 00/30] virtiofs daemon (base) Dr. David Alan Gilbert
2019-10-24 10:59     ` Michael S. Tsirkin
2019-10-24 11:02       ` Dr. David Alan Gilbert
2019-10-24 11:07       ` Daniel P. Berrangé
2019-10-24 11:14         ` Dr. David Alan Gilbert
2019-10-24 11:19           ` Michael S. Tsirkin
2019-10-24 12:54             ` Dr. David Alan Gilbert
2019-10-24 11:25           ` Daniel P. Berrangé
2019-10-24 13:36             ` Dr. David Alan Gilbert
2019-10-24 11:14 ` Michael S. Tsirkin
2019-10-24 16:19   ` Dr. David Alan Gilbert
2019-10-27 13:11 ` Michael S. Tsirkin
2019-10-28 13:24   ` Dr. David Alan Gilbert
2019-10-29 22:50 ` Michael S. Tsirkin
2019-10-30 10:47   ` Dr. David Alan Gilbert
2019-10-31  0:34     ` Michael S. Tsirkin
2019-10-31 13:20       ` Dr. David Alan Gilbert

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20191021105832.36574-16-dgilbert@redhat.com \
    --to=dgilbert@redhat.com \
    --cc=eguan@linux.alibaba.com \
    --cc=marcandre.lureau@redhat.com \
    --cc=mst@redhat.com \
    --cc=piaojun@huawei.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@redhat.com \
    --cc=vgoyal@Redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.