From 8f594e17d7d48a6e9f1ab2d9b3ba233c40702ae1 Mon Sep 17 00:00:00 2001 From: Antonio SJ Musumeci Date: Wed, 19 Oct 2016 11:58:44 -0400 Subject: [PATCH] add flock --- src/flock.cpp | 49 +++++++++++++++++++++++++++++++++++++++++++ src/flock.hpp | 26 +++++++++++++++++++++++ src/fs_base_flock.hpp | 31 +++++++++++++++++++++++++++ src/mergerfs.cpp | 3 ++- 4 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 src/flock.cpp create mode 100644 src/flock.hpp create mode 100644 src/fs_base_flock.hpp diff --git a/src/flock.cpp b/src/flock.cpp new file mode 100644 index 00000000..ba034b86 --- /dev/null +++ b/src/flock.cpp @@ -0,0 +1,49 @@ +/* + Copyright (c) 2016, Antonio SJ Musumeci + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include + +#include "errno.hpp" +#include "fileinfo.hpp" +#include "fs_base_flock.hpp" + +static +int +_flock(const int fd, + const int operation) +{ + int rv; + + rv = fs::flock(fd,operation); + + return ((rv == -1) ? -errno : 0); +} + +namespace mergerfs +{ + namespace fuse + { + int + flock(const char *fusepath, + fuse_file_info *ffi, + int op) + { + FileInfo* fi = reinterpret_cast(ffi->fh); + + return _flock(fi->fd,op); + } + } +} diff --git a/src/flock.hpp b/src/flock.hpp new file mode 100644 index 00000000..8105e489 --- /dev/null +++ b/src/flock.hpp @@ -0,0 +1,26 @@ +/* + Copyright (c) 2016, Antonio SJ Musumeci + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +namespace mergerfs +{ + namespace fuse + { + int + flock(const char *fusepath, + fuse_file_info *ffi, + int op); + } +} diff --git a/src/fs_base_flock.hpp b/src/fs_base_flock.hpp new file mode 100644 index 00000000..31be991d --- /dev/null +++ b/src/fs_base_flock.hpp @@ -0,0 +1,31 @@ +/* + ISC License + + Copyright (c) 2016, Antonio SJ Musumeci + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include + +namespace fs +{ + static + inline + int + flock(const int fd, + const int operation) + { + return ::flock(fd,operation); + } +} diff --git a/src/mergerfs.cpp b/src/mergerfs.cpp index 4fb5d0c5..fabbac92 100644 --- a/src/mergerfs.cpp +++ b/src/mergerfs.cpp @@ -34,6 +34,7 @@ #include "destroy.hpp" #include "fallocate.hpp" #include "fgetattr.hpp" +#include "flock.hpp" #include "flush.hpp" #include "fsync.hpp" #include "ftruncate.hpp" @@ -95,7 +96,7 @@ namespace local #endif ops.fgetattr = mergerfs::fuse::fgetattr; #if FLOCK - ops.flock = NULL; + ops.flock = mergerfs::fuse::flock; #endif ops.flush = mergerfs::fuse::flush; ops.fsync = mergerfs::fuse::fsync;