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