xref: /spdk/test/blobfs/fuse/fuse.c (revision a6dbe3721eb3b5990707fc3e378c95e505dd8ab5)
1488570ebSJim Harris /*   SPDX-License-Identifier: BSD-3-Clause
2*a6dbe372Spaul luse  *   Copyright (C) 2017 Intel Corporation.
3656c4a7aSSeth Howell  *   All rights reserved.
4656c4a7aSSeth Howell  */
5656c4a7aSSeth Howell 
6656c4a7aSSeth Howell #include "spdk/stdinc.h"
7656c4a7aSSeth Howell 
8656c4a7aSSeth Howell #define FUSE_USE_VERSION 30
9656c4a7aSSeth Howell #include "fuse3/fuse.h"
10656c4a7aSSeth Howell #include "fuse3/fuse_lowlevel.h"
11656c4a7aSSeth Howell 
12656c4a7aSSeth Howell #include "spdk/blobfs.h"
13656c4a7aSSeth Howell #include "spdk/bdev.h"
14656c4a7aSSeth Howell #include "spdk/event.h"
15a83f91c2SBen Walker #include "spdk/thread.h"
16656c4a7aSSeth Howell #include "spdk/blob_bdev.h"
174c10e0bbSXiaodong Liu #include "spdk/blobfs_bdev.h"
18656c4a7aSSeth Howell #include "spdk/log.h"
194c10e0bbSXiaodong Liu #include "spdk/string.h"
20656c4a7aSSeth Howell 
21656c4a7aSSeth Howell char *g_bdev_name;
22656c4a7aSSeth Howell char *g_mountpoint;
23656c4a7aSSeth Howell 
24656c4a7aSSeth Howell int g_fuse_argc = 0;
25656c4a7aSSeth Howell char **g_fuse_argv = NULL;
26656c4a7aSSeth Howell 
27656c4a7aSSeth Howell static void
fuse_run_cb(void * cb_arg,int fserrno)284c10e0bbSXiaodong Liu fuse_run_cb(void *cb_arg, int fserrno)
29656c4a7aSSeth Howell {
304c10e0bbSXiaodong Liu 	if (fserrno) {
3178ba12ecSWang Shilong 		printf("Failed to mount filesystem on bdev %s to path %s: %s\n",
324c10e0bbSXiaodong Liu 		       g_bdev_name, g_mountpoint, spdk_strerror(fserrno));
33656c4a7aSSeth Howell 
344c10e0bbSXiaodong Liu 		spdk_app_stop(0);
35656c4a7aSSeth Howell 		return;
36656c4a7aSSeth Howell 	}
37656c4a7aSSeth Howell 
384c10e0bbSXiaodong Liu 	printf("done.\n");
39656c4a7aSSeth Howell }
40656c4a7aSSeth Howell 
41656c4a7aSSeth Howell static void
spdk_fuse_run(void * arg1)42deb8ee5cSBen Walker spdk_fuse_run(void *arg1)
43656c4a7aSSeth Howell {
4478ba12ecSWang Shilong 	printf("Mounting filesystem on bdev %s to path %s...\n",
454c10e0bbSXiaodong Liu 	       g_bdev_name, g_mountpoint);
464c10e0bbSXiaodong Liu 	fflush(stdout);
47656c4a7aSSeth Howell 
484c10e0bbSXiaodong Liu 	spdk_blobfs_bdev_mount(g_bdev_name, g_mountpoint, fuse_run_cb, NULL);
49656c4a7aSSeth Howell }
50656c4a7aSSeth Howell 
51656c4a7aSSeth Howell static void
spdk_fuse_shutdown(void)52656c4a7aSSeth Howell spdk_fuse_shutdown(void)
53656c4a7aSSeth Howell {
544c10e0bbSXiaodong Liu 	spdk_app_stop(0);
55656c4a7aSSeth Howell }
56656c4a7aSSeth Howell 
578dd1cd21SBen Walker int
main(int argc,char ** argv)588dd1cd21SBen Walker main(int argc, char **argv)
59656c4a7aSSeth Howell {
60656c4a7aSSeth Howell 	struct spdk_app_opts opts = {};
61656c4a7aSSeth Howell 	int rc = 0;
62656c4a7aSSeth Howell 
63656c4a7aSSeth Howell 	if (argc < 4) {
64656c4a7aSSeth Howell 		fprintf(stderr, "usage: %s <conffile> <bdev name> <mountpoint>\n", argv[0]);
65656c4a7aSSeth Howell 		exit(1);
66656c4a7aSSeth Howell 	}
67656c4a7aSSeth Howell 
6848701bd9SZiye Yang 	spdk_app_opts_init(&opts, sizeof(opts));
69656c4a7aSSeth Howell 	opts.name = "spdk_fuse";
706a41e84cSWANGHAILIANG 	opts.json_config_file = argv[1];
71656c4a7aSSeth Howell 	opts.reactor_mask = "0x3";
72656c4a7aSSeth Howell 	opts.shutdown_cb = spdk_fuse_shutdown;
73656c4a7aSSeth Howell 
74656c4a7aSSeth Howell 	g_bdev_name = argv[2];
75656c4a7aSSeth Howell 	g_mountpoint = argv[3];
764c10e0bbSXiaodong Liu 
774c10e0bbSXiaodong Liu 	/* TODO: mount blobfs with extra FUSE options. */
78656c4a7aSSeth Howell 	g_fuse_argc = argc - 2;
79656c4a7aSSeth Howell 	g_fuse_argv = &argv[2];
80656c4a7aSSeth Howell 
811b7cd386SChangpeng Liu 	spdk_fs_set_cache_size(512);
821b7cd386SChangpeng Liu 
8336287957SBen Walker 	rc = spdk_app_start(&opts, spdk_fuse_run, NULL);
84656c4a7aSSeth Howell 	spdk_app_fini();
85656c4a7aSSeth Howell 
86656c4a7aSSeth Howell 	return rc;
87656c4a7aSSeth Howell }
88