From d853e9f3bfa7847133e7cc2b3cbb8474e99f79ed Mon Sep 17 00:00:00 2001 From: Marcus Holland-Moritz Date: Mon, 14 Dec 2020 01:00:14 +0100 Subject: [PATCH] Better logging in FUSE driver --- src/dwarfs.cpp | 119 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 77 insertions(+), 42 deletions(-) diff --git a/src/dwarfs.cpp b/src/dwarfs.cpp index 797ea05f..c85fa6bb 100644 --- a/src/dwarfs.cpp +++ b/src/dwarfs.cpp @@ -64,9 +64,6 @@ struct options { struct ::stat stat_defaults; }; -// #define DEBUG_FUNC(x) std::cerr << __func__ << "(" << x << ")" << std::endl; -#define DEBUG_FUNC(x) - // TODO: better error handling #define DWARFS_OPT(t, p, v) \ @@ -92,10 +89,11 @@ stream_logger s_lgr(std::cerr); std::shared_ptr s_fs; struct fuse_session* s_session; +template void op_init(void* /*userdata*/, struct fuse_conn_info* /*conn*/) { - DEBUG_FUNC("") + log_proxy log(s_lgr); - log_proxy log(s_lgr); + log.debug() << __func__; try { auto ti = log.timed_info(); @@ -119,13 +117,20 @@ void op_init(void* /*userdata*/, struct fuse_conn_info* /*conn*/) { } } +template void op_destroy(void* /*userdata*/) { - DEBUG_FUNC("") + log_proxy log(s_lgr); + + log.debug() << __func__; + s_fs.reset(); } +template void op_lookup(fuse_req_t req, fuse_ino_t parent, const char* name) { - DEBUG_FUNC(parent << ", " << name) + log_proxy log(s_lgr); + + log.debug() << __func__; int err = ENOENT; @@ -149,18 +154,21 @@ void op_lookup(fuse_req_t req, fuse_ino_t parent, const char* name) { } } } catch (dwarfs::system_error const& e) { - std::cerr << "ERROR: " << e.what() << std::endl; + log.error() << e.what(); err = e.get_errno(); } catch (std::exception const& e) { - std::cerr << "ERROR: " << e.what() << std::endl; + log.error() << e.what(); err = EIO; } fuse_reply_err(req, err); } +template void op_getattr(fuse_req_t req, fuse_ino_t ino, struct fuse_file_info*) { - DEBUG_FUNC(ino) + log_proxy log(s_lgr); + + log.debug() << __func__; int err = ENOENT; @@ -180,18 +188,21 @@ void op_getattr(fuse_req_t req, fuse_ino_t ino, struct fuse_file_info*) { } } } catch (dwarfs::system_error const& e) { - std::cerr << "ERROR: " << e.what() << std::endl; + log.error() << e.what(); err = e.get_errno(); } catch (std::exception const& e) { - std::cerr << "ERROR: " << e.what() << std::endl; + log.error() << e.what(); err = EIO; } fuse_reply_err(req, err); } +template void op_access(fuse_req_t req, fuse_ino_t ino, int mode) { - DEBUG_FUNC(ino) + log_proxy log(s_lgr); + + log.debug() << __func__; int err = ENOENT; @@ -204,18 +215,21 @@ void op_access(fuse_req_t req, fuse_ino_t ino, int mode) { err = s_fs->access(*entry, mode, ctx->uid, ctx->gid); } } catch (dwarfs::system_error const& e) { - std::cerr << "ERROR: " << e.what() << std::endl; + log.error() << e.what(); err = e.get_errno(); } catch (std::exception const& e) { - std::cerr << "ERROR: " << e.what() << std::endl; + log.error() << e.what(); err = EIO; } fuse_reply_err(req, err); } +template void op_readlink(fuse_req_t req, fuse_ino_t ino) { - DEBUG_FUNC(ino) + log_proxy log(s_lgr); + + log.debug() << __func__; int err = ENOENT; @@ -234,18 +248,21 @@ void op_readlink(fuse_req_t req, fuse_ino_t ino) { } } } catch (dwarfs::system_error const& e) { - std::cerr << "ERROR: " << e.what() << std::endl; + log.error() << e.what(); err = e.get_errno(); } catch (std::exception const& e) { - std::cerr << "ERROR: " << e.what() << std::endl; + log.error() << e.what(); err = EIO; } fuse_reply_err(req, err); } +template void op_open(fuse_req_t req, fuse_ino_t ino, struct fuse_file_info* fi) { - DEBUG_FUNC(ino) + log_proxy log(s_lgr); + + log.debug() << __func__; int err = ENOENT; @@ -266,19 +283,22 @@ void op_open(fuse_req_t req, fuse_ino_t ino, struct fuse_file_info* fi) { } } } catch (dwarfs::system_error const& e) { - std::cerr << "ERROR: " << e.what() << std::endl; + log.error() << e.what(); err = e.get_errno(); } catch (std::exception const& e) { - std::cerr << "ERROR: " << e.what() << std::endl; + log.error() << e.what(); err = EIO; } fuse_reply_err(req, err); } +template void op_read(fuse_req_t req, fuse_ino_t ino, size_t size, off_t off, struct fuse_file_info* fi) { - DEBUG_FUNC(ino << ", " << size << ", " << off) + log_proxy log(s_lgr); + + log.debug() << __func__; int err = ENOENT; @@ -301,19 +321,22 @@ void op_read(fuse_req_t req, fuse_ino_t ino, size_t size, off_t off, err = EIO; } } catch (dwarfs::system_error const& e) { - std::cerr << "ERROR: " << e.what() << std::endl; + log.error() << e.what(); err = e.get_errno(); } catch (std::exception const& e) { - std::cerr << "ERROR: " << e.what() << std::endl; + log.error() << e.what(); err = EIO; } fuse_reply_err(req, err); } // namespace dwarfs +template void op_readdir(fuse_req_t req, fuse_ino_t ino, size_t size, off_t off, struct fuse_file_info* /*fi*/) { - DEBUG_FUNC(ino << ", " << size << ", " << off) + log_proxy log(s_lgr); + + log.debug() << __func__; int err = ENOENT; @@ -358,18 +381,21 @@ void op_readdir(fuse_req_t req, fuse_ino_t ino, size_t size, off_t off, err = ENOTDIR; } } catch (dwarfs::system_error const& e) { - std::cerr << "ERROR: " << e.what() << std::endl; + log.error() << e.what(); err = e.get_errno(); } catch (std::exception const& e) { - std::cerr << "ERROR: " << e.what() << std::endl; + log.error() << e.what(); err = EIO; } fuse_reply_err(req, err); } +template void op_statfs(fuse_req_t req, fuse_ino_t /*ino*/) { - DEBUG_FUNC("") + log_proxy log(s_lgr); + + log.debug() << __func__; int err = EIO; @@ -384,10 +410,10 @@ void op_statfs(fuse_req_t req, fuse_ino_t /*ino*/) { return; } } catch (dwarfs::system_error const& e) { - std::cerr << "ERROR: " << e.what() << std::endl; + log.error() << e.what(); err = e.get_errno(); } catch (std::exception const& e) { - std::cerr << "ERROR: " << e.what() << std::endl; + log.error() << e.what(); err = EIO; } @@ -443,24 +469,33 @@ int option_hdl(void* data, const char* arg, int key, return 1; } +template +void init_lowlevel_ops(struct fuse_lowlevel_ops& ops) { + ops.init = &op_init; + ops.destroy = &op_destroy; + ops.lookup = &op_lookup; + ops.getattr = &op_getattr; + ops.access = &op_access; + ops.readlink = &op_readlink; + ops.open = &op_open; + ops.read = &op_read; + ops.readdir = &op_readdir; + ops.statfs = &op_statfs; + // ops.getxattr = &op_getxattr; + // ops.listxattr = &op_listxattr; +} + int run_fuse(struct fuse_args& args, struct fuse_cmdline_opts const& fuse_opts) { struct fuse_lowlevel_ops fsops; ::memset(&fsops, 0, sizeof(fsops)); - fsops.init = op_init; - fsops.destroy = op_destroy; - fsops.lookup = op_lookup; - fsops.getattr = op_getattr; - fsops.access = op_access; - fsops.readlink = op_readlink; - fsops.open = op_open; - fsops.read = op_read; - fsops.readdir = op_readdir; - fsops.statfs = op_statfs; - // fsops.getxattr = op_getxattr; - // fsops.listxattr = op_listxattr; + if (s_opts.debuglevel >= logger::DEBUG) { + init_lowlevel_ops(fsops); + } else { + init_lowlevel_ops(fsops); + } s_session = fuse_session_new(&args, &fsops, sizeof(fsops), nullptr); int err = 1;