diff --git a/doc/dwarfs.md b/doc/dwarfs.md index 2e5f9900..2e9a3bca 100644 --- a/doc/dwarfs.md +++ b/doc/dwarfs.md @@ -74,6 +74,16 @@ options: this option to keep the compressed image data in the kernel cache. + * `-o direct_io` + By default, files in the mounted file system will be cached by + the kernel. This significantly improves performance when accessing + the same files over and over again, especially if the data from + these files has been (partially) evicted from the block cache of + `dwarfs`. By setting this option, you can force the fuse driver + to not use the kernel cache for file data. If you're short on + memory and only infrequently accessing files, this can be worth + trying. + * `-o debuglevel=`*name*: Use this for different levels of verbosity along with either the `-f` or `-d` FUSE options. This can give you some insight diff --git a/src/dwarfs.cpp b/src/dwarfs.cpp index 3e913483..c6a38aac 100644 --- a/src/dwarfs.cpp +++ b/src/dwarfs.cpp @@ -54,6 +54,7 @@ struct options { const char* decompress_ratio_str; // TODO: const?? -> use string? int enable_nlink; int no_image_madvise; + int direct_io; size_t cachesize; size_t workers; mlock_mode lock_mode; @@ -79,6 +80,7 @@ const struct fuse_opt dwarfs_opts[] = { DWARFS_OPT("decratio=%s", decompress_ratio_str, 0), DWARFS_OPT("enable_nlink", enable_nlink, 1), DWARFS_OPT("no_image_madvise", no_image_madvise, 1), + DWARFS_OPT("direct_io", direct_io, 1), FUSE_OPT_END}; options s_opts; @@ -252,7 +254,8 @@ void op_open(fuse_req_t req, fuse_ino_t ino, struct fuse_file_info* fi) { err = EACCES; } else { fi->fh = FUSE_ROOT_ID + entry->inode(); - fi->keep_cache = 1; + fi->direct_io = s_opts.direct_io; + fi->keep_cache = !s_opts.direct_io; fuse_reply_open(req, fi); return; } @@ -396,6 +399,7 @@ void usage(const char* progname) { << " -o decratio=NUM ratio for full decompression (0.8)\n" << " -o enable_nlink show correct hardlink numbers\n" << " -o no_image_madvise keep image in kernel cache\n" + << " -o direct_io don't keep files in kernel cache\n" << " -o debuglevel=NAME error, warn, (info), debug, trace\n" << std::endl;