mirror of https://github.com/trapexit/mergerfs.git
Antonio SJ Musumeci
10 years ago
36 changed files with 999 additions and 591 deletions
-
12src/access.cpp
-
14src/chmod.cpp
-
16src/chown.cpp
-
20src/create.cpp
-
338src/fs.cpp
-
72src/fs.hpp
-
13src/getattr.cpp
-
18src/getxattr.cpp
-
18src/ioctl.cpp
-
30src/link.cpp
-
14src/listxattr.cpp
-
19src/mkdir.cpp
-
21src/mknod.cpp
-
15src/open.cpp
-
55src/path.hpp
-
2src/policy.cpp
-
38src/policy.hpp
-
65src/policy_all.cpp
-
104src/policy_epmfs.cpp
-
70src/policy_ff.cpp
-
79src/policy_ffwp.cpp
-
69src/policy_fwfs.cpp
-
46src/policy_invalid.cpp
-
83src/policy_lfs.cpp
-
78src/policy_mfs.cpp
-
78src/policy_newest.cpp
-
55src/policy_rand.cpp
-
14src/readlink.cpp
-
15src/removexattr.cpp
-
29src/rename.cpp
-
12src/rmdir.cpp
-
20src/setxattr.cpp
-
15src/symlink.cpp
-
15src/truncate.cpp
-
13src/unlink.cpp
-
15src/utimens.cpp
@ -0,0 +1,55 @@ |
|||
/*
|
|||
The MIT License (MIT) |
|||
|
|||
Copyright (c) 2014 Antonio SJ Musumeci <trapexit@spawn.link> |
|||
|
|||
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. |
|||
*/ |
|||
|
|||
#ifndef __PATH_HPP__
|
|||
#define __PATH_HPP__
|
|||
|
|||
#include <string>
|
|||
#include <vector>
|
|||
|
|||
struct Path |
|||
{ |
|||
Path() {} |
|||
|
|||
explicit |
|||
Path(const std::string &b, |
|||
const std::string &f) |
|||
: base(b), |
|||
full(f) |
|||
{} |
|||
|
|||
explicit |
|||
Path(const char *b, |
|||
const std::string &f) |
|||
: base(b), |
|||
full(f) |
|||
{} |
|||
|
|||
std::string base; |
|||
std::string full; |
|||
}; |
|||
|
|||
typedef std::vector<Path> Paths; |
|||
|
|||
#endif /* __PATH_HPP__ */
|
@ -0,0 +1,65 @@ |
|||
/*
|
|||
The MIT License (MIT) |
|||
|
|||
Copyright (c) 2014 Antonio SJ Musumeci <trapexit@spawn.link> |
|||
|
|||
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 <sys/types.h>
|
|||
#include <sys/stat.h>
|
|||
#include <unistd.h>
|
|||
#include <errno.h>
|
|||
|
|||
#include <string>
|
|||
#include <vector>
|
|||
|
|||
#include "policy.hpp"
|
|||
|
|||
using std::string; |
|||
using std::vector; |
|||
using std::size_t; |
|||
|
|||
namespace mergerfs |
|||
{ |
|||
int |
|||
Policy::Func::all(const vector<string> &basepaths, |
|||
const string &fusepath, |
|||
const size_t minfreespace, |
|||
Paths &paths) |
|||
{ |
|||
int rv; |
|||
struct stat st; |
|||
string fullpath; |
|||
|
|||
for(vector<string>::const_iterator |
|||
iter = basepaths.begin(), eiter = basepaths.end(); |
|||
iter != eiter; |
|||
++iter) |
|||
{ |
|||
fullpath = fs::make_path(*iter,fusepath); |
|||
|
|||
rv = ::lstat(fullpath.c_str(),&st); |
|||
if(rv == 0) |
|||
paths.push_back(Path(*iter,fullpath)); |
|||
} |
|||
|
|||
return paths.empty() ? (errno=ENOENT,-1) : 0; |
|||
} |
|||
} |
@ -0,0 +1,104 @@ |
|||
/*
|
|||
The MIT License (MIT) |
|||
|
|||
Copyright (c) 2014 Antonio SJ Musumeci <trapexit@spawn.link> |
|||
|
|||
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 <errno.h>
|
|||
#include <sys/types.h>
|
|||
#include <sys/stat.h>
|
|||
#include <unistd.h>
|
|||
#include <sys/statvfs.h>
|
|||
|
|||
#include <string>
|
|||
#include <vector>
|
|||
|
|||
#include "policy.hpp"
|
|||
|
|||
using std::string; |
|||
using std::vector; |
|||
using std::size_t; |
|||
|
|||
namespace mergerfs |
|||
{ |
|||
int |
|||
Policy::Func::epmfs(const vector<string> &basepaths, |
|||
const string &fusepath, |
|||
const size_t minfreespace, |
|||
Paths &paths) |
|||
{ |
|||
fsblkcnt_t existingmfs; |
|||
fsblkcnt_t generalmfs; |
|||
string fullpath; |
|||
string generalmfspath; |
|||
string existingmfspath; |
|||
vector<string>::const_iterator iter = basepaths.begin(); |
|||
vector<string>::const_iterator eiter = basepaths.end(); |
|||
|
|||
if(iter == eiter) |
|||
return (errno = ENOENT,-1); |
|||
|
|||
existingmfs = 0; |
|||
generalmfs = 0; |
|||
do |
|||
{ |
|||
int rv; |
|||
struct statvfs fsstats; |
|||
const string &mountpoint = *iter; |
|||
|
|||
rv = ::statvfs(mountpoint.c_str(),&fsstats); |
|||
if(rv == 0) |
|||
{ |
|||
fsblkcnt_t spaceavail; |
|||
struct stat st; |
|||
|
|||
spaceavail = (fsstats.f_frsize * fsstats.f_bavail); |
|||
if(spaceavail > generalmfs) |
|||
{ |
|||
generalmfs = spaceavail; |
|||
generalmfspath = mountpoint; |
|||
} |
|||
|
|||
fullpath = fs::make_path(mountpoint,fusepath); |
|||
rv = ::lstat(fullpath.c_str(),&st); |
|||
if(rv == 0) |
|||
{ |
|||
if(spaceavail > existingmfs) |
|||
{ |
|||
existingmfs = spaceavail; |
|||
existingmfspath = mountpoint; |
|||
} |
|||
} |
|||
} |
|||
|
|||
++iter; |
|||
} |
|||
while(iter != eiter); |
|||
|
|||
if(existingmfspath.empty()) |
|||
existingmfspath = generalmfspath; |
|||
|
|||
paths.push_back(Path(existingmfspath, |
|||
fullpath)); |
|||
|
|||
return 0; |
|||
} |
|||
} |
@ -0,0 +1,70 @@ |
|||
/*
|
|||
The MIT License (MIT) |
|||
|
|||
Copyright (c) 2014 Antonio SJ Musumeci <trapexit@spawn.link> |
|||
|
|||
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 <sys/types.h>
|
|||
#include <sys/stat.h>
|
|||
#include <unistd.h>
|
|||
#include <errno.h>
|
|||
|
|||
#include <string>
|
|||
#include <vector>
|
|||
|
|||
#include "path.hpp"
|
|||
#include "policy.hpp"
|
|||
|
|||
using std::string; |
|||
using std::vector; |
|||
using std::size_t; |
|||
|
|||
namespace mergerfs |
|||
{ |
|||
int |
|||
Policy::Func::ff(const vector<string> &basepaths, |
|||
const string &fusepath, |
|||
const size_t minfreespace, |
|||
Paths &paths) |
|||
{ |
|||
errno = ENOENT; |
|||
for(vector<string>::const_iterator |
|||
iter = basepaths.begin(), eiter = basepaths.end(); |
|||
iter != eiter; |
|||
++iter) |
|||
{ |
|||
int rv; |
|||
struct stat st; |
|||
string fullpath; |
|||
|
|||
fullpath = fs::make_path(*iter,fusepath); |
|||
|
|||
rv = ::lstat(fullpath.c_str(),&st); |
|||
if(rv == 0) |
|||
{ |
|||
paths.push_back(Path(*iter,fullpath)); |
|||
return 0; |
|||
} |
|||
} |
|||
|
|||
return -1; |
|||
} |
|||
} |
@ -0,0 +1,79 @@ |
|||
/*
|
|||
The MIT License (MIT) |
|||
|
|||
Copyright (c) 2014 Antonio SJ Musumeci <trapexit@spawn.link> |
|||
|
|||
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 <sys/types.h>
|
|||
#include <sys/stat.h>
|
|||
#include <unistd.h>
|
|||
#include <errno.h>
|
|||
|
|||
#include <string>
|
|||
#include <vector>
|
|||
|
|||
#include "policy.hpp"
|
|||
|
|||
using std::string; |
|||
using std::vector; |
|||
using std::size_t; |
|||
|
|||
namespace mergerfs |
|||
{ |
|||
int |
|||
Policy::Func::ffwp(const vector<string> &basepaths, |
|||
const string &fusepath, |
|||
const size_t minfreespace, |
|||
Paths &paths) |
|||
{ |
|||
Path fallback; |
|||
|
|||
errno = ENOENT; |
|||
for(vector<string>::const_iterator |
|||
iter = basepaths.begin(), eiter = basepaths.end(); |
|||
iter != eiter; |
|||
++iter) |
|||
{ |
|||
int rv; |
|||
struct stat st; |
|||
string fullpath; |
|||
|
|||
fullpath = fs::make_path(*iter,fusepath); |
|||
|
|||
rv = ::lstat(fullpath.c_str(),&st); |
|||
if(rv == 0) |
|||
{ |
|||
paths.push_back(Path(*iter,fullpath)); |
|||
return 0; |
|||
} |
|||
else if(errno == EACCES) |
|||
{ |
|||
fallback.base = *iter; |
|||
fallback.full = fullpath; |
|||
} |
|||
} |
|||
|
|||
if(!fallback.base.empty()) |
|||
return (paths.push_back(fallback),0); |
|||
|
|||
return -1; |
|||
} |
|||
} |
@ -0,0 +1,69 @@ |
|||
/*
|
|||
The MIT License (MIT) |
|||
|
|||
Copyright (c) 2014 Antonio SJ Musumeci <trapexit@spawn.link> |
|||
|
|||
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 <sys/statvfs.h>
|
|||
#include <errno.h>
|
|||
|
|||
#include <string>
|
|||
#include <vector>
|
|||
|
|||
#include "policy.hpp"
|
|||
|
|||
using std::string; |
|||
using std::vector; |
|||
using std::size_t; |
|||
|
|||
namespace mergerfs |
|||
{ |
|||
int |
|||
Policy::Func::fwfs(const vector<string> &basepaths, |
|||
const string &fusepath, |
|||
const size_t minfreespace, |
|||
Paths &paths) |
|||
{ |
|||
for(size_t i = 0, size = basepaths.size(); i != size; i++) |
|||
{ |
|||
int rv; |
|||
const char *basepath; |
|||
struct statvfs fsstats; |
|||
|
|||
basepath = basepaths[i].c_str(); |
|||
rv = ::statvfs(basepath,&fsstats); |
|||
if(rv == 0) |
|||
{ |
|||
fsblkcnt_t spaceavail; |
|||
|
|||
spaceavail = (fsstats.f_frsize * fsstats.f_bavail); |
|||
if(spaceavail > minfreespace) |
|||
{ |
|||
paths.push_back(Path(basepath, |
|||
fs::make_path(basepath,fusepath))); |
|||
return 0; |
|||
} |
|||
} |
|||
} |
|||
|
|||
return mfs(basepaths,fusepath,minfreespace,paths); |
|||
} |
|||
} |
@ -0,0 +1,46 @@ |
|||
/*
|
|||
The MIT License (MIT) |
|||
|
|||
Copyright (c) 2014 Antonio SJ Musumeci <trapexit@spawn.link> |
|||
|
|||
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 <errno.h>
|
|||
|
|||
#include <string>
|
|||
#include <vector>
|
|||
|
|||
#include "policy.hpp"
|
|||
|
|||
using std::string; |
|||
using std::vector; |
|||
using std::size_t; |
|||
|
|||
namespace mergerfs |
|||
{ |
|||
int |
|||
Policy::Func::invalid(const vector<string> &basepaths, |
|||
const string &fusepath, |
|||
const size_t minfreespace, |
|||
Paths &rv) |
|||
{ |
|||
return (errno = EINVAL,-1); |
|||
} |
|||
} |
@ -0,0 +1,83 @@ |
|||
/*
|
|||
The MIT License (MIT) |
|||
|
|||
Copyright (c) 2014 Antonio SJ Musumeci <trapexit@spawn.link> |
|||
|
|||
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 <sys/types.h>
|
|||
#include <sys/stat.h>
|
|||
#include <sys/statvfs.h>
|
|||
#include <unistd.h>
|
|||
#include <errno.h>
|
|||
|
|||
#include <string>
|
|||
#include <vector>
|
|||
|
|||
#include "policy.hpp"
|
|||
|
|||
using std::string; |
|||
using std::vector; |
|||
using std::size_t; |
|||
|
|||
namespace mergerfs |
|||
{ |
|||
int |
|||
Policy::Func::lfs(const vector<string> &basepaths, |
|||
const string &fusepath, |
|||
const size_t minfreespace, |
|||
Paths &paths) |
|||
{ |
|||
fsblkcnt_t lfs; |
|||
const char *lfsstr; |
|||
|
|||
lfs = -1; |
|||
lfsstr = NULL; |
|||
for(size_t i = 0, size = basepaths.size(); i != size; i++) |
|||
{ |
|||
int rv; |
|||
const char *basepath; |
|||
struct statvfs fsstats; |
|||
|
|||
basepath = basepaths[i].c_str(); |
|||
rv = ::statvfs(basepath,&fsstats); |
|||
if(rv == 0) |
|||
{ |
|||
fsblkcnt_t spaceavail; |
|||
|
|||
spaceavail = (fsstats.f_frsize * fsstats.f_bavail); |
|||
if((spaceavail > minfreespace) && |
|||
(spaceavail < lfs)) |
|||
{ |
|||
lfs = spaceavail; |
|||
lfsstr = basepath; |
|||
} |
|||
} |
|||
} |
|||
|
|||
if(lfsstr == NULL) |
|||
return Policy::Func::mfs(basepaths,fusepath,minfreespace,paths); |
|||
|
|||
paths.push_back(Path(lfsstr, |
|||
fs::make_path(lfsstr,fusepath))); |
|||
|
|||
return 0; |
|||
} |
|||
} |
@ -0,0 +1,78 @@ |
|||
/*
|
|||
The MIT License (MIT) |
|||
|
|||
Copyright (c) 2014 Antonio SJ Musumeci <trapexit@spawn.link> |
|||
|
|||
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 <sys/statvfs.h>
|
|||
#include <errno.h>
|
|||
|
|||
#include <string>
|
|||
#include <vector>
|
|||
|
|||
#include "policy.hpp"
|
|||
|
|||
using std::string; |
|||
using std::vector; |
|||
using std::size_t; |
|||
|
|||
namespace mergerfs |
|||
{ |
|||
int |
|||
Policy::Func::mfs(const vector<string> &basepaths, |
|||
const string &fusepath, |
|||
const size_t minfreespace, |
|||
Paths &paths) |
|||
{ |
|||
fsblkcnt_t mfs; |
|||
size_t mfsidx; |
|||
|
|||
mfs = 0; |
|||
for(size_t i = 0, size = basepaths.size(); |
|||
i != size; |
|||
i++) |
|||
{ |
|||
int rv; |
|||
struct statvfs fsstats; |
|||
|
|||
rv = ::statvfs(basepaths[i].c_str(),&fsstats); |
|||
if(rv == 0) |
|||
{ |
|||
fsblkcnt_t spaceavail; |
|||
|
|||
spaceavail = (fsstats.f_frsize * fsstats.f_bavail); |
|||
if(spaceavail > mfs) |
|||
{ |
|||
mfs = spaceavail; |
|||
mfsidx = i; |
|||
} |
|||
} |
|||
} |
|||
|
|||
if(mfs == 0) |
|||
return (errno=ENOENT,-1); |
|||
|
|||
paths.push_back(Path(basepaths[mfsidx], |
|||
fs::make_path(basepaths[mfsidx],fusepath))); |
|||
|
|||
return 0; |
|||
} |
|||
} |
@ -0,0 +1,78 @@ |
|||
/*
|
|||
The MIT License (MIT) |
|||
|
|||
Copyright (c) 2014 Antonio SJ Musumeci <trapexit@spawn.link> |
|||
|
|||
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 <sys/types.h>
|
|||
#include <sys/stat.h>
|
|||
#include <unistd.h>
|
|||
#include <errno.h>
|
|||
|
|||
#include <string>
|
|||
#include <vector>
|
|||
|
|||
#include "policy.hpp"
|
|||
|
|||
using std::string; |
|||
using std::vector; |
|||
using std::size_t; |
|||
|
|||
namespace mergerfs |
|||
{ |
|||
int |
|||
Policy::Func::newest(const vector<string> &basepaths, |
|||
const string &fusepath, |
|||
const size_t minfreespace, |
|||
Paths &paths) |
|||
{ |
|||
time_t newest; |
|||
string npath; |
|||
vector<string>::const_iterator niter; |
|||
|
|||
newest = 0; |
|||
errno = ENOENT; |
|||
for(vector<string>::const_iterator |
|||
iter = basepaths.begin(), eiter = basepaths.end(); |
|||
iter != eiter; |
|||
++iter) |
|||
{ |
|||
int rv; |
|||
struct stat st; |
|||
string fullpath; |
|||
|
|||
fullpath = fs::make_path(*iter,fusepath); |
|||
|
|||
rv = ::lstat(fullpath.c_str(),&st); |
|||
if(rv == 0 && st.st_mtime > newest) |
|||
{ |
|||
newest = st.st_mtime; |
|||
niter = iter; |
|||
npath = fullpath; |
|||
} |
|||
} |
|||
|
|||
if(newest) |
|||
return (paths.push_back(Path(*niter,npath)),0); |
|||
|
|||
return -1; |
|||
} |
|||
} |
@ -0,0 +1,55 @@ |
|||
/*
|
|||
The MIT License (MIT) |
|||
|
|||
Copyright (c) 2014 Antonio SJ Musumeci <trapexit@spawn.link> |
|||
|
|||
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 <errno.h>
|
|||
|
|||
#include <string>
|
|||
#include <vector>
|
|||
#include <algorithm>
|
|||
|
|||
#include "policy.hpp"
|
|||
|
|||
using std::string; |
|||
using std::vector; |
|||
using std::size_t; |
|||
|
|||
namespace mergerfs |
|||
{ |
|||
int |
|||
Policy::Func::rand(const vector<string> &basepaths, |
|||
const string &fusepath, |
|||
const size_t minfreespace, |
|||
Paths &paths) |
|||
{ |
|||
int rv; |
|||
|
|||
rv = Policy::Func::all(basepaths,fusepath,minfreespace,paths); |
|||
if(rv == -1) |
|||
return -1; |
|||
|
|||
std::random_shuffle(paths.begin(),paths.end()); |
|||
|
|||
return 0; |
|||
} |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue