diff --git a/src/flush.cpp b/src/flush.cpp new file mode 100644 index 00000000..e2ce054b --- /dev/null +++ b/src/flush.cpp @@ -0,0 +1,61 @@ +/* + The MIT License (MIT) + + Copyright (c) 2014 Antonio SJ Musumeci + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +#include + +#include +#include + +#include "ugid.hpp" +#include "fileinfo.hpp" + +static +int +_flush(const int fd) +{ + int rv; + + rv = dup(fd); + if(rv == -1) + errno = EIO; + else + rv = close(rv); + + return ((rv == -1) ? -errno : 0); +} + +namespace mergerfs +{ + namespace flush + { + int + flush(const char *path, + struct fuse_file_info *fi) + { + const ugid::SetResetGuard ugid; + + return _flush(((FileInfo*)fi->fh)->fd); + } + } +} diff --git a/src/flush.hpp b/src/flush.hpp new file mode 100644 index 00000000..9f878261 --- /dev/null +++ b/src/flush.hpp @@ -0,0 +1,33 @@ +/* + The MIT License (MIT) + + Copyright (c) 2014 Antonio SJ Musumeci + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +namespace mergerfs +{ + namespace flush + { + int + flush(const char *path, + struct fuse_file_info *fi); + } +} diff --git a/src/mergerfs.cpp b/src/mergerfs.cpp index da4baccd..0d3b0423 100644 --- a/src/mergerfs.cpp +++ b/src/mergerfs.cpp @@ -40,6 +40,7 @@ #include "create.hpp" #include "fallocate.hpp" #include "fgetattr.hpp" +#include "flush.hpp" #include "fsync.hpp" #include "ftruncate.hpp" #include "getattr.hpp" @@ -85,7 +86,7 @@ get_fuse_operations() ops.fallocate = mergerfs::fallocate::fallocate; ops.fgetattr = mergerfs::fgetattr::fgetattr; ops.flock = NULL; - ops.flush = NULL; /* called on close() of fd */ + ops.flush = mergerfs::flush::flush; ops.fsync = mergerfs::fsync::fsync; ops.fsyncdir = NULL; ops.ftruncate = mergerfs::ftruncate::ftruncate;