1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright (c) Intel Corporation. 3 * All rights reserved. 4 */ 5 6 #include "spdk/stdinc.h" 7 8 #define FUSE_USE_VERSION 30 9 #include "fuse3/fuse.h" 10 #include "fuse3/fuse_lowlevel.h" 11 12 #include "spdk/blobfs.h" 13 #include "spdk/bdev.h" 14 #include "spdk/event.h" 15 #include "spdk/thread.h" 16 #include "spdk/blob_bdev.h" 17 #include "spdk/blobfs_bdev.h" 18 #include "spdk/log.h" 19 #include "spdk/string.h" 20 21 char *g_bdev_name; 22 char *g_mountpoint; 23 24 int g_fuse_argc = 0; 25 char **g_fuse_argv = NULL; 26 27 static void 28 fuse_run_cb(void *cb_arg, int fserrno) 29 { 30 if (fserrno) { 31 printf("Failed to mount filesystem on bdev %s to path %s: %s\n", 32 g_bdev_name, g_mountpoint, spdk_strerror(fserrno)); 33 34 spdk_app_stop(0); 35 return; 36 } 37 38 printf("done.\n"); 39 } 40 41 static void 42 spdk_fuse_run(void *arg1) 43 { 44 printf("Mounting filesystem on bdev %s to path %s...\n", 45 g_bdev_name, g_mountpoint); 46 fflush(stdout); 47 48 spdk_blobfs_bdev_mount(g_bdev_name, g_mountpoint, fuse_run_cb, NULL); 49 } 50 51 static void 52 spdk_fuse_shutdown(void) 53 { 54 spdk_app_stop(0); 55 } 56 57 int main(int argc, char **argv) 58 { 59 struct spdk_app_opts opts = {}; 60 int rc = 0; 61 62 if (argc < 4) { 63 fprintf(stderr, "usage: %s <conffile> <bdev name> <mountpoint>\n", argv[0]); 64 exit(1); 65 } 66 67 spdk_app_opts_init(&opts, sizeof(opts)); 68 opts.name = "spdk_fuse"; 69 opts.json_config_file = argv[1]; 70 opts.reactor_mask = "0x3"; 71 opts.shutdown_cb = spdk_fuse_shutdown; 72 73 g_bdev_name = argv[2]; 74 g_mountpoint = argv[3]; 75 76 /* TODO: mount blobfs with extra FUSE options. */ 77 g_fuse_argc = argc - 2; 78 g_fuse_argv = &argv[2]; 79 80 spdk_fs_set_cache_size(512); 81 82 rc = spdk_app_start(&opts, spdk_fuse_run, NULL); 83 spdk_app_fini(); 84 85 return rc; 86 } 87