[Reproducible-commits] [disorderfs] 01/06: Only propagate locks if --propagate-locks=yes is provided
Andrew Ayer
agwa at andrewayer.name
Sun Oct 18 03:00:23 UTC 2015
This is an automated email from the git hooks/post-receive script.
agwa-guest pushed a commit to branch debian
in repository disorderfs.
commit d56bd58cd8cbf15e34b6ba961b7d468f3f11630e
Author: Andrew Ayer <agwa at andrewayer.name>
Date: Sun Sep 27 15:28:00 2015 -0700
Only propagate locks if --propagate-locks=yes is provided
Lock propagation is currently buggy.
Closes: #800063
---
disorderfs.cpp | 77 +++++++++++++++++++++++++++++++---------------------------
1 file changed, 41 insertions(+), 36 deletions(-)
diff --git a/disorderfs.cpp b/disorderfs.cpp
index 851d510..f3b6c68 100644
--- a/disorderfs.cpp
+++ b/disorderfs.cpp
@@ -49,6 +49,7 @@ namespace {
std::string root;
struct Disorderfs_config {
bool multi_user{false};
+ bool propagate_locks{false};
bool shuffle_dirents{false};
bool reverse_dirents{true};
unsigned int pad_blocks{1};
@@ -166,6 +167,8 @@ namespace {
const struct fuse_opt disorderfs_fuse_opts[] = {
DISORDERFS_OPT("--multi-user=no", multi_user, false),
DISORDERFS_OPT("--multi-user=yes", multi_user, true),
+ DISORDERFS_OPT("--propagate-locks=no", propagate_locks, false),
+ DISORDERFS_OPT("--propagate-locks=yes", propagate_locks, true),
DISORDERFS_OPT("--shuffle-dirents=no", shuffle_dirents, false),
DISORDERFS_OPT("--shuffle-dirents=yes", shuffle_dirents, true),
DISORDERFS_OPT("--reverse-dirents=no", reverse_dirents, false),
@@ -191,6 +194,7 @@ namespace {
std::clog << std::endl;
std::clog << "disorderfs options:" << std::endl;
std::clog << " --multi-user=yes|no allow multiple users to access overlay (requires root; default: no)" << std::endl;
+ std::clog << " --propagate-locks=yes|no propagate locks to underlying FS (BUGGY; default: no)" << std::endl;
std::clog << " --shuffle-dirents=yes|no randomly shuffle dirents? (default: no)" << std::endl;
std::clog << " --reverse-dirents=yes|no reverse dirent order? (default: yes)" << std::endl;
std::clog << " --pad-blocks=N add N to st_blocks (default: 1)" << std::endl;
@@ -213,9 +217,37 @@ int main (int argc, char** argv)
signal(SIGPIPE, SIG_IGN);
/*
+ * Parse command line options
+ */
+ struct fuse_args fargs = FUSE_ARGS_INIT(argc, argv);
+ fuse_opt_parse(&fargs, &config, disorderfs_fuse_opts, fuse_opt_proc);
+
+ if (bare_arguments.size() != 2) {
+ std::clog << "disorderfs: error: wrong number of arguments" << std::endl;
+ std::clog << "Usage: disorderfs [OPTIONS] ROOTDIR MOUNTPOINT" << std::endl;
+ return 2;
+ }
+
+ root = bare_arguments[0];
+
+ if (root[0] != '/') {
+ // TODO: support absolute paths by using *at syscalls everywhere, instead of string concatenation.
+ std::clog << "disorderfs: error: ROOTDIR is not an absolute path" << std::endl;
+ return 1;
+ }
+
+ // Add some of our own hard-coded FUSE options:
+ fuse_opt_add_arg(&fargs, "-o");
+ fuse_opt_add_arg(&fargs, "atomic_o_trunc,default_permissions"); // XXX: other mount options?
+ if (config.multi_user) {
+ fuse_opt_add_arg(&fargs, "-o");
+ fuse_opt_add_arg(&fargs, "allow_other");
+ }
+ fuse_opt_add_arg(&fargs, bare_arguments[1].c_str());
+
+ /*
* Initialize disorderfs_fuse_operations
*/
- std::memset(&disorderfs_fuse_operations, '\0', sizeof(disorderfs_fuse_operations));
disorderfs_fuse_operations.getattr = [] (const char* path, struct stat* st) -> int {
Guard g;
@@ -409,12 +441,14 @@ int main (int argc, char** argv)
st->st_blocks += config.pad_blocks;
return 0;
};
- disorderfs_fuse_operations.lock = [] (const char* path, struct fuse_file_info* info, int cmd, struct flock* lock) -> int {
- return ulockmgr_op(info->fh, cmd, lock, &info->lock_owner, sizeof(info->lock_owner));
- };
- disorderfs_fuse_operations.flock = [] (const char* path, struct fuse_file_info* info, int op) -> int {
- return wrap(flock(info->fh, op));
- };
+ if (config.propagate_locks) {
+ disorderfs_fuse_operations.lock = [] (const char* path, struct fuse_file_info* info, int cmd, struct flock* lock) -> int {
+ return ulockmgr_op(info->fh, cmd, lock, &info->lock_owner, sizeof(info->lock_owner));
+ };
+ disorderfs_fuse_operations.flock = [] (const char* path, struct fuse_file_info* info, int op) -> int {
+ return wrap(flock(info->fh, op));
+ };
+ }
disorderfs_fuse_operations.utimens = [] (const char* path, const struct timespec tv[2]) -> int {
Guard g;
return wrap(utimensat(AT_FDCWD, (root + path).c_str(), tv, AT_SYMLINK_NOFOLLOW));
@@ -467,34 +501,5 @@ int main (int argc, char** argv)
return wrap(fallocate(info->fh, mode, off, len));
};
- /*
- * Parse command line options
- */
- struct fuse_args fargs = FUSE_ARGS_INIT(argc, argv);
- fuse_opt_parse(&fargs, &config, disorderfs_fuse_opts, fuse_opt_proc);
-
- if (bare_arguments.size() != 2) {
- std::clog << "disorderfs: error: wrong number of arguments" << std::endl;
- std::clog << "Usage: disorderfs [OPTIONS] ROOTDIR MOUNTPOINT" << std::endl;
- return 2;
- }
-
- root = bare_arguments[0];
-
- if (root[0] != '/') {
- // TODO: support absolute paths by using *at syscalls everywhere, instead of string concatenation.
- std::clog << "disorderfs: error: ROOTDIR is not an absolute path" << std::endl;
- return 1;
- }
-
- // Add some of our own hard-coded FUSE options:
- fuse_opt_add_arg(&fargs, "-o");
- fuse_opt_add_arg(&fargs, "atomic_o_trunc,default_permissions"); // XXX: other mount options?
- if (config.multi_user) {
- fuse_opt_add_arg(&fargs, "-o");
- fuse_opt_add_arg(&fargs, "allow_other");
- }
- fuse_opt_add_arg(&fargs, bare_arguments[1].c_str());
-
return fuse_main(fargs.argc, fargs.argv, &disorderfs_fuse_operations, nullptr);
}
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/reproducible/disorderfs.git
More information about the Reproducible-commits
mailing list