mirror of
https://github.com/trapexit/mergerfs.git
synced 2025-02-02 02:29:45 +08:00
Add option to lazy umount target mount point
This commit is contained in:
parent
9a6b7835f4
commit
9adddfc66d
|
@ -2,7 +2,6 @@
|
|||
ISC License
|
||||
|
||||
Copyright (c) 2022, Antonio SJ Musumeci <trapexit@spawn.link>
|
||||
|
||||
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.
|
||||
|
@ -22,6 +21,7 @@
|
|||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <cstdlib>
|
||||
#include <mutex>
|
||||
#include <stack>
|
||||
|
||||
|
|
|
@ -92,10 +92,11 @@ Config::Config()
|
|||
fuse_msg_size(FUSE_MAX_MAX_PAGES),
|
||||
ignorepponrename(false),
|
||||
inodecalc("hybrid-hash"),
|
||||
lazy_umount_mountpoint(false),
|
||||
link_cow(false),
|
||||
link_exdev(LinkEXDEV::ENUM::PASSTHROUGH),
|
||||
log_metrics(false),
|
||||
mount(),
|
||||
mountpoint(),
|
||||
moveonenospc(false),
|
||||
nfsopenhack(NFSOpenHack::ENUM::OFF),
|
||||
nullrw(false),
|
||||
|
@ -160,11 +161,12 @@ Config::Config()
|
|||
_map["ignorepponrename"] = &ignorepponrename;
|
||||
_map["inodecalc"] = &inodecalc;
|
||||
_map["kernel_cache"] = &kernel_cache;
|
||||
_map["lazy-umount-mountpoint"] = &lazy_umount_mountpoint;
|
||||
_map["link_cow"] = &link_cow;
|
||||
_map["link-exdev"] = &link_exdev;
|
||||
_map["log.metrics"] = &log_metrics;
|
||||
_map["minfreespace"] = &minfreespace;
|
||||
_map["mount"] = &mount;
|
||||
_map["mount"] = &mountpoint;
|
||||
_map["moveonenospc"] = &moveonenospc;
|
||||
_map["nfsopenhack"] = &nfsopenhack;
|
||||
_map["nullrw"] = &nullrw;
|
||||
|
|
|
@ -121,10 +121,11 @@ public:
|
|||
ConfigBOOL ignorepponrename;
|
||||
InodeCalc inodecalc;
|
||||
ConfigBOOL kernel_cache;
|
||||
ConfigBOOL lazy_umount_mountpoint;
|
||||
ConfigBOOL link_cow;
|
||||
LinkEXDEV link_exdev;
|
||||
LogMetrics log_metrics;
|
||||
ConfigSTR mount;
|
||||
ConfigSTR mountpoint;
|
||||
MoveOnENOSPC moveonenospc;
|
||||
NFSOpenHack nfsopenhack;
|
||||
ConfigBOOL nullrw;
|
||||
|
|
49
src/fs_umount2.hpp
Normal file
49
src/fs_umount2.hpp
Normal file
|
@ -0,0 +1,49 @@
|
|||
/*
|
||||
ISC License
|
||||
|
||||
Copyright (c) 2023, Antonio SJ Musumeci <trapexit@spawn.link>
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <errno.h>
|
||||
#include <sys/mount.h>
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace fs
|
||||
{
|
||||
static
|
||||
inline
|
||||
int
|
||||
umount2(const std::string target_,
|
||||
const int flags_)
|
||||
{
|
||||
int rv;
|
||||
|
||||
rv = ::umount2(target_.c_str(),
|
||||
flags_);
|
||||
|
||||
return ((rv == -1) ? -errno : rv);
|
||||
}
|
||||
|
||||
static
|
||||
inline
|
||||
int
|
||||
umount_lazy(const std::string target_)
|
||||
{
|
||||
return fs::umount2(target_,MNT_DETACH);
|
||||
}
|
||||
}
|
|
@ -326,7 +326,7 @@ namespace l
|
|||
st_,
|
||||
timeouts_);
|
||||
case LinkEXDEV::ENUM::ABS_POOL_SYMLINK:
|
||||
return l::link_exdev_abs_pool_symlink(cfg_->mount,
|
||||
return l::link_exdev_abs_pool_symlink(cfg_->mountpoint,
|
||||
oldpath_,
|
||||
newpath_,
|
||||
st_,
|
||||
|
|
|
@ -358,7 +358,7 @@ namespace l
|
|||
case RenameEXDEV::ENUM::ABS_SYMLINK:
|
||||
return l::rename_exdev_abs_symlink(cfg_->func.rename.policy,
|
||||
cfg_->branches,
|
||||
cfg_->mount,
|
||||
cfg_->mountpoint,
|
||||
oldfusepath_,
|
||||
newfusepath_);
|
||||
}
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
#include "syslog.hpp"
|
||||
|
||||
#include "fs_path.hpp"
|
||||
#include "fs_umount2.hpp"
|
||||
#include "mergerfs.hpp"
|
||||
#include "option_parser.hpp"
|
||||
#include "resources.hpp"
|
||||
|
@ -162,7 +163,7 @@ namespace l
|
|||
(uint64_t)cfg_->branches_mount_timeout);
|
||||
|
||||
timeout = std::chrono::milliseconds(cfg_->branches_mount_timeout * 1000);
|
||||
fs::wait_for_mount((std::string)cfg_->mount,
|
||||
fs::wait_for_mount((std::string)cfg_->mountpoint,
|
||||
paths,
|
||||
timeout,
|
||||
failed);
|
||||
|
@ -175,6 +176,32 @@ namespace l
|
|||
failed.size());
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
lazy_umount(const std::string target_)
|
||||
{
|
||||
int rv;
|
||||
|
||||
rv = fs::umount_lazy(target_);
|
||||
switch(rv)
|
||||
{
|
||||
case 0:
|
||||
syslog_notice("%s has been successfully lazily unmounted",
|
||||
target_.c_str());
|
||||
break;
|
||||
case -EINVAL:
|
||||
syslog_notice("%s was not a mount point needing to be unmounted",
|
||||
target_.c_str());
|
||||
break;
|
||||
default:
|
||||
syslog_error("Error unmounting %s: %d - %s",
|
||||
target_.c_str(),
|
||||
-rv,
|
||||
strerror(-rv));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
main(const int argc_,
|
||||
char **argv_)
|
||||
|
@ -205,6 +232,9 @@ namespace l
|
|||
l::setup_resources(cfg->scheduling_priority);
|
||||
l::get_fuse_operations(ops,cfg->nullrw);
|
||||
|
||||
if(cfg->lazy_umount_mountpoint)
|
||||
l::lazy_umount(cfg->mountpoint);
|
||||
|
||||
return fuse_main(args.argc,
|
||||
args.argv,
|
||||
&ops);
|
||||
|
|
|
@ -378,7 +378,7 @@ check_for_mount_loop(Config::Write &cfg_,
|
|||
fs::PathVector branches;
|
||||
std::error_code ec;
|
||||
|
||||
mount = (std::string)cfg_->mount;
|
||||
mount = (std::string)cfg_->mountpoint;
|
||||
branches = cfg_->branches->to_paths();
|
||||
for(const auto &branch : branches)
|
||||
{
|
||||
|
@ -416,7 +416,7 @@ namespace options
|
|||
|
||||
if(cfg->branches->empty())
|
||||
errs_->push_back({0,"branches not set"});
|
||||
if(cfg->mount->empty())
|
||||
if(cfg->mountpoint->empty())
|
||||
errs_->push_back({0,"mountpoint not set"});
|
||||
|
||||
check_for_mount_loop(cfg,errs_);
|
||||
|
|
|
@ -73,6 +73,17 @@ syslog_info(const char *format_,
|
|||
va_end(valist);
|
||||
}
|
||||
|
||||
void
|
||||
syslog_notice(const char *format_,
|
||||
...)
|
||||
{
|
||||
va_list valist;
|
||||
|
||||
va_start(valist,format_);
|
||||
syslog_log(LOG_NOTICE,format_,valist);
|
||||
va_end(valist);
|
||||
}
|
||||
|
||||
void
|
||||
syslog_warning(const char *format_,
|
||||
...)
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
void syslog_open();
|
||||
void syslog_log(const int priority, const char *format, ...);
|
||||
void syslog_info(const char *format, ...);
|
||||
void syslog_notice(const char *format, ...);
|
||||
void syslog_warning(const char *format, ...);
|
||||
void syslog_error(const char *format, ...);
|
||||
void syslog_close();
|
||||
|
|
Loading…
Reference in New Issue
Block a user