[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