about summary refs log tree commit diff
path: root/pkgs/tools/filesystems
diff options
context:
space:
mode:
authorMathijs Kwik <mathijs@bluescreen303.nl>2013-05-11 14:13:42 +0200
committerMathijs Kwik <mathijs@bluescreen303.nl>2013-05-11 15:27:54 +0200
commit7761952d06d3e2c535f00d38796f98228b3946bb (patch)
treeef77ed2f7a970a8f8a93c00f2d8ab0cfe89b8c73 /pkgs/tools/filesystems
parentc7b3fbddf01f8058d8c5d9fcd1e20d8629e0a3da (diff)
btrfsprogs: upgrade to latest git
this incorporates all patches we already used and makes btrfs-send
work with kernel 3.9+
Diffstat (limited to 'pkgs/tools/filesystems')
-rw-r--r--pkgs/tools/filesystems/btrfsprogs/btrfs-progs-Fix-the-receive-code-pathing.patch146
-rw-r--r--pkgs/tools/filesystems/btrfsprogs/btrfs-receive-help-text.patch13
-rw-r--r--pkgs/tools/filesystems/btrfsprogs/btrfs-receive-lchown.patch12
-rw-r--r--pkgs/tools/filesystems/btrfsprogs/default.nix21
-rw-r--r--pkgs/tools/filesystems/btrfsprogs/subvol-listing.patch34
5 files changed, 8 insertions, 218 deletions
diff --git a/pkgs/tools/filesystems/btrfsprogs/btrfs-progs-Fix-the-receive-code-pathing.patch b/pkgs/tools/filesystems/btrfsprogs/btrfs-progs-Fix-the-receive-code-pathing.patch
deleted file mode 100644
index 6dd0639c607eb..0000000000000
--- a/pkgs/tools/filesystems/btrfsprogs/btrfs-progs-Fix-the-receive-code-pathing.patch
+++ /dev/null
@@ -1,146 +0,0 @@
-diff --git a/cmds-receive.c b/cmds-receive.c
-index a8be6fa..6b7cf12 100644
---- a/cmds-receive.c
-+++ b/cmds-receive.c
-@@ -52,11 +52,13 @@ static int g_verbose = 0;
- struct btrfs_receive
- {
- 	int mnt_fd;
-+	int dest_dir_fd;
-
- 	int write_fd;
- 	char *write_path;
-
- 	char *root_path;
-+	char *dest_dir_path; /* relative to root_path */
- 	char *full_subvol_path;
-
- 	struct subvol_info *cur_subvol;
-@@ -150,8 +152,11 @@ static int process_subvol(const char *path, const u8 *uuid, u64 ctransid,
- 	r->cur_subvol = calloc(1, sizeof(*r->cur_subvol));
- 	r->parent_subvol = NULL;
-
--	r->cur_subvol->path = strdup(path);
--	r->full_subvol_path = path_cat(r->root_path, path);
-+	if (strlen(r->dest_dir_path) == 0)
-+		r->cur_subvol->path = strdup(path);
-+	else
-+		r->cur_subvol->path = path_cat(r->dest_dir_path, path);
-+	r->full_subvol_path = path_cat3(r->root_path, r->dest_dir_path, path);
-
- 	fprintf(stderr, "At subvol %s\n", path);
-
-@@ -167,7 +172,7 @@ static int process_subvol(const char *path, const u8 *uuid, u64 ctransid,
-
- 	memset(&args_v1, 0, sizeof(args_v1));
- 	strcpy(args_v1.name, path);
--	ret = ioctl(r->mnt_fd, BTRFS_IOC_SUBVOL_CREATE, &args_v1);
-+	ret = ioctl(r->dest_dir_fd, BTRFS_IOC_SUBVOL_CREATE, &args_v1);
- 	if (ret < 0) {
- 		ret = -errno;
- 		fprintf(stderr, "ERROR: creating subvolume %s failed. "
-@@ -195,8 +200,11 @@ static int process_snapshot(const char *path, const u8 *uuid, u64 ctransid,
- 	r->cur_subvol = calloc(1, sizeof(*r->cur_subvol));
- 	r->parent_subvol = NULL;
-
--	r->cur_subvol->path = strdup(path);
--	r->full_subvol_path = path_cat(r->root_path, path);
-+	if (strlen(r->dest_dir_path) == 0)
-+		r->cur_subvol->path = strdup(path);
-+	else
-+		r->cur_subvol->path = path_cat(r->dest_dir_path, path);
-+	r->full_subvol_path = path_cat3(r->root_path, r->dest_dir_path, path);
-
- 	fprintf(stderr, "At snapshot %s\n", path);
-
-@@ -243,7 +251,7 @@ static int process_snapshot(const char *path, const u8 *uuid, u64 ctransid,
- 		goto out;
- 	}
-
--	ret = ioctl(r->mnt_fd, BTRFS_IOC_SNAP_CREATE_V2, &args_v2);
-+	ret = ioctl(r->dest_dir_fd, BTRFS_IOC_SNAP_CREATE_V2, &args_v2);
- 	close(args_v2.fd);
- 	if (ret < 0) {
- 		ret = -errno;
-@@ -790,17 +798,48 @@ struct btrfs_send_ops send_ops = {
- int do_receive(struct btrfs_receive *r, const char *tomnt, int r_fd)
- {
- 	int ret;
-+	char *dest_dir_full_path;
- 	int end = 0;
-
--	r->root_path = strdup(tomnt);
--	r->mnt_fd = open(tomnt, O_RDONLY | O_NOATIME);
-+	dest_dir_full_path = realpath(tomnt, NULL);
-+	if (!dest_dir_full_path) {
-+		ret = -errno;
-+		fprintf(stderr, "ERROR: realpath(%s) failed. %s\n", tomnt,
-+				strerror(-ret));
-+		goto out;
-+	}
-+	r->dest_dir_fd = open(dest_dir_full_path, O_RDONLY | O_NOATIME);
-+	if (r->dest_dir_fd < 0) {
-+		ret = -errno;
-+		fprintf(stderr, "ERROR: failed to open destination directory %s. %s\n",
-+			    dest_dir_full_path, strerror(-ret));
-+		goto out;
-+	}
-+
-+	ret = find_mount_root(dest_dir_full_path, &r->root_path);
-+	if (ret < 0) {
-+		ret = -EINVAL;
-+		fprintf(stderr, "ERROR: failed to determine mount point "
-+				"for %s\n", dest_dir_full_path);
-+		goto out;
-+	}
-+	r->mnt_fd = open(r->root_path, O_RDONLY | O_NOATIME);
- 	if (r->mnt_fd < 0) {
- 		ret = -errno;
--		fprintf(stderr, "ERROR: failed to open %s. %s\n", tomnt,
-+		fprintf(stderr, "ERROR: failed to open %s. %s\n", r->root_path,
- 				strerror(-ret));
- 		goto out;
- 	}
-
-+	/*
-+	 * find_mount_root returns a root_path that is a subpath of
-+	 * dest_dir_full_path. Now get the other part of root_path,
-+	 * which is the destination dir relative to root_path.
-+	 */
-+	r->dest_dir_path = dest_dir_full_path + strlen(r->root_path);
-+	if (r->dest_dir_path[0] == '/')
-+		r->dest_dir_path++;
-+
- 	ret = subvol_uuid_search_init(r->mnt_fd, &r->sus);
- 	if (ret < 0)
- 		return ret;
-diff --git a/cmds-send.c b/cmds-send.c
-index 9b47e70..c408bc7 100644
---- a/cmds-send.c
-+++ b/cmds-send.c
-@@ -81,6 +81,14 @@ int find_mount_root(const char *path, char **mount_root)
- 		}
- 	}
-
-+	if (!longest_match) {
-+		fprintf(stderr, "ERROR: Failed to find mount root for path %s.\n",
-+			    path);
-+		fprintf(stderr, "Please make sure that you have a valid \
-+			/etc/mtab file.\n");
-+		return -ENOENT;
-+	}
-+
- 	*mount_root = realpath(longest_match, NULL);
- 	free(longest_match);
-
-diff --git a/send-utils.h b/send-utils.h
-index da407eb..a3e038b 100644
---- a/send-utils.h
-+++ b/send-utils.h
-@@ -65,5 +65,6 @@ void subvol_uuid_search_add(struct subvol_uuid_search *s,
- char *path_cat(const char *p1, const char *p2);
- char *path_cat3(const char *p1, const char *p2, const char *p3);
-
-+int find_mount_root(const char *path, char **mount_root);
-
- #endif /* SEND_UTILS_H_ */
diff --git a/pkgs/tools/filesystems/btrfsprogs/btrfs-receive-help-text.patch b/pkgs/tools/filesystems/btrfsprogs/btrfs-receive-help-text.patch
deleted file mode 100644
index a9892cc780edf..0000000000000
--- a/pkgs/tools/filesystems/btrfsprogs/btrfs-receive-help-text.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff --git a/cmds-receive.c b/cmds-receive.c
-index a8be6fa..c182175 100644
---- a/cmds-receive.c
-+++ b/cmds-receive.c
-@@ -880,7 +880,7 @@ static const char * const receive_cmd_group_usage[] = {
- };
-
- static const char * const cmd_receive_usage[] = {
--	"btrfs receive [-v] [-i <infile>] <mount>",
-+	"btrfs receive [-v] [-f <infile>] <mount>",
- 	"Receive subvolumes from stdin.",
- 	"Receives one or more subvolumes that were previously ",
- 	"sent with btrfs send. The received subvolumes are stored",
diff --git a/pkgs/tools/filesystems/btrfsprogs/btrfs-receive-lchown.patch b/pkgs/tools/filesystems/btrfsprogs/btrfs-receive-lchown.patch
deleted file mode 100644
index 3abb1ba25d32b..0000000000000
--- a/pkgs/tools/filesystems/btrfsprogs/btrfs-receive-lchown.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff --git a/cmds-receive.c b/cmds-receive.c
-index 6b7cf12..a6a6a5b 100644
---- a/cmds-receive.c
-+++ b/cmds-receive.c
-@@ -731,7 +731,7 @@  static int process_chown(const char *path, u64 uid, u64 gid, void *user)
- 		fprintf(stderr, "chown %s - uid=%llu, gid=%llu\n", path,
- 				uid, gid);
-
--	ret = chown(full_path, uid, gid);
-+	ret = lchown(full_path, uid, gid);
- 	if (ret < 0) {
- 		ret = -errno;
diff --git a/pkgs/tools/filesystems/btrfsprogs/default.nix b/pkgs/tools/filesystems/btrfsprogs/default.nix
index a42c6aa7a7ec0..a091142db249b 100644
--- a/pkgs/tools/filesystems/btrfsprogs/default.nix
+++ b/pkgs/tools/filesystems/btrfsprogs/default.nix
@@ -1,31 +1,26 @@
-{ stdenv, fetchgit, zlib, libuuid, acl, attr, e2fsprogs }:
+{ stdenv, fetchgit, zlib, libuuid, acl, attr, e2fsprogs, lzo }:
 
-let version = "0.20pre20121005"; in
+let version = "0.20pre20130509"; in
 
 stdenv.mkDerivation {
   name = "btrfs-progs-${version}";
 
   src = fetchgit {
     url = "git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-progs.git";
-    rev = "91d9eec1ff044394f2b98ee7fcb76713dd33b994";
-    sha256 = "72d4cd4fb23d876a17146d6231ad40a2151fa47c648485c54cf7478239b43764";
+    rev = "650e656a8b9c1fbe4ec5cd8c48ae285b8abd3b69";
+    sha256 = "e50e8ce9d24505711ed855f69a73d639dc5e401692a7d1c300753de3472abb21";
   };
 
-  patches = [
-    ./subvol-listing.patch
-    ./btrfs-receive-help-text.patch
-    ./btrfs-progs-Fix-the-receive-code-pathing.patch
-    ./btrfs-receive-lchown.patch
-  ];
-
-  buildInputs = [ zlib libuuid acl attr e2fsprogs ];
+  buildInputs = [ zlib libuuid acl attr e2fsprogs lzo ];
 
   postPatch = ''
     cp ${./btrfs-set-received-uuid.c} btrfs-set-received-uuid.c
   '';
 
   postBuild = ''
-    gcc -O2 -luuid -o btrfs-set-received-uuid send-utils.o rbtree.o btrfs-list.o btrfs-set-received-uuid.c
+    gcc -Wall -D_FILE_OFFSET_BITS=64 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -DBTRFS_FLAT_INCLUDES \
+        -fPIC -g -O1 -luuid -o btrfs-set-received-uuid rbtree.o send-utils.o btrfs-list.o \
+        btrfs-set-received-uuid.c
   '';
 
   postInstall = ''
diff --git a/pkgs/tools/filesystems/btrfsprogs/subvol-listing.patch b/pkgs/tools/filesystems/btrfsprogs/subvol-listing.patch
deleted file mode 100644
index 1c113ddefbe3c..0000000000000
--- a/pkgs/tools/filesystems/btrfsprogs/subvol-listing.patch
+++ /dev/null
@@ -1,34 +0,0 @@
---- a/btrfs-list.c	2012-12-30 12:20:01.394137593 +0100
-+++ b/btrfs-list.c	2012-12-30 12:22:47.242452906 +0100
-@@ -1004,6 +1004,23 @@
- 	return 0;
- }
- 
-+static void __drop_deleting_roots(struct root_lookup *root_lookup)
-+{
-+	struct rb_node *n;
-+
-+again:
-+	n = rb_first(&root_lookup->root);
-+	while (n) {
-+		struct root_info *entry = rb_entry(n, struct root_info, rb_node);
-+		if (!entry->ref_tree) {
-+			rb_erase(n, &root_lookup->root);
-+			free(entry);
-+			goto again;
-+		}
-+		n = rb_next(n);
-+	}
-+}
-+
- static int __list_subvol_search(int fd, struct root_lookup *root_lookup)
- {
- 	int ret;
-@@ -1123,6 +1140,8 @@
- 			break;
- 	}
- 
-+	__drop_deleting_roots(root_lookup);
-+
- 	return 0;
- }