summary refs log tree commit diff
path: root/pkgs/tools
diff options
context:
space:
mode:
authorMathijs Kwik <mathijs@bluescreen303.nl>2012-12-30 12:14:20 +0100
committerMathijs Kwik <mathijs@bluescreen303.nl>2013-01-01 13:50:14 +0100
commit3d0b5b7a8fe8887a90a84d18b3cdd0b451190596 (patch)
treef5dfeaf65aad0287713844574db0e6f4986ebd13 /pkgs/tools
parent66a7fa30b80f54f25d531b69b757d8c1cd6a203b (diff)
downloadnixpkgs-3d0b5b7a8fe8887a90a84d18b3cdd0b451190596.tar
nixpkgs-3d0b5b7a8fe8887a90a84d18b3cdd0b451190596.tar.gz
nixpkgs-3d0b5b7a8fe8887a90a84d18b3cdd0b451190596.tar.bz2
nixpkgs-3d0b5b7a8fe8887a90a84d18b3cdd0b451190596.tar.lz
nixpkgs-3d0b5b7a8fe8887a90a84d18b3cdd0b451190596.tar.xz
nixpkgs-3d0b5b7a8fe8887a90a84d18b3cdd0b451190596.tar.zst
nixpkgs-3d0b5b7a8fe8887a90a84d18b3cdd0b451190596.zip
btrfs-progs: small patch to fix listing subvolumes on kernel 3.6+
The btrfs cleaner, introduced in 3.6 leaves some unresolvable entries,
which the userspace utils don't know how to handle.
Diffstat (limited to 'pkgs/tools')
-rw-r--r--pkgs/tools/filesystems/btrfsprogs/default.nix2
-rw-r--r--pkgs/tools/filesystems/btrfsprogs/subvol-listing.patch34
2 files changed, 36 insertions, 0 deletions
diff --git a/pkgs/tools/filesystems/btrfsprogs/default.nix b/pkgs/tools/filesystems/btrfsprogs/default.nix
index 4c1963f4633..c8a39a1672a 100644
--- a/pkgs/tools/filesystems/btrfsprogs/default.nix
+++ b/pkgs/tools/filesystems/btrfsprogs/default.nix
@@ -11,6 +11,8 @@ stdenv.mkDerivation {
     sha256 = "72d4cd4fb23d876a17146d6231ad40a2151fa47c648485c54cf7478239b43764";
   };
 
+  patches = [ ./subvol-listing.patch ];
+
   buildInputs = [ zlib libuuid acl attr e2fsprogs ];
 
   makeFlags = "prefix=$(out)";
diff --git a/pkgs/tools/filesystems/btrfsprogs/subvol-listing.patch b/pkgs/tools/filesystems/btrfsprogs/subvol-listing.patch
new file mode 100644
index 00000000000..1c113ddefbe
--- /dev/null
+++ b/pkgs/tools/filesystems/btrfsprogs/subvol-listing.patch
@@ -0,0 +1,34 @@
+--- 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;
+ }