diff options
author | Mathijs Kwik <mathijs@bluescreen303.nl> | 2013-05-11 14:13:42 +0200 |
---|---|---|
committer | Mathijs Kwik <mathijs@bluescreen303.nl> | 2013-05-11 15:27:54 +0200 |
commit | 7761952d06d3e2c535f00d38796f98228b3946bb (patch) | |
tree | ef77ed2f7a970a8f8a93c00f2d8ab0cfe89b8c73 /pkgs/tools/filesystems | |
parent | c7b3fbddf01f8058d8c5d9fcd1e20d8629e0a3da (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')
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; - } |