diff --git a/0147-mkfs-Handle-creation-of-filesystem-larger-than-the-f.patch b/0147-mkfs-Handle-creation-of-filesystem-larger-than-the-f.patch index 19490ba..723fde5 100644 --- a/0147-mkfs-Handle-creation-of-filesystem-larger-than-the-f.patch +++ b/0147-mkfs-Handle-creation-of-filesystem-larger-than-the-f.patch @@ -19,11 +19,11 @@ Signed-off-by: Jan Kara utils.h | 2 +- 4 files changed, 8 insertions(+), 6 deletions(-) -diff --git a/convert.c b/convert.c -index c036f46..13f3ece 100644 ---- a/convert.c -+++ b/convert.c -@@ -2374,7 +2374,7 @@ int do_convert(const char *devname, int datacsum, int packing, int noxattr) +Index: btrfs-progs-v0.19-118-gfdb6c04/convert.c +=================================================================== +--- btrfs-progs-v0.19-118-gfdb6c04.orig/convert.c ++++ btrfs-progs-v0.19-118-gfdb6c04/convert.c +@@ -2374,7 +2374,7 @@ int do_convert(const char *devname, int goto fail; } ret = make_btrfs(fd, devname, ext2_fs->super->s_volume_name, @@ -32,11 +32,22 @@ index c036f46..13f3ece 100644 blocksize, blocksize); if (ret) { fprintf(stderr, "unable to create initial ctree\n"); -diff --git a/mkfs.c b/mkfs.c -index be236d0..97481bd 100644 ---- a/mkfs.c -+++ b/mkfs.c -@@ -1302,8 +1302,10 @@ int main(int ac, char **av) +Index: btrfs-progs-v0.19-118-gfdb6c04/mkfs.c +=================================================================== +--- btrfs-progs-v0.19-118-gfdb6c04.orig/mkfs.c ++++ btrfs-progs-v0.19-118-gfdb6c04/mkfs.c +@@ -1290,6 +1290,10 @@ int main(int ac, char **av) + ret = btrfs_prepare_device(fd, file, zero_end, &dev_block_count, &mixed); + if (block_count == 0) + block_count = dev_block_count; ++ else if (block_count > dev_block_count) { ++ fprintf(stderr, "%s is smaller than requested size\n", file); ++ exit(1); ++ } + } else { + ac = 0; + file = av[optind++]; +@@ -1302,8 +1306,10 @@ int main(int ac, char **av) first_file = file; source_dir_size = size_sourcedir(source_dir, sectorsize, &num_of_meta_chunks, &size_of_data); @@ -48,7 +59,7 @@ index be236d0..97481bd 100644 ret = zero_output_file(fd, block_count, sectorsize); if (ret) { fprintf(stderr, "unable to zero the output file\n"); -@@ -1329,7 +1331,7 @@ int main(int ac, char **av) +@@ -1329,7 +1335,7 @@ int main(int ac, char **av) leafsize * i; } @@ -57,10 +68,10 @@ index be236d0..97481bd 100644 nodesize, leafsize, sectorsize, stripesize); if (ret) { -diff --git a/utils.c b/utils.c -index 6c96548..a2be9c9 100644 ---- a/utils.c -+++ b/utils.c +Index: btrfs-progs-v0.19-118-gfdb6c04/utils.c +=================================================================== +--- btrfs-progs-v0.19-118-gfdb6c04.orig/utils.c ++++ btrfs-progs-v0.19-118-gfdb6c04/utils.c @@ -74,7 +74,7 @@ static u64 reference_root_table[] = { }; @@ -70,7 +81,7 @@ index 6c96548..a2be9c9 100644 u32 leafsize, u32 sectorsize, u32 stripesize) { struct btrfs_super_block super; -@@ -276,7 +276,7 @@ int make_btrfs(int fd, const char *device, const char *label, +@@ -276,7 +276,7 @@ int make_btrfs(int fd, const char *devic dev_item = btrfs_item_ptr(buf, nritems, struct btrfs_dev_item); btrfs_set_device_id(buf, dev_item, 1); btrfs_set_device_generation(buf, dev_item, 0); @@ -79,10 +90,10 @@ index 6c96548..a2be9c9 100644 btrfs_set_device_bytes_used(buf, dev_item, BTRFS_MKFS_SYSTEM_GROUP_SIZE); btrfs_set_device_io_align(buf, dev_item, sectorsize); -diff --git a/utils.h b/utils.h -index c5f55e1..bf2d5a4 100644 ---- a/utils.h -+++ b/utils.h +Index: btrfs-progs-v0.19-118-gfdb6c04/utils.h +=================================================================== +--- btrfs-progs-v0.19-118-gfdb6c04.orig/utils.h ++++ btrfs-progs-v0.19-118-gfdb6c04/utils.h @@ -22,7 +22,7 @@ #define BTRFS_MKFS_SYSTEM_GROUP_SIZE (4 * 1024 * 1024) @@ -92,6 +103,3 @@ index c5f55e1..bf2d5a4 100644 u32 leafsize, u32 sectorsize, u32 stripesize); int btrfs_make_root_dir(struct btrfs_trans_handle *trans, struct btrfs_root *root, u64 objectid); --- -1.7.6.233.gd79bc - diff --git a/0150-btrfs-progs-removed-extraneous-whitespace-from-mkfs-.patch b/0150-btrfs-progs-removed-extraneous-whitespace-from-mkfs-.patch index 7f3580f..4a9752b 100644 --- a/0150-btrfs-progs-removed-extraneous-whitespace-from-mkfs-.patch +++ b/0150-btrfs-progs-removed-extraneous-whitespace-from-mkfs-.patch @@ -16,7 +16,7 @@ Index: btrfs-progs-v0.19-118-gfdb6c04/man/mkfs.btrfs.8.in =================================================================== --- btrfs-progs-v0.19-118-gfdb6c04.orig/man/mkfs.btrfs.8.in +++ btrfs-progs-v0.19-118-gfdb6c04/man/mkfs.btrfs.8.in -@@ -5,16 +5,16 @@ mkfs.btrfs \- create an btrfs filesystem +@@ -5,17 +5,17 @@ mkfs.btrfs \- create an btrfs filesystem .B mkfs.btrfs [ \fB\-A\fP\fI alloc-start\fP ] [ \fB\-b\fP\fI byte-count\fP ] @@ -28,6 +28,7 @@ Index: btrfs-progs-v0.19-118-gfdb6c04/man/mkfs.btrfs.8.in -[ \fB \-M\fP\fI mixed data+metadata\fP ] -[ \fB \-n\fP\fI nodesize\fP ] -[ \fB \-s\fP\fI sectorsize\fP ] +-[ \fB \-T\fP ] -[ \fB \-h\fP ] -[ \fB \-V\fP ] \fI device\fP [ \fI device ...\fP ] +[ \fB\-d\fP\fI data-profile\fP ] @@ -38,6 +39,7 @@ Index: btrfs-progs-v0.19-118-gfdb6c04/man/mkfs.btrfs.8.in +[ \fB\-M\fP\fI mixed data+metadata\fP ] +[ \fB\-n\fP\fI nodesize\fP ] +[ \fB\-s\fP\fI sectorsize\fP ] ++[ \fB\-T\fP ] +[ \fB\-h\fP ] +[ \fB\-V\fP ] \fI device\fP [ \fI device ...\fP ] .SH DESCRIPTION diff --git a/0151-btrfs-progs-document-rootdir-mkfs-switch.patch b/0151-btrfs-progs-document-rootdir-mkfs-switch.patch index df57aef..11a0db2 100644 --- a/0151-btrfs-progs-document-rootdir-mkfs-switch.patch +++ b/0151-btrfs-progs-document-rootdir-mkfs-switch.patch @@ -17,16 +17,16 @@ Index: btrfs-progs-v0.19-118-gfdb6c04/man/mkfs.btrfs.8.in [ \fB\-n\fP\fI nodesize\fP ] [ \fB\-s\fP\fI sectorsize\fP ] +[ \fB\-r\fP\fI rootdir\fP ] + [ \fB\-T\fP ] [ \fB\-h\fP ] [ \fB\-V\fP ] \fI device\fP [ \fI device ...\fP ] - .SH DESCRIPTION -@@ -62,6 +63,9 @@ Specify the nodesize. By default the val +@@ -63,6 +64,9 @@ Specify the nodesize. By default the val \fB\-s\fR, \fB\-\-sectorsize \fIsize\fR Specify the sectorsize, the minimum block allocation. .TP +\fB\-r\fR, \fB\-\-rootdir \fIrootdir\fR +Specify a directory to copy into the newly created fs. +.TP - \fB\-V\fR, \fB\-\-version\fR - Print the \fBmkfs.btrfs\fP version and exit. - .SH AVAILABILITY + \fB\-T\fR, \fB\-\-nodiscard \fR + Do not perform whole device TRIM operation by default. + .TP diff --git a/0173-btrfs-progs-adjust-size-of-filesystem-if-blockdevice.patch b/0173-btrfs-progs-adjust-size-of-filesystem-if-blockdevice.patch new file mode 100644 index 0000000..1f52f24 --- /dev/null +++ b/0173-btrfs-progs-adjust-size-of-filesystem-if-blockdevice.patch @@ -0,0 +1,28 @@ +From 08121cd091aa7b555dcb09077296deec8b1c4d72 Mon Sep 17 00:00:00 2001 +From: David Sterba +Date: Tue, 13 Mar 2012 18:10:09 +0100 +Subject: [PATCH 1/8] btrfs-progs: adjust size of filesystem if blockdevice is + larger + +Signed-off-by: David Sterba +--- + utils.c | 3 +++ + 1 files changed, 3 insertions(+), 0 deletions(-) + +diff --git a/utils.c b/utils.c +index 0beaf80..f885307 100644 +--- a/utils.c ++++ b/utils.c +@@ -273,6 +273,9 @@ int make_btrfs(int fd, const char *device, const char *label, + btrfs_set_item_offset(buf, btrfs_item_nr(buf, nritems), itemoff); + btrfs_set_item_size(buf, btrfs_item_nr(buf, nritems), item_size); + ++ if (num_bytes < dev_num_bytes) ++ dev_num_bytes = num_bytes; ++ + dev_item = btrfs_item_ptr(buf, nritems, struct btrfs_dev_item); + btrfs_set_device_id(buf, dev_item, 1); + btrfs_set_device_generation(buf, dev_item, 0); +-- +1.7.6.233.gd79bc + diff --git a/0174-Btrfs-progs-nuke-redundant-zeroing-in-__list_subvol_.patch b/0174-Btrfs-progs-nuke-redundant-zeroing-in-__list_subvol_.patch new file mode 100644 index 0000000..00cbd2d --- /dev/null +++ b/0174-Btrfs-progs-nuke-redundant-zeroing-in-__list_subvol_.patch @@ -0,0 +1,31 @@ +From 04ed6645aa91d023c06c1db361a2a22f4615eea0 Mon Sep 17 00:00:00 2001 +From: Ilya Dryomov +Date: Mon, 12 Mar 2012 19:17:39 +0200 +Subject: [PATCH 2/8] Btrfs-progs: nuke redundant zeroing in + __list_subvol_search() + +There's no need to zero out things twice. + +Signed-off-by: Ilya Dryomov +--- + btrfs-list.c | 4 ---- + 1 files changed, 0 insertions(+), 4 deletions(-) + +diff --git a/btrfs-list.c b/btrfs-list.c +index 5f4a9be..44a73de 100644 +--- a/btrfs-list.c ++++ b/btrfs-list.c +@@ -569,10 +569,6 @@ static int __list_subvol_search(int fd, struct root_lookup *root_lookup) + root_lookup_init(root_lookup); + memset(&args, 0, sizeof(args)); + +- root_lookup_init(root_lookup); +- +- memset(&args, 0, sizeof(args)); +- + /* search in the tree of tree roots */ + sk->tree_id = 1; + +-- +1.7.6.233.gd79bc + diff --git a/0175-Btrfs-progs-refactor-resolve_root-function-a-bit.patch b/0175-Btrfs-progs-refactor-resolve_root-function-a-bit.patch new file mode 100644 index 0000000..3095e2b --- /dev/null +++ b/0175-Btrfs-progs-refactor-resolve_root-function-a-bit.patch @@ -0,0 +1,89 @@ +From 039e2ae2add77881b332667ef5c8e218cd208198 Mon Sep 17 00:00:00 2001 +From: Ilya Dryomov +Date: Mon, 12 Mar 2012 19:17:39 +0200 +Subject: [PATCH 3/8] Btrfs-progs: refactor resolve_root() function a bit + +Don't pass a pointer to root_id to resolve_root(). It's always the same as +ri->root_id, passing a pointer hints that root_id can somehow change which is +not true. + +Signed-off-by: Ilya Dryomov +--- + btrfs-list.c | 21 ++++++++++----------- + 1 files changed, 10 insertions(+), 11 deletions(-) + +diff --git a/btrfs-list.c b/btrfs-list.c +index 44a73de..cc1dc66 100644 +--- a/btrfs-list.c ++++ b/btrfs-list.c +@@ -200,7 +200,7 @@ static int add_root(struct root_lookup *root_lookup, + * in by lookup_ino_path + */ + static int resolve_root(struct root_lookup *rl, struct root_info *ri, +- u64 *root_id, u64 *parent_id, u64 *top_id, char **path) ++ u64 *parent_id, u64 *top_id, char **path) + { + char *full_path = NULL; + int len = 0; +@@ -254,7 +254,6 @@ static int resolve_root(struct root_lookup *rl, struct root_info *ri, + } + } + +- *root_id = ri->root_id; + *path = full_path; + + return 0; +@@ -692,23 +691,23 @@ int list_subvols(int fd, int print_parent) + n = rb_last(&root_lookup.root); + while (n) { + struct root_info *entry; +- u64 root_id; + u64 level; + u64 parent_id; + char *path; ++ + entry = rb_entry(n, struct root_info, rb_node); +- resolve_root(&root_lookup, entry, &root_id, &parent_id, +- &level, &path); ++ resolve_root(&root_lookup, entry, &parent_id, &level, &path); + if (print_parent) { + printf("ID %llu parent %llu top level %llu path %s\n", +- (unsigned long long)root_id, ++ (unsigned long long)entry->root_id, + (unsigned long long)parent_id, + (unsigned long long)level, path); + } else { + printf("ID %llu top level %llu path %s\n", +- (unsigned long long)root_id, ++ (unsigned long long)entry->root_id, + (unsigned long long)level, path); + } ++ + free(path); + n = rb_prev(n); + } +@@ -914,17 +913,17 @@ char *path_for_root(int fd, u64 root) + n = rb_last(&root_lookup.root); + while (n) { + struct root_info *entry; +- u64 root_id; + u64 parent_id; + u64 level; + char *path; ++ + entry = rb_entry(n, struct root_info, rb_node); +- resolve_root(&root_lookup, entry, &root_id, &parent_id, &level, +- &path); +- if (root_id == root) ++ resolve_root(&root_lookup, entry, &parent_id, &level, &path); ++ if (entry->root_id == root) + ret_path = path; + else + free(path); ++ + n = rb_prev(n); + } + +-- +1.7.6.233.gd79bc + diff --git a/0176-Btrfs-progs-bring-subvol-get-default-back-in.patch b/0176-Btrfs-progs-bring-subvol-get-default-back-in.patch new file mode 100644 index 0000000..9527a7c --- /dev/null +++ b/0176-Btrfs-progs-bring-subvol-get-default-back-in.patch @@ -0,0 +1,142 @@ +From ab67e5db559701b71a20e39948c5a531b7469362 Mon Sep 17 00:00:00 2001 +From: Ilya Dryomov +Date: Mon, 12 Mar 2012 19:17:39 +0200 +Subject: [PATCH 4/8] Btrfs-progs: bring 'subvol get-default' back in + +Commit bab2c565 accidentally broke 'subvol get-default' command by +removing almost all of the underlying code. Bring it back with some +fixes and improvements. + +Signed-off-by: Ilya Dryomov +--- + btrfs-list.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++- + ctree.h | 2 + + 2 files changed, 82 insertions(+), 1 deletions(-) + +diff --git a/btrfs-list.c b/btrfs-list.c +index cc1dc66..00c428b 100644 +--- a/btrfs-list.c ++++ b/btrfs-list.c +@@ -552,6 +552,60 @@ build: + return full; + } + ++static int get_default_subvolid(int fd, u64 *default_id) ++{ ++ struct btrfs_ioctl_search_args args; ++ struct btrfs_ioctl_search_key *sk = &args.key; ++ struct btrfs_ioctl_search_header *sh; ++ u64 found = 0; ++ int ret; ++ ++ memset(&args, 0, sizeof(args)); ++ ++ /* ++ * search for a dir item with a name 'default' in the tree of ++ * tree roots, it should point us to a default root ++ */ ++ sk->tree_id = 1; ++ ++ /* don't worry about ancient format and request only one item */ ++ sk->nr_items = 1; ++ ++ sk->max_objectid = BTRFS_ROOT_TREE_DIR_OBJECTID; ++ sk->min_objectid = BTRFS_ROOT_TREE_DIR_OBJECTID; ++ sk->max_type = BTRFS_DIR_ITEM_KEY; ++ sk->min_type = BTRFS_DIR_ITEM_KEY; ++ sk->max_offset = (u64)-1; ++ sk->max_transid = (u64)-1; ++ ++ ret = ioctl(fd, BTRFS_IOC_TREE_SEARCH, &args); ++ if (ret < 0) ++ return ret; ++ ++ /* the ioctl returns the number of items it found in nr_items */ ++ if (sk->nr_items == 0) ++ goto out; ++ ++ sh = (struct btrfs_ioctl_search_header *)args.buf; ++ ++ if (sh->type == BTRFS_DIR_ITEM_KEY) { ++ struct btrfs_dir_item *di; ++ int name_len; ++ char *name; ++ ++ di = (struct btrfs_dir_item *)(sh + 1); ++ name_len = btrfs_stack_dir_name_len(di); ++ name = (char *)(di + 1); ++ ++ if (!strncmp("default", name, name_len)) ++ found = btrfs_disk_key_objectid(&di->location); ++ } ++ ++out: ++ *default_id = found; ++ return 0; ++} ++ + static int __list_subvol_search(int fd, struct root_lookup *root_lookup) + { + int ret; +@@ -663,12 +717,32 @@ static int __list_subvol_fill_paths(int fd, struct root_lookup *root_lookup) + return 0; + } + +-int list_subvols(int fd, int print_parent) ++int list_subvols(int fd, int print_parent, int get_default) + { + struct root_lookup root_lookup; + struct rb_node *n; ++ u64 default_id; + int ret; + ++ if (get_default) { ++ ret = get_default_subvolid(fd, &default_id); ++ if (ret) { ++ fprintf(stderr, "ERROR: can't perform the search - %s\n", ++ strerror(errno)); ++ return ret; ++ } ++ if (default_id == 0) { ++ fprintf(stderr, "ERROR: 'default' dir item not found\n"); ++ return ret; ++ } ++ ++ /* no need to resolve roots if FS_TREE is default */ ++ if (default_id == BTRFS_FS_TREE_OBJECTID) { ++ printf("ID 5 (FS_TREE)\n"); ++ return ret; ++ } ++ } ++ + ret = __list_subvol_search(fd, &root_lookup); + if (ret) { + fprintf(stderr, "ERROR: can't perform the search - %s\n", +@@ -696,6 +770,11 @@ int list_subvols(int fd, int print_parent) + char *path; + + entry = rb_entry(n, struct root_info, rb_node); ++ if (get_default && entry->root_id != default_id) { ++ n = rb_prev(n); ++ continue; ++ } ++ + resolve_root(&root_lookup, entry, &parent_id, &level, &path); + if (print_parent) { + printf("ID %llu parent %llu top level %llu path %s\n", +diff --git a/ctree.h b/ctree.h +index 5309059..141ec59 100644 +--- a/ctree.h ++++ b/ctree.h +@@ -1416,6 +1416,8 @@ BTRFS_SETGET_FUNCS(dir_type, struct btrfs_dir_item, type, 8); + BTRFS_SETGET_FUNCS(dir_name_len, struct btrfs_dir_item, name_len, 16); + BTRFS_SETGET_FUNCS(dir_transid, struct btrfs_dir_item, transid, 64); + ++BTRFS_SETGET_STACK_FUNCS(stack_dir_name_len, struct btrfs_dir_item, name_len, 16); ++ + static inline void btrfs_dir_item_key(struct extent_buffer *eb, + struct btrfs_dir_item *item, + struct btrfs_disk_key *key) +-- +1.7.6.233.gd79bc + diff --git a/0177-Btrfs-progs-make-print-tree.c-aware-of-free-space-ca.patch b/0177-Btrfs-progs-make-print-tree.c-aware-of-free-space-ca.patch new file mode 100644 index 0000000..3daa7f6 --- /dev/null +++ b/0177-Btrfs-progs-make-print-tree.c-aware-of-free-space-ca.patch @@ -0,0 +1,185 @@ +From 55b993c8889135f51ce66b26caf54e3e17b03e34 Mon Sep 17 00:00:00 2001 +From: Ilya Dryomov +Date: Tue, 13 Mar 2012 18:36:56 +0200 +Subject: [PATCH 5/8] Btrfs-progs: make print-tree.c aware of free space cache + +This adds proper formatting for free space and inode cache items in +btrfs-debug-tree output. + +Signed-off-by: Ilya Dryomov +--- + ctree.h | 29 +++++++++++++++++++++++++++++ + print-tree.c | 52 +++++++++++++++++++++++++++++++++++++++++++--------- + 2 files changed, 72 insertions(+), 9 deletions(-) + +diff --git a/ctree.h b/ctree.h +index 141ec59..147c3cb 100644 +--- a/ctree.h ++++ b/ctree.h +@@ -256,6 +256,13 @@ struct btrfs_chunk { + /* additional stripes go here */ + } __attribute__ ((__packed__)); + ++struct btrfs_free_space_header { ++ struct btrfs_disk_key location; ++ __le64 generation; ++ __le64 num_entries; ++ __le64 num_bitmaps; ++} __attribute__ ((__packed__)); ++ + static inline unsigned long btrfs_chunk_item_size(int num_stripes) + { + BUG_ON(num_stripes == 0); +@@ -1432,6 +1439,28 @@ static inline void btrfs_set_dir_item_key(struct extent_buffer *eb, + write_eb_member(eb, item, struct btrfs_dir_item, location, key); + } + ++/* struct btrfs_free_space_header */ ++BTRFS_SETGET_FUNCS(free_space_entries, struct btrfs_free_space_header, ++ num_entries, 64); ++BTRFS_SETGET_FUNCS(free_space_bitmaps, struct btrfs_free_space_header, ++ num_bitmaps, 64); ++BTRFS_SETGET_FUNCS(free_space_generation, struct btrfs_free_space_header, ++ generation, 64); ++ ++static inline void btrfs_free_space_key(struct extent_buffer *eb, ++ struct btrfs_free_space_header *h, ++ struct btrfs_disk_key *key) ++{ ++ read_eb_member(eb, h, struct btrfs_free_space_header, location, key); ++} ++ ++static inline void btrfs_set_free_space_key(struct extent_buffer *eb, ++ struct btrfs_free_space_header *h, ++ struct btrfs_disk_key *key) ++{ ++ write_eb_member(eb, h, struct btrfs_free_space_header, location, key); ++} ++ + /* struct btrfs_disk_key */ + BTRFS_SETGET_STACK_FUNCS(disk_key_objectid, struct btrfs_disk_key, + objectid, 64); +diff --git a/print-tree.c b/print-tree.c +index fc134c0..face47a 100644 +--- a/print-tree.c ++++ b/print-tree.c +@@ -94,6 +94,7 @@ static void print_chunk(struct extent_buffer *eb, struct btrfs_chunk *chunk) + (unsigned long long)btrfs_stripe_offset_nr(eb, chunk, i)); + } + } ++ + static void print_dev_item(struct extent_buffer *eb, + struct btrfs_dev_item *dev_item) + { +@@ -276,8 +277,29 @@ static void print_root_ref(struct extent_buffer *leaf, int slot, char *tag) + namelen, namebuf); + } + +-static void print_key_type(u8 type) ++static void print_free_space_header(struct extent_buffer *leaf, int slot) + { ++ struct btrfs_free_space_header *header; ++ struct btrfs_disk_key location; ++ ++ header = btrfs_item_ptr(leaf, slot, struct btrfs_free_space_header); ++ btrfs_free_space_key(leaf, header, &location); ++ printf("\t\tlocation "); ++ btrfs_print_key(&location); ++ printf("\n"); ++ printf("\t\tcache generation %llu entries %llu bitmaps %llu\n", ++ (unsigned long long)btrfs_free_space_generation(leaf, header), ++ (unsigned long long)btrfs_free_space_entries(leaf, header), ++ (unsigned long long)btrfs_free_space_bitmaps(leaf, header)); ++} ++ ++static void print_key_type(u64 objectid, u8 type) ++{ ++ if (type == 0 && objectid == BTRFS_FREE_SPACE_OBJECTID) { ++ printf("UNTYPED"); ++ return; ++ } ++ + switch (type) { + case BTRFS_INODE_ITEM_KEY: + printf("INODE_ITEM"); +@@ -362,10 +384,10 @@ static void print_key_type(u8 type) + }; + } + +-static void print_objectid(unsigned long long objectid, u8 type) ++static void print_objectid(u64 objectid, u8 type) + { + if (type == BTRFS_DEV_EXTENT_KEY) { +- printf("%llu", objectid); /* device id */ ++ printf("%llu", (unsigned long long)objectid); /* device id */ + return; + } + +@@ -415,6 +437,12 @@ static void print_objectid(unsigned long long objectid, u8 type) + case BTRFS_EXTENT_CSUM_OBJECTID: + printf("EXTENT_CSUM"); + break; ++ case BTRFS_FREE_SPACE_OBJECTID: ++ printf("FREE_SPACE"); ++ break; ++ case BTRFS_FREE_INO_OBJECTID: ++ printf("FREE_INO"); ++ break; + case BTRFS_MULTIPLE_OBJECTIDS: + printf("MULTIPLE"); + break; +@@ -425,19 +453,19 @@ static void print_objectid(unsigned long long objectid, u8 type) + } + /* fall-thru */ + default: +- printf("%llu", objectid); ++ printf("%llu", (unsigned long long)objectid); + } + } + + void btrfs_print_key(struct btrfs_disk_key *disk_key) + { +- u8 type; ++ u64 objectid = btrfs_disk_key_objectid(disk_key); ++ u8 type = btrfs_disk_key_type(disk_key); ++ + printf("key ("); +- type = btrfs_disk_key_type(disk_key); +- print_objectid((unsigned long long)btrfs_disk_key_objectid(disk_key), +- type); ++ print_objectid(objectid, type); + printf(" "); +- print_key_type(type); ++ print_key_type(objectid, type); + printf(" %llu)", (unsigned long long)btrfs_disk_key_offset(disk_key)); + } + +@@ -460,6 +488,7 @@ void btrfs_print_leaf(struct btrfs_root *root, struct extent_buffer *l) + struct btrfs_block_group_item bg_item; + struct btrfs_dir_log_item *dlog; + u32 nr = btrfs_header_nritems(l); ++ u64 objectid; + u32 type; + + printf("leaf %llu items %d free space %d generation %llu owner %llu\n", +@@ -472,12 +501,17 @@ void btrfs_print_leaf(struct btrfs_root *root, struct extent_buffer *l) + for (i = 0 ; i < nr ; i++) { + item = btrfs_item_nr(l, i); + btrfs_item_key(l, &disk_key, i); ++ objectid = btrfs_disk_key_objectid(&disk_key); + type = btrfs_disk_key_type(&disk_key); + printf("\titem %d ", i); + btrfs_print_key(&disk_key); + printf(" itemoff %d itemsize %d\n", + btrfs_item_offset(l, item), + btrfs_item_size(l, item)); ++ ++ if (type == 0 && objectid == BTRFS_FREE_SPACE_OBJECTID) ++ print_free_space_header(l, i); ++ + switch (type) { + case BTRFS_INODE_ITEM_KEY: + ii = btrfs_item_ptr(l, i, struct btrfs_inode_item); +-- +1.7.6.233.gd79bc + diff --git a/0178-Btrfs-progs-allow-dup-for-data-chunks-in-mixed-mode.patch b/0178-Btrfs-progs-allow-dup-for-data-chunks-in-mixed-mode.patch new file mode 100644 index 0000000..ae23db3 --- /dev/null +++ b/0178-Btrfs-progs-allow-dup-for-data-chunks-in-mixed-mode.patch @@ -0,0 +1,72 @@ +From c64c11e0a2918e6319be9337a756979e1f398730 Mon Sep 17 00:00:00 2001 +From: Ilya Dryomov +Date: Tue, 13 Mar 2012 22:15:07 +0200 +Subject: [PATCH 6/8] Btrfs-progs: allow dup for data chunks in mixed mode + +Before commit a46e7ff2 was merged it was possible to create dup for +data+metadata chunks (mixed mode) by giving -m raid1 -d raid1 -M to +mkfs. a46e7ff2 purposefully disabled behind the scenes profile +upgrading/downgrading, so give users a chance to pick dup explicitly and +bail if dup for data is requested in normal mode. + +Signed-off-by: Ilya Dryomov +--- + mkfs.c | 16 ++++++++++++---- + 1 files changed, 12 insertions(+), 4 deletions(-) + +diff --git a/mkfs.c b/mkfs.c +index acdb646..cf571c4 100644 +--- a/mkfs.c ++++ b/mkfs.c +@@ -258,17 +258,23 @@ static int create_raid_groups(struct btrfs_trans_handle *trans, + + if (metadata_profile & ~allowed) { + fprintf(stderr, "unable to create FS with metadata " +- "profile %llu (%llu devices)\n", metadata_profile, ++ "profile %llu (have %llu devices)\n", metadata_profile, + num_devices); + exit(1); + } + if (data_profile & ~allowed) { + fprintf(stderr, "unable to create FS with data " +- "profile %llu (%llu devices)\n", data_profile, ++ "profile %llu (have %llu devices)\n", data_profile, + num_devices); + exit(1); + } + ++ /* allow dup'ed data chunks only in mixed mode */ ++ if (!mixed && (data_profile & BTRFS_BLOCK_GROUP_DUP)) { ++ fprintf(stderr, "dup for data is allowed only in mixed mode\n"); ++ exit(1); ++ } ++ + if (allowed & metadata_profile) { + u64 meta_flags = BTRFS_BLOCK_GROUP_METADATA; + +@@ -329,7 +335,7 @@ static void print_usage(void) + fprintf(stderr, "options:\n"); + fprintf(stderr, "\t -A --alloc-start the offset to start the FS\n"); + fprintf(stderr, "\t -b --byte-count total number of bytes in the FS\n"); +- fprintf(stderr, "\t -d --data data profile, raid0, raid1, raid10 or single\n"); ++ fprintf(stderr, "\t -d --data data profile, raid0, raid1, raid10, dup or single\n"); + fprintf(stderr, "\t -f --force don't check if a device is already mounted\n"); + fprintf(stderr, "\t -l --leafsize size of btree leaves\n"); + fprintf(stderr, "\t -L --label set a label\n"); +@@ -357,10 +363,12 @@ static u64 parse_profile(char *s) + return BTRFS_BLOCK_GROUP_RAID1; + } else if (strcmp(s, "raid10") == 0) { + return BTRFS_BLOCK_GROUP_RAID10; ++ } else if (strcmp(s, "dup") == 0) { ++ return BTRFS_BLOCK_GROUP_DUP; + } else if (strcmp(s, "single") == 0) { + return 0; + } else { +- fprintf(stderr, "Unknown option %s\n", s); ++ fprintf(stderr, "Unknown profile %s\n", s); + print_usage(); + } + /* not reached */ +-- +1.7.6.233.gd79bc + diff --git a/0179-btrfs-progs-mkfs-rename-T-to-K.patch b/0179-btrfs-progs-mkfs-rename-T-to-K.patch new file mode 100644 index 0000000..4a4bd51 --- /dev/null +++ b/0179-btrfs-progs-mkfs-rename-T-to-K.patch @@ -0,0 +1,79 @@ +From b6f17f9e5c87b93cd887088121551839d2f24b35 Mon Sep 17 00:00:00 2001 +From: David Sterba +Date: Mon, 26 Mar 2012 14:50:02 +0200 +Subject: [PATCH 7/8] btrfs-progs: mkfs: rename -T to -K + +Fixup to "mkfs: allow not to trim a device", to match mkfs.xfs option +name. + +Signed-off-by: David Sterba +--- + man/mkfs.btrfs.8.in | 4 ++-- + mkfs.c | 8 ++++---- + 2 files changed, 6 insertions(+), 6 deletions(-) + +diff --git a/man/mkfs.btrfs.8.in b/man/mkfs.btrfs.8.in +index 307d1fb..71f061d 100644 +--- a/man/mkfs.btrfs.8.in ++++ b/man/mkfs.btrfs.8.in +@@ -14,7 +14,7 @@ mkfs.btrfs \- create an btrfs filesystem + [ \fB\-n\fP\fI nodesize\fP ] + [ \fB\-s\fP\fI sectorsize\fP ] + [ \fB\-r\fP\fI rootdir\fP ] +-[ \fB\-T\fP ] ++[ \fB\-K\fP ] + [ \fB\-h\fP ] + [ \fB\-V\fP ] \fI device\fP [ \fI device ...\fP ] + .SH DESCRIPTION +@@ -67,7 +67,7 @@ Specify the sectorsize, the minimum block allocation. + \fB\-r\fR, \fB\-\-rootdir \fIrootdir\fR + Specify a directory to copy into the newly created fs. + .TP +-\fB\-T\fR, \fB\-\-nodiscard \fR ++\fB\-K\fR, \fB\-\-nodiscard \fR + Do not perform whole device TRIM operation by default. + .TP + \fB\-V\fR, \fB\-\-version\fR +diff --git a/mkfs.c b/mkfs.c +index cf571c4..d17f71c 100644 +--- a/mkfs.c ++++ b/mkfs.c +@@ -344,7 +344,7 @@ static void print_usage(void) + fprintf(stderr, "\t -n --nodesize size of btree nodes\n"); + fprintf(stderr, "\t -s --sectorsize min block allocation\n"); + fprintf(stderr, "\t -r --rootdir the source directory\n"); +- fprintf(stderr, "\t -T --nodiscard do not perform whole device TRIM\n"); ++ fprintf(stderr, "\t -K --nodiscard do not perform whole device TRIM\n"); + fprintf(stderr, "%s\n", BTRFS_BUILD_VERSION); + exit(1); + } +@@ -407,7 +407,7 @@ static struct option long_options[] = { + { "version", 0, NULL, 'V' }, + { "rootdir", 1, NULL, 'r' }, + { "force", 0, NULL, 'f' }, +- { "nodiscard", 0, NULL, 'T' }, ++ { "nodiscard", 0, NULL, 'K' }, + { 0, 0, 0, 0} + }; + +@@ -1236,7 +1236,7 @@ int main(int ac, char **av) + + while(1) { + int c; +- c = getopt_long(ac, av, "A:b:l:n:s:m:d:L:r:VMfT", long_options, ++ c = getopt_long(ac, av, "A:b:l:n:s:m:d:L:r:VMfK", long_options, + &option_index); + if (c < 0) + break; +@@ -1285,7 +1285,7 @@ int main(int ac, char **av) + case 'f': + force=1; + break; +- case 'T': ++ case 'K': + nodiscard=1; + break; + default: +-- +1.7.6.233.gd79bc + diff --git a/0180-btrfs-progs-use-IEEE1541-suffixes-for-sizes.patch b/0180-btrfs-progs-use-IEEE1541-suffixes-for-sizes.patch new file mode 100644 index 0000000..3db5cac --- /dev/null +++ b/0180-btrfs-progs-use-IEEE1541-suffixes-for-sizes.patch @@ -0,0 +1,30 @@ +From d37ac57247379f929cd25cc1388c3df8830d704d Mon Sep 17 00:00:00 2001 +From: David Sterba +Date: Mon, 26 Mar 2012 14:50:48 +0200 +Subject: [PATCH 8/8] btrfs-progs: use IEEE1541 suffixes for sizes + +IEEE 1541-2002 + +Signed-off-by: David Sterba +--- + utils.c | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/utils.c b/utils.c +index f885307..97e0da7 100644 +--- a/utils.c ++++ b/utils.c +@@ -1094,8 +1094,8 @@ out: + return ret; + } + +-static char *size_strs[] = { "", "KB", "MB", "GB", "TB", +- "PB", "EB", "ZB", "YB"}; ++static char *size_strs[] = { "", "KiB", "MiB", "GiB", "TiB", ++ "PiB", "EiB", "ZiB", "YiB"}; + char *pretty_sizes(u64 size) + { + int num_divs = 0; +-- +1.7.6.233.gd79bc + diff --git a/0181-btrfs-progs-mkfs-allow-not-to-trim-a-device.patch b/0181-btrfs-progs-mkfs-allow-not-to-trim-a-device.patch new file mode 100644 index 0000000..87a6b92 --- /dev/null +++ b/0181-btrfs-progs-mkfs-allow-not-to-trim-a-device.patch @@ -0,0 +1,152 @@ +From 251cef9c8992b79d9d80515387cb0c26ab3b154d Mon Sep 17 00:00:00 2001 +From: David Sterba +Date: Tue, 31 Jan 2012 15:32:28 +0100 +Subject: [PATCH] btrfs-progs: mkfs: allow not to trim a device + +Signed-off-by: David Sterba +--- + man/mkfs.btrfs.8.in | 4 ++++ + mkfs.c | 15 +++++++++++---- + utils.c | 18 +++++++++++++----- + utils.h | 2 ++ + 4 files changed, 30 insertions(+), 9 deletions(-) + +Index: btrfs-progs-v0.19-118-gfdb6c04/man/mkfs.btrfs.8.in +=================================================================== +--- btrfs-progs-v0.19-118-gfdb6c04.orig/man/mkfs.btrfs.8.in ++++ btrfs-progs-v0.19-118-gfdb6c04/man/mkfs.btrfs.8.in +@@ -13,6 +13,7 @@ mkfs.btrfs \- create an btrfs filesystem + [ \fB \-M\fP\fI mixed data+metadata\fP ] + [ \fB \-n\fP\fI nodesize\fP ] + [ \fB \-s\fP\fI sectorsize\fP ] ++[ \fB \-T\fP ] + [ \fB \-h\fP ] + [ \fB \-V\fP ] \fI device\fP [ \fI device ...\fP ] + .SH DESCRIPTION +@@ -62,6 +63,9 @@ Specify the nodesize. By default the val + \fB\-s\fR, \fB\-\-sectorsize \fIsize\fR + Specify the sectorsize, the minimum block allocation. + .TP ++\fB\-T\fR, \fB\-\-nodiscard \fR ++Do not perform whole device TRIM operation by default. ++.TP + \fB\-V\fR, \fB\-\-version\fR + Print the \fBmkfs.btrfs\fP version and exit. + .SH AVAILABILITY +Index: btrfs-progs-v0.19-118-gfdb6c04/mkfs.c +=================================================================== +--- btrfs-progs-v0.19-118-gfdb6c04.orig/mkfs.c ++++ btrfs-progs-v0.19-118-gfdb6c04/mkfs.c +@@ -311,6 +311,7 @@ static void print_usage(void) + fprintf(stderr, "\t -n --nodesize size of btree nodes\n"); + fprintf(stderr, "\t -s --sectorsize min block allocation\n"); + fprintf(stderr, "\t -r --rootdir the source directory\n"); ++ fprintf(stderr, "\t -T --nodiscard do not perform whole device TRIM\n"); + fprintf(stderr, "%s\n", BTRFS_BUILD_VERSION); + exit(1); + } +@@ -370,6 +371,7 @@ static struct option long_options[] = { + { "version", 0, NULL, 'V' }, + { "rootdir", 1, NULL, 'r' }, + { "force", 0, NULL, 'f' }, ++ { "nodiscard", 0, NULL, 'T' }, + { 0, 0, 0, 0} + }; + +@@ -1186,6 +1188,7 @@ int main(int ac, char **av) + int mixed = 0; + int data_profile_opt = 0; + int metadata_profile_opt = 0; ++ int nodiscard = 0; + + char *source_dir = NULL; + int source_dir_set = 0; +@@ -1197,7 +1200,7 @@ int main(int ac, char **av) + + while(1) { + int c; +- c = getopt_long(ac, av, "A:b:l:n:s:m:d:L:r:VMf", long_options, ++ c = getopt_long(ac, av, "A:b:l:n:s:m:d:L:r:VMfT", long_options, + &option_index); + if (c < 0) + break; +@@ -1246,6 +1249,9 @@ int main(int ac, char **av) + case 'f': + force=1; + break; ++ case 'T': ++ nodiscard=1; ++ break; + default: + print_usage(); + } +@@ -1287,7 +1293,8 @@ int main(int ac, char **av) + exit(1); + } + first_file = file; +- ret = btrfs_prepare_device(fd, file, zero_end, &dev_block_count, &mixed); ++ ret = __btrfs_prepare_device(fd, file, zero_end, ++ &dev_block_count, &mixed, nodiscard); + if (block_count == 0) + block_count = dev_block_count; + else if (block_count > dev_block_count) { +@@ -1392,8 +1399,8 @@ int main(int ac, char **av) + close(fd); + continue; + } +- ret = btrfs_prepare_device(fd, file, zero_end, +- &dev_block_count, &mixed); ++ ret = __btrfs_prepare_device(fd, file, zero_end, ++ &dev_block_count, &mixed, nodiscard); + mixed = old_mixed; + BUG_ON(ret); + +Index: btrfs-progs-v0.19-118-gfdb6c04/utils.c +=================================================================== +--- btrfs-progs-v0.19-118-gfdb6c04.orig/utils.c ++++ btrfs-progs-v0.19-118-gfdb6c04/utils.c +@@ -539,6 +539,12 @@ int btrfs_add_to_fsid(struct btrfs_trans + int btrfs_prepare_device(int fd, char *file, int zero_end, u64 *block_count_ret, + int *mixed) + { ++ /* discard by default when called from 'device add' */ ++ return __btrfs_prepare_device(fd, file, zero_end, block_count_ret, mixed, 0); ++} ++int __btrfs_prepare_device(int fd, char *file, int zero_end, u64 *block_count_ret, ++ int *mixed, int nodiscard) ++{ + u64 block_count; + u64 bytenr; + struct stat st; +@@ -562,11 +568,13 @@ int btrfs_prepare_device(int fd, char *f + *mixed = 1; + } + +- /* +- * We intentionally ignore errors from the discard ioctl. It is +- * not necessary for the mkfs functionality but just an optimization. +- */ +- discard_blocks(fd, 0, block_count); ++ if (!nodiscard) { ++ /* ++ * We intentionally ignore errors from the discard ioctl. It is ++ * not necessary for the mkfs functionality but just an optimization. ++ */ ++ discard_blocks(fd, 0, block_count); ++ } + + ret = zero_dev_start(fd); + if (ret) { +Index: btrfs-progs-v0.19-118-gfdb6c04/utils.h +=================================================================== +--- btrfs-progs-v0.19-118-gfdb6c04.orig/utils.h ++++ btrfs-progs-v0.19-118-gfdb6c04/utils.h +@@ -28,6 +28,8 @@ int btrfs_make_root_dir(struct btrfs_tra + struct btrfs_root *root, u64 objectid); + int btrfs_prepare_device(int fd, char *file, int zero_end, + u64 *block_count_ret, int *mixed); ++int __btrfs_prepare_device(int fd, char *file, int zero_end, ++ u64 *block_count_ret, int *mixed, int nodiscard); + int btrfs_add_to_fsid(struct btrfs_trans_handle *trans, + struct btrfs_root *root, int fd, char *path, + u64 block_count, u32 io_width, u32 io_align, diff --git a/0182-btrfs-progs-convert-set-label-or-copy-from-origin.patch b/0182-btrfs-progs-convert-set-label-or-copy-from-origin.patch new file mode 100644 index 0000000..5cc23ce --- /dev/null +++ b/0182-btrfs-progs-convert-set-label-or-copy-from-origin.patch @@ -0,0 +1,107 @@ +From 9e2b399e046af8a0ec96662b7b849fb7327384cc Mon Sep 17 00:00:00 2001 +From: David Sterba +Date: Tue, 31 Jan 2012 14:40:22 +0100 +Subject: [PATCH] btrfs-progs: convert: set label or copy from origin + +Signed-off-by: David Sterba +--- + convert.c | 46 ++++++++++++++++++++++++++++++++++++++-------- + 1 files changed, 38 insertions(+), 8 deletions(-) + +diff --git a/convert.c b/convert.c +index 13f3ece..3e74108 100644 +--- a/convert.c ++++ b/convert.c +@@ -2332,7 +2332,8 @@ err: + return ret; + } + +-int do_convert(const char *devname, int datacsum, int packing, int noxattr) ++int do_convert(const char *devname, int datacsum, int packing, int noxattr, ++ int copylabel, const char *fslabel) + { + int i, fd, ret; + u32 blocksize; +@@ -2424,6 +2425,17 @@ int do_convert(const char *devname, int datacsum, int packing, int noxattr) + fprintf(stderr, "error during create_ext2_image %d\n", ret); + goto fail; + } ++ memset(root->fs_info->super_copy.label, 0, BTRFS_LABEL_SIZE); ++ if (copylabel == 1) { ++ strncpy(root->fs_info->super_copy.label, ++ ext2_fs->super->s_volume_name, 16); ++ fprintf(stderr, "copy label '%s'\n", ++ root->fs_info->super_copy.label); ++ } else if (copylabel == -1) { ++ strncpy(root->fs_info->super_copy.label, fslabel, BTRFS_LABEL_SIZE); ++ fprintf(stderr, "set label to '%s'\n", fslabel); ++ } ++ + printf("cleaning up system chunk.\n"); + ret = cleanup_sys_chunk(root, ext2_root); + if (ret) { +@@ -2812,11 +2824,13 @@ fail: + + static void print_usage(void) + { +- printf("usage: btrfs-convert [-d] [-i] [-n] [-r] device\n"); +- printf("\t-d disable data checksum\n"); +- printf("\t-i ignore xattrs and ACLs\n"); +- printf("\t-n disable packing of small files\n"); +- printf("\t-r roll back to ext2fs\n"); ++ printf("usage: btrfs-convert [-d] [-i] [-n] [-r] [-l label] [-L] device\n"); ++ printf("\t-d disable data checksum\n"); ++ printf("\t-i ignore xattrs and ACLs\n"); ++ printf("\t-n disable packing of small files\n"); ++ printf("\t-r roll back to ext2fs\n"); ++ printf("\t-l LABEL set filesystem label\n"); ++ printf("\t-L use label from converted fs\n"); + } + + int main(int argc, char *argv[]) +@@ -2826,9 +2840,12 @@ int main(int argc, char *argv[]) + int noxattr = 0; + int datacsum = 1; + int rollback = 0; ++ int copylabel = 0; + char *file; ++ char *fslabel = NULL; ++ + while(1) { +- int c = getopt(argc, argv, "dinr"); ++ int c = getopt(argc, argv, "dinrl:L"); + if (c < 0) + break; + switch(c) { +@@ -2844,6 +2861,19 @@ int main(int argc, char *argv[]) + case 'r': + rollback = 1; + break; ++ case 'l': ++ copylabel = -1; ++ fslabel = strdup(optarg); ++ if (strlen(fslabel) > BTRFS_LABEL_SIZE) { ++ fprintf(stderr, ++ "warning: label too long, trimmed to %d bytes\n", ++ BTRFS_LABEL_SIZE); ++ fslabel[BTRFS_LABEL_SIZE]=0; ++ } ++ break; ++ case 'L': ++ copylabel = 1; ++ break; + default: + print_usage(); + return 1; +@@ -2864,7 +2894,7 @@ int main(int argc, char *argv[]) + if (rollback) { + ret = do_rollback(file, 0); + } else { +- ret = do_convert(file, datacsum, packing, noxattr); ++ ret = do_convert(file, datacsum, packing, noxattr, copylabel, fslabel); + } + if (ret) + return 1; +-- +1.7.9 + diff --git a/0183-btrfs-progs-mkfs-disallow-uneven-data-metadata-block.patch b/0183-btrfs-progs-mkfs-disallow-uneven-data-metadata-block.patch new file mode 100644 index 0000000..6c44671 --- /dev/null +++ b/0183-btrfs-progs-mkfs-disallow-uneven-data-metadata-block.patch @@ -0,0 +1,42 @@ +From 273488299effe9a9182fffc1a7cd9639b68a0da4 Mon Sep 17 00:00:00 2001 +From: David Sterba +Date: Fri, 17 Feb 2012 11:44:03 +0100 +Subject: [PATCH] btrfs-progs: mkfs: disallow uneven data/metadata blocksize + for mixed + +With support for bigger metadata blocks, we must avoid different +block size for mixed block groups, this causes corruption +(xfstests/083). + +Signed-off-by: David Sterba +--- + mkfs.c | 13 +++++++++++++ + 1 files changed, 13 insertions(+), 0 deletions(-) + +diff --git a/mkfs.c b/mkfs.c +index e3ced19..e02efcc 100644 +--- a/mkfs.c ++++ b/mkfs.c +@@ -1313,6 +1313,19 @@ int main(int ac, char **av) + "profiles must be the same\n"); + exit(1); + } ++ ++ if (leafsize != nodesize) { ++ fprintf(stderr, "With mixed block groups node and leaf " ++ "block sizes must be the same\n"); ++ exit(1); ++ } ++ ++ if (sectorsize != nodesize) { ++ fprintf(stderr, "With mixed block groups data and metadata " ++ "block sizes must be the same\n"); ++ exit(1); ++ } ++ + } + + blocks[0] = BTRFS_SUPER_INFO_OFFSET; +-- +1.7.6.233.gd79bc + diff --git a/0184-btrfs-progs-get-default-man-page.patch b/0184-btrfs-progs-get-default-man-page.patch new file mode 100644 index 0000000..e479d3b --- /dev/null +++ b/0184-btrfs-progs-get-default-man-page.patch @@ -0,0 +1,36 @@ +From 68b5d415ff9515863c2080aebfe8d069b00a47fc Mon Sep 17 00:00:00 2001 +From: Goffredo Baroncelli +Date: Mon, 26 Mar 2012 17:41:33 +0200 +Subject: [PATCH 01/10] btrfs-progs: get-default man page + +Added the man page info for the "btrfs subvolume get-default" command + +Signed-off-by: Goffredo Baroncelli +--- + btrfs_cmds.c | 10 ++++++++++ + 1 files changed, 10 insertions(+), 0 deletions(-) + +diff --git a/btrfs_cmds.c b/btrfs_cmds.c +index 558d40e..26a0700 100644 +--- a/btrfs_cmds.c ++++ b/btrfs_cmds.c +@@ -1761,6 +1761,16 @@ int do_change_label(int nargs, char **argv) + } + + ++/**** man: btrfs subvolume get-default ++ * ++ * \Bbtrfs\b \Bsubvolume get-default\b\I \i ++ * ++ * Query which subvolume of the filesystem will be mounted ++ * as default. ++ * ++ * Get the \Idefault\i subvolume of the filesystem \I\i. ++ ****/ ++ + int do_get_default_subvol(int nargs, char **argv) + { + int fd; +-- +1.7.6.233.gd79bc + diff --git a/0185-btrfs-progs-Correct-xstrip-function.patch b/0185-btrfs-progs-Correct-xstrip-function.patch new file mode 100644 index 0000000..8438ead --- /dev/null +++ b/0185-btrfs-progs-Correct-xstrip-function.patch @@ -0,0 +1,51 @@ +From e38f0663be83e68f682919ca4e2d60cf6683b643 Mon Sep 17 00:00:00 2001 +From: Goffredo Baroncelli +Date: Mon, 26 Mar 2012 17:43:26 +0200 +Subject: [PATCH 02/10] btrfs-progs: Correct xstrip() function + +Signed-off-by: Goffredo Baroncelli +--- + helpextract.c | 9 +++++---- + 1 files changed, 5 insertions(+), 4 deletions(-) + +diff --git a/helpextract.c b/helpextract.c +index 9489ea0..a729074 100644 +--- a/helpextract.c ++++ b/helpextract.c +@@ -38,20 +38,21 @@ static char *xstrip(char *s){ + + char *last=NULL; + char *first; ++ char prev; + + while(*s && isspace(*s) ) s++; + + first=s; +- ++ prev=*s; + while(*s){ +- if(isspace(*s)) last=s; ++ if(!isspace(prev) && isspace(*s)) last=s; ++ prev=*s; + s++; + } + + if(last) *last=0; + return first; + +- + } + + static void addtuple(char *key, char *cmdline, char *short_help, +@@ -184,7 +185,7 @@ static int search_in_file(char *nf){ + return 0; + } + +-/* remove all the escape sequence excepet \\ */ ++/* remove all the escape sequence except \\ */ + static char * my_escape(char *src, char *filters[] ){ + + static char buffer[LINEBUF*5]; +-- +1.7.6.233.gd79bc + diff --git a/0186-btrfs-progs-document-devid-parameter-for-resize.patch b/0186-btrfs-progs-document-devid-parameter-for-resize.patch new file mode 100644 index 0000000..fd9d66d --- /dev/null +++ b/0186-btrfs-progs-document-devid-parameter-for-resize.patch @@ -0,0 +1,53 @@ +From a8d78caea3bd1983181806f5110288f23c776005 Mon Sep 17 00:00:00 2001 +From: David Sterba +Date: Mon, 26 Mar 2012 18:00:58 +0200 +Subject: [PATCH 03/10] btrfs-progs: document devid parameter for resize + +Based on patch from Goffredo Baroncelli. + +Signed-off-by: David Sterba +--- + btrfs_cmds.c | 15 +++++++++------ + 1 files changed, 9 insertions(+), 6 deletions(-) + +diff --git a/btrfs_cmds.c b/btrfs_cmds.c +index 26a0700..0a741f0 100644 +--- a/btrfs_cmds.c ++++ b/btrfs_cmds.c +@@ -804,10 +804,9 @@ int do_scan(int argc, char **argv) + + /**** man: btrfs filesystem resize + * +- * \Bbtrfs\b \Bfilesystem resize\b\I [+/\-][gkm]|max \i ++ * \Bbtrfs\b \Bfilesystem resize\b\I [:][+/\-][gkm]|max \i + * +- * Resize the file system. If 'max' is passed, the filesystem +- * will occupe all available space on the device. ++ * Resize the file system. + * + * Resize a filesystem identified by \I\i. + * The \I\i parameter specifies the new size of the filesystem. +@@ -818,13 +817,17 @@ int do_scan(int argc, char **argv) + * the units designators: 'K', 'M', or 'G', kilobytes, megabytes, or gigabytes, + * respectively. + * +- * If 'max' is passed, the filesystem will occupy all available space on the ++ * If 'max' is specified, the filesystem will occupy all available space on the + * volume(s). + * +- * The \Bresize\b command \Bdoes not\b manipulate the size of underlying +- * partition. If you wish to enlarge/reduce a filesystem, you must make sure ++ * The \Bresize\b command \Bdoes not\b manipulate the size of the underlying ++ * partition. If you wish to enlarge/reduce a filesystem, you have to make sure + * you can expand the partition before enlarging the filesystem and shrink the + * partition after reducing the size of the filesystem. ++ * ++ * When the filesystem consists of multiple devices, it is possible to specify ++ * which one should be resized via the parameter. To know the ++ * of a device use the command \fBbtrfs filesystem show\fR. + ****/ + + int do_resize(int argc, char **argv) +-- +1.7.6.233.gd79bc + diff --git a/0187-btrfs-progs-document-csize-in-manpage.patch b/0187-btrfs-progs-document-csize-in-manpage.patch new file mode 100644 index 0000000..c3aace8 --- /dev/null +++ b/0187-btrfs-progs-document-csize-in-manpage.patch @@ -0,0 +1,41 @@ +From ffa4e18f557d39e5d4b2357a40e073607e0c98a0 Mon Sep 17 00:00:00 2001 +From: David Sterba +Date: Mon, 26 Mar 2012 18:14:20 +0200 +Subject: [PATCH 04/10] btrfs-progs: document csize in manpage + +Signed-off-by: David Sterba +--- + btrfs_cmds.c | 17 +++++++++++++++++ + 1 files changed, 17 insertions(+), 0 deletions(-) + +diff --git a/btrfs_cmds.c b/btrfs_cmds.c +index 0a741f0..17c3f8e 100644 +--- a/btrfs_cmds.c ++++ b/btrfs_cmds.c +@@ -2090,6 +2090,23 @@ out: + return ret; + } + ++/**** man: btrfs filesystem csize ++ * ++ * \Bbtrfs\b \Bfilesystem csize [-s \Istart\i\B] [-e \Iend\i\B] ++ * ++ * Read regular and compressed size of extents in the range \I[start,end)\i. ++ * ++ * Read regular and compressed size of extents in the range \I[start,end)\i. ++ * ++ * \B-s\b\I start\i ++ * range start inclusive, accepts K/M/G modifiers ++ * \B-e\b\I end\i ++ * range end exclusive, accepts K/M/G modifiers ++ * ++ * No range specified will read the whole file, no end of range reads up to ++ * the end of file. ++ ****/ ++ + int do_compr_size(int argc, char **argv) + { + int ret; +-- +1.7.6.233.gd79bc + diff --git a/0188-btrfs-progs-document-balance-in-manpage.patch b/0188-btrfs-progs-document-balance-in-manpage.patch new file mode 100644 index 0000000..1871cdf --- /dev/null +++ b/0188-btrfs-progs-document-balance-in-manpage.patch @@ -0,0 +1,126 @@ +From ba5f32986c342795eb910e8d77b5a5756af049ce Mon Sep 17 00:00:00 2001 +From: David Sterba +Date: Mon, 26 Mar 2012 19:25:41 +0200 +Subject: [PATCH 05/10] btrfs-progs: document balance in manpage + +Signed-off-by: David Sterba +--- + btrfs_cmds.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-- + 1 files changed, 71 insertions(+), 3 deletions(-) + +diff --git a/btrfs_cmds.c b/btrfs_cmds.c +index 17c3f8e..a7231d0 100644 +--- a/btrfs_cmds.c ++++ b/btrfs_cmds.c +@@ -1350,9 +1350,38 @@ static struct option balance_longopts[] = { + { 0, 0, 0, 0} + }; + +-/* +- * [-d [filters]] [-m [filters]] [-s [filters]] [-vf] +- */ ++/**** man: btrfs filesystem balance start ++ * ++ * \Bbtrfs\b \Bfilesystem balance start\b \B[-d [filters]] [-m [filters]] [-s [filters]] [-vf]\b \I\i ++ * ++ * Balance chunks accross the devices on filesystem under \Ipath\i. Control ++ * operation by subcommands. ++ * ++ * \B-d\b apply filters on data block groups ++ * ++ * \B-m\b apply filters on metadata block groups ++ * ++ * \B-s\b apply filters on system block groups ++ * ++ * \B-f\b force operation on system block groups ++ * ++ * \B-v\b verbose, dupms filters at the end of operation ++ * ++ * \Ifilters\i may be a comma separated list of the following items, see section \BBALANCE FILTERS\b for more. ++ * ++ * \Bprofile\b=raid0|raid1|raid10|single|dup specify profiles, multiple allowed, note to escape the '|' from shell ++ * ++ * \Busage\b= process only block groups with usage above \Innn\i percent ++ * ++ * \Bdevid\b= process only block groups on device \Idevid\i ++ * ++ * \Bconvert\b=raid0|raid1|radi10|single|dup convert raid profile to the specified one (only one profile allowed) ++ * ++ * \Bvrange\b=[start]..[end] virtual block address space subset filter ++ * ++ * \Bdrange\b=[start]..[end] devid subset filter, it's tied to devid filter: we say balance out range [start..end) on a particular devid. ++ ****/ ++ + int do_balance(int argc, char **argv) + { + int fd; +@@ -1496,6 +1525,16 @@ int do_balance(int argc, char **argv) + return 0; + } + ++/**** man: btrfs filesystem balance pause ++ * ++ * \Bbtrfs\b \Bfilesystem balance pause\b \I\i ++ * ++ * Pause balance operation at the first possible occasion. ++ * ++ * Pause balance operation at the first possible occasion. This may block for a ++ * few minutes if the balance is in the middle of processing. ++ ****/ ++ + int do_balance_pause(int argc, char **argv) + { + int fd; +@@ -1522,6 +1561,16 @@ int do_balance_pause(int argc, char **argv) + return 0; + } + ++/**** man: btrfs filesystem balance cancel ++ * ++ * \Bbtrfs\b \Bfilesystem balance cancel\b \I\i ++ * ++ * Cancel balance operation at the first possible occasion. ++ * ++ * Cancel balance operation at the first possible occasion. This may block for ++ * a few minutes if the balance is in the middle of processing. ++ ****/ ++ + int do_balance_cancel(int argc, char **argv) + { + int fd; +@@ -1548,6 +1597,15 @@ int do_balance_cancel(int argc, char **argv) + return 0; + } + ++/**** man: btrfs filesystem balance resume ++ * ++ * \Bbtrfs\b \Bfilesystem balance resume\b \I\i ++ * ++ * Resume balance operation. ++ * ++ * Resume balance operation and continue from the last position. ++ ****/ ++ + int do_balance_resume(int argc, char **argv) + { + int fd; +@@ -1601,6 +1659,16 @@ static struct option balance_progress_longopts[] = { + { 0, 0, 0, 0} + }; + ++/**** man: btrfs filesystem balance status ++ * ++ * \Bbtrfs\b \Bfilesystem balance status\b [-v] \I\i ++ * ++ * Show status of running or paused balance operation. ++ * ++ * Show status of running or paused balance operation. ++ * ++ * \B-v\b verbose ++ ****/ + int do_balance_progress(int argc, char **argv) + { + int fd; +-- +1.7.6.233.gd79bc + diff --git a/0189-btrfs-progs-manpage-fix-markup-in-device-scan.patch b/0189-btrfs-progs-manpage-fix-markup-in-device-scan.patch new file mode 100644 index 0000000..6a2523d --- /dev/null +++ b/0189-btrfs-progs-manpage-fix-markup-in-device-scan.patch @@ -0,0 +1,26 @@ +From 05b288e9a3ced5f077156726622904081f41388f Mon Sep 17 00:00:00 2001 +From: David Sterba +Date: Mon, 26 Mar 2012 23:35:14 +0200 +Subject: [PATCH 06/10] btrfs-progs: manpage:fix markup in device scan + +Signed-off-by: David Sterba +--- + btrfs_cmds.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +diff --git a/btrfs_cmds.c b/btrfs_cmds.c +index a7231d0..c2fd09e 100644 +--- a/btrfs_cmds.c ++++ b/btrfs_cmds.c +@@ -827,7 +827,7 @@ int do_scan(int argc, char **argv) + * + * When the filesystem consists of multiple devices, it is possible to specify + * which one should be resized via the parameter. To know the +- * of a device use the command \fBbtrfs filesystem show\fR. ++ * of a device use the command \Bbtrfs filesystem show\b. + ****/ + + int do_resize(int argc, char **argv) +-- +1.7.6.233.gd79bc + diff --git a/0190-btrfs-progs-document-fi-df.patch b/0190-btrfs-progs-document-fi-df.patch new file mode 100644 index 0000000..ebd54ae --- /dev/null +++ b/0190-btrfs-progs-document-fi-df.patch @@ -0,0 +1,55 @@ +From 13a29ecb84a41af67c1d96c2c5f2848738a2f570 Mon Sep 17 00:00:00 2001 +From: David Sterba +Date: Tue, 27 Mar 2012 00:02:35 +0200 +Subject: [PATCH 07/10] btrfs-progs: document fi df + +Signed-off-by: David Sterba +--- + btrfs_cmds.c | 31 +++++++++++++++++++++++++++++++ + 1 files changed, 31 insertions(+), 0 deletions(-) + +diff --git a/btrfs_cmds.c b/btrfs_cmds.c +index c2fd09e..f7310ee 100644 +--- a/btrfs_cmds.c ++++ b/btrfs_cmds.c +@@ -1871,6 +1871,37 @@ int do_get_default_subvol(int nargs, char **argv) + return 0; + } + ++/**** man: btrfs filesystem df ++ * ++ * \Bbtrfs\b \Bfilesystem df\b\I \i ++ * ++ * Print allocated and used data for all block group types. ++ * ++ * Print allocated and used data for all block group types. ++ * ++ * Example of filesystem created with default mkfs options: ++ * ++ * Data, RAID0: total=4.00GiB, used=0.00 ++ * Data: total=8.00MiB, used=0.00 ++ * System, RAID1: total=8.00MiB, used=4.00KiB ++ * System: total=4.00MiB, used=0.00 ++ * Metadata, RAID1: total=1.00GiB, used=24.00KiB ++ * Metadata: total=8.00MiB, used=0.00 ++ * ++ * Example of filesystem created with \Isingle\i profiles for data and metadata: ++ * ++ * Data: total=38.99GiB, used=58.89MiB ++ * System: total=4.00MiB, used=12.00KiB ++ * Metadata: total=1.01GiB, used=2.86MiB ++ * ++ * \Itotal\i allocated space ++ * \t ++ * \Iused\i actually used data ++ * ++ * This information gives better idea of allocated space than the 'df' utility, ++ * though it does not actually answer the question of how much free space there is. ++ ****/ ++ + int do_df_filesystem(int nargs, char **argv) + { + struct btrfs_ioctl_space_args *sargs; +-- +1.7.6.233.gd79bc + diff --git a/0191-btrfs-progs-document-inspect-internal-commands.patch b/0191-btrfs-progs-document-inspect-internal-commands.patch new file mode 100644 index 0000000..1c4b359 --- /dev/null +++ b/0191-btrfs-progs-document-inspect-internal-commands.patch @@ -0,0 +1,54 @@ +From 9219cfd9e5cb86a2123b3159056ad53b6efd578e Mon Sep 17 00:00:00 2001 +From: David Sterba +Date: Tue, 27 Mar 2012 00:15:39 +0200 +Subject: [PATCH 08/10] btrfs-progs: document inspect-internal commands + +Signed-off-by: David Sterba +--- + btrfs_cmds.c | 23 +++++++++++++++++++++++ + 1 files changed, 23 insertions(+), 0 deletions(-) + +diff --git a/btrfs_cmds.c b/btrfs_cmds.c +index f7310ee..cb6df70 100644 +--- a/btrfs_cmds.c ++++ b/btrfs_cmds.c +@@ -2047,6 +2047,17 @@ out: + return ret; + } + ++/**** man: btrfs inspect-internal inode-resolve ++ * ++ * \Bbtrfs\b \Binspect-internal inode-resolve\b \B[-v]\b\I \i ++ * ++ * Resolve given inode number to path name. ++ * ++ * Resolve given inode number to path name. This operation does not need to ++ * traverse the whole filesystem, but effectively uses internal ++ * structures. ++ ****/ ++ + int do_ino_to_path(int nargs, char **argv) + { + int fd; +@@ -2081,6 +2092,18 @@ int do_ino_to_path(int nargs, char **argv) + argv[optind+1]); + } + ++/**** man: btrfs inspect-internal logical-resolve ++ * ++ * \Bbtrfs\b \Binspect-internal logical-resolve\b \B[-v] [-P]\b\I \i ++ * ++ * Resolve given logical block number to path name or inode number. ++ * ++ * Resolve given logical block number to path name or inode number. Can be used ++ * in connection with scrub reports. ++ * ++ * \I-P\i print paths instead of inode numbers ++ ****/ ++ + int do_logical_to_ino(int nargs, char **argv) + { + int ret; +-- +1.7.6.233.gd79bc + diff --git a/0192-btrfs-progs-add-man-page-for-btrfs-convert.patch b/0192-btrfs-progs-add-man-page-for-btrfs-convert.patch new file mode 100644 index 0000000..6a47a82 --- /dev/null +++ b/0192-btrfs-progs-add-man-page-for-btrfs-convert.patch @@ -0,0 +1,104 @@ +From 2c19dc5e7bd5fe9a2838ec852128f64a5be54c4c Mon Sep 17 00:00:00 2001 +From: David Sterba +Date: Mon, 26 Mar 2012 15:39:08 +0200 +Subject: [PATCH 09/10] btrfs-progs: add man page for btrfs-convert + +Signed-off-by: David Sterba +--- + man/Makefile | 5 +++- + man/btrfs-convert.8.in | 60 ++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 64 insertions(+), 1 deletions(-) + create mode 100644 man/btrfs-convert.8.in + +diff --git a/man/Makefile b/man/Makefile +index 4a90b75..f28eec7 100644 +--- a/man/Makefile ++++ b/man/Makefile +@@ -7,7 +7,7 @@ mandir = $(prefix)/man + man8dir = $(mandir)/man8 + + MANPAGES = mkfs.btrfs.8.gz btrfsctl.8.gz btrfsck.8.gz btrfs-image.8.gz \ +- btrfs-show.8.gz btrfs.8.gz ++ btrfs-show.8.gz btrfs.8.gz btrfs-convert.8.gz + + all: $(MANPAGES) + +@@ -29,6 +29,9 @@ btrfs-image.8.gz: btrfs-image.8.in + btrfs-show.8.gz: btrfs-show.8.in + $(GZIP) -n -c btrfs-show.8.in > btrfs-show.8.gz + ++btrfs-convert.8.gz: btrfs-convert.8.in ++ $(GZIP) -n -c btrfs-convert.8.in > btrfs-convert.8.gz ++ + clean : + rm -f $(MANPAGES) + +diff --git a/man/btrfs-convert.8.in b/man/btrfs-convert.8.in +new file mode 100644 +index 0000000..4057419 +--- /dev/null ++++ b/man/btrfs-convert.8.in +@@ -0,0 +1,60 @@ ++.TH BTRFS-CONVERT 8 ++.SH NAME ++btrfs-convert \- convert ext2/ext3/ext4 filesystem image to btrfs in-place ++.SH SYNOPSIS ++.B btrfs-convert \fB[\-dinL]\fP \fB[\-r]\fP \fB[\-l\fP \fILABEL\fP\fB]\fP \fIdevice\fP ++.SH DESCRIPTION ++.B btrfs-convert ++is used to convert a ext2/ext3/ext4 filesystem image to a btrfs one. This is ++performed on an unmounted image. The conversion is done in-place and it's ++possible to do a rollback to original fs. The original filesystem image is ++accessible as a subvolume named \fIext2\_subvol\fP. ++ ++The success of the operation depends on amount of free space in the original ++filesystem, as btrfs uses this space to store it's own metadata and just adds ++pointers to the data blocks. ++ ++Duration of the operation depends on fragmentation and allocated space on the ++orignal filesystem, it may take seveal hours for a terabyte-sized filesystem. ++ ++If the operation does not finish succesfully, the image is recognized as the ++original fileystem. ++ ++.SH OPTIONS ++.TP ++\fB\-d\fP ++Disable data checksumming. This may speed up the convert operation. ++.TP ++\fB\-i\fP ++Do not convert ACLs. ++.TP ++\fB\-n\fP ++Disable packing of small files. ++.TP ++\fB\-l\fR \fILABEL\fP ++Set the label of btrfs filesystem to \fILABEL\fP. ++.TP ++\fB\-L\fP ++Copy label from the original filesystem to btrfs. ++.TP ++\fB\-r\fP ++Try rollback to the original filesystem. Beware that this may not always ++succeed if the btrfs filesystem has been changed in a way that prevents this. ++ ++.SH CAVEATS ++The resulting filesystem will inherit the fragmentation and it's possible to ++run whole filesystem defragmentation and then balance. ++ ++The raid profile of both data and metada will be \fIsingle\fP, this is not the ++same as default mkfs will create. Use balance with convert filter to change ++raid profile you want. ++ ++Security labels or quotas are not transferred to the new filesystem. ++ ++Block sizes must be at least of btrfs supported size (currently 4KB on x86_64). ++ ++.SH AVAILABILITY ++.B btrfs-convert ++is part of btrfs-progs. ++.SH SEE ALSO ++.BR mkfs.btrfs (8) +-- +1.7.6.233.gd79bc + diff --git a/0193-btrfs-progs-tweak-order-of-devices-in-fi-show.patch b/0193-btrfs-progs-tweak-order-of-devices-in-fi-show.patch new file mode 100644 index 0000000..18a0c69 --- /dev/null +++ b/0193-btrfs-progs-tweak-order-of-devices-in-fi-show.patch @@ -0,0 +1,28 @@ +From e2a577cb8f553a1cc74f949b0a798aa5f07d6302 Mon Sep 17 00:00:00 2001 +From: David Sterba +Date: Tue, 27 Mar 2012 00:51:11 +0200 +Subject: [PATCH 10/10] btrfs-progs: tweak order of devices in fi show + +Devids are printed in descending order, change it to ascending. + +Signed-off-by: David Sterba +--- + btrfs_cmds.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +diff --git a/btrfs_cmds.c b/btrfs_cmds.c +index cb6df70..82fb61f 100644 +--- a/btrfs_cmds.c ++++ b/btrfs_cmds.c +@@ -901,7 +901,7 @@ static void print_one_uuid(struct btrfs_fs_devices *fs_devices) + + free(super_bytes_used); + +- list_for_each(cur, &fs_devices->devices) { ++ list_for_each_prev(cur, &fs_devices->devices) { + char *total_bytes; + char *bytes_used; + device = list_entry(cur, struct btrfs_device, dev_list); +-- +1.7.6.233.gd79bc + diff --git a/boot-btrfs.sh b/boot-btrfs.sh index f63e8ce..3b1a217 100644 --- a/boot-btrfs.sh +++ b/boot-btrfs.sh @@ -1,7 +1,8 @@ #!/bin/bash -e #%stage: filesystem -#%if: "$rootfstype" = "btrfs" -#%programs: /sbin/btrfs /sbin/btrfs-zero-log /sbin/btrfs-convert /sbin/btrfs-select-super /sbin/btrfs-image /sbin/btrfstune /sbin/btrfs-restore /sbin/btrfs-find-root /sbin/btrfsck /sbin/mkfs.btrfs /sbin/btrfs-dump-super +#%if: -x /usr/sbin/btrfs +#%programs: /sbin/btrfs /sbin/btrfs-zero-log /sbin/btrfs-convert /sbin/btrfs-select-super /sbin/btrfs-image /sbin/btrfstune /sbin/btrfs-restore /sbin/btrfs-find-root /sbin/btrfsck /sbin/mkfs.btrfs /sbin/btrfs-dump-super /sbin/btrfs-debug-tree +#%modules: btrfs modprobe btrfs diff --git a/btrfs-dev-clear-sb b/btrfs-dev-clear-sb index e22c4ac..dafc692 100644 --- a/btrfs-dev-clear-sb +++ b/btrfs-dev-clear-sb @@ -32,11 +32,9 @@ if(!-b $dev) { print("Not a block device: $dev\n"); $size=(stat($dev))[7]; } else { - $size=`blkdev --getsize64 "$dev"`; + $size=`blockdev --getsize64 "$dev"`; } sysopen(F, $dev, O_EXCL | O_RDWR) or die("Cannot open $dev exclusively: $!"); -sysseek(F, 0, 2); -$size=tell(F); print("Device size: $size\n") if($dbg); for(my $i=0;$i<6;$i++) { my $off=btrfs_sb_offset($i); @@ -67,4 +65,8 @@ for(my $i=0;$i<6;$i++) { } close(F); print("Syncing dev\n"); -system("fsync \'$dev\'"); +if (!-b $dev) { + system("fsync \'$dev\'"); +} else { + system("blockdev --flushbufs \'$dev\'"); +} diff --git a/btrfs-man-update b/btrfs-man-update deleted file mode 100644 index e2ba47b..0000000 --- a/btrfs-man-update +++ /dev/null @@ -1,130 +0,0 @@ -Index: btrfs-progs-v0.19-118-gfdb6c04/man/btrfs.8.in -=================================================================== ---- btrfs-progs-v0.19-118-gfdb6c04.orig/man/btrfs.8.in -+++ btrfs-progs-v0.19-118-gfdb6c04/man/btrfs.8.in -@@ -29,15 +29,36 @@ btrfs \- control a btrfs filesystem - \fB\fBbtrfs\fP \fBfilesystem sync\fP\fI \fP - \fP - .PP --\fB\fBbtrfs\fP \fBscrub cancel\fP {\fI\fP|\fI\fP} -+\fB\fBbtrfs\fP \fBfilesystem df\fP\fI \fP - \fP - .PP --\fB\fBbtrfs\fP \fBscrub resume\fP [-Bdqru] {\fI\fP|\fI\fP} -+\fB\fBbtrfs\fP \fBfilesystem balance start [-d [filters]] [-m [filters]] [-s [filters]] [-vf]\fP\fI \fP -+\fP -+.PP -+\fB\fBbtrfs\fP \fBfilesystem balance pause\fP\fI \fP -+\fP -+.PP -+\fB\fBbtrfs\fP \fBfilesystem balance cancel\fP\fI \fP -+\fP -+.PP -+\fB\fBbtrfs\fP \fBfilesystem balance resume\fP\fI \fP -+\fP -+.PP -+\fB\fBbtrfs\fP \fBfilesystem balance status [-v]\fP\fI \fP -+\fP -+.PP -+\fB\fBbtrfs\fP \fBfilesystem csize [-s start] [-e end]\fP\fI \fP - \fP - .PP - \fB\fBbtrfs\fP \fBscrub start\fP [-Bdqru] {\fI\fP|\fI\fP} - \fP - .PP -+\fB\fBbtrfs\fP \fBscrub cancel\fP {\fI\fP|\fI\fP} -+\fP -+.PP -+\fB\fBbtrfs\fP \fBscrub resume\fP [-Bdqru] {\fI\fP|\fI\fP} -+\fP -+.PP - \fB\fBbtrfs\fP \fBscrub status\fP [-d] {\fI\fP|\fI\fP} - \fP - .PP -@@ -56,9 +77,18 @@ btrfs \- control a btrfs filesystem - \fB\fBbtrfs\fP \fBsubvolume set-default\fP\fI \fP - \fP - .PP -+\fB\fBbtrfs\fP \fBsubvolume get-default\fP\fI \fP -+\fP -+.PP - \fB\fBbtrfs\fP \fBsubvolume snapshot\fP\fI [-r] [/]\fP - \fP - .PP -+\fB\fBbtrfs\fP \fBinspect-internal inode-resolve [-v] \fP\fI\fP -+\fP -+.PP -+\fB\fBbtrfs\fP \fBinspect-internal logical-resolve [-v] [-P] \fP\fI\fP -+\fP -+.PP - .SH DESCRIPTION - \fBbtrfs\fP is used to control the filesystem and the files and directories - stored. It is the tool to create or destroy a snapshot or a subvolume for -@@ -171,24 +201,26 @@ otherwise the devices list is extracted - Force a sync for the filesystem identified by \fI\fP. - - .TP --\fBbtrfs\fP \fBscrub cancel\fP {\fI\fP|\fI\fP} --If a scrub is running on the filesystem identified by \fI\fP, cancel it. --Progress is saved in the scrub progress file and scrubbing can be resumed later --using the \fBscrub resume\fP command. --If a \fI\fP is given, the corresponding filesystem is found and --\fBscrub cancel\fP behaves as if it was called on that filesystem. -+\fBbtrfs\fP \fBfilesystem df\fP\fI \fP -+Show space usage information for the filesystem identified by \fI\fP. - - .TP --\fBbtrfs\fP \fBscrub resume\fP [-Bdqru] {\fI\fP|\fI\fP} --Resume a canceled or interrupted scrub cycle on the filesystem identified by --\fI\fP or on a given \fI\fP. Does not start a new scrub if the --last scrub finished successfully. --.RS -+\fBbtrfs\fP \fBfilesystem balance\fP\fI \fP -+ -+Balance chunks across the devices, control by subcommands \fIstart\fP, -+\fIpause\fP, \fIcancel\fP, \fIresume\fP and read \fIstatus\fP. See section -+BALANCE FILTERS for more details. - --\fIOptions\fP - .TP --see \fBscrub start\fP. --.RE -+\fB\fBbtrfs\fP \fBfilesystem csize [-s start] [-e end]\fP\fI \fP -+Read regular and compressed size of extents in the range \fI[start,end)\fP. -+ -+\fB-s start\fP -+range start inclusive, accepts K/M/G modifiers -+\fB-e end\fP -+range end exclusive, accepts K/M/G modifiers -+ -+No range reads whole file, no end of range reads up to the end of file. - - .TP - \fBbtrfs\fP \fBscrub start\fP [-Bdqru] {\fI\fP|\fI\fP} -@@ -213,6 +245,26 @@ Scrub unused space as well. (NOT IMPLEME - .RE - - .TP -+\fBbtrfs\fP \fBscrub cancel\fP {\fI\fP|\fI\fP} -+If a scrub is running on the filesystem identified by \fI\fP, cancel it. -+Progress is saved in the scrub progress file and scrubbing can be resumed later -+using the \fBscrub resume\fP command. -+If a \fI\fP is given, the corresponding filesystem is found and -+\fBscrub cancel\fP behaves as if it was called on that filesystem. -+ -+.TP -+\fBbtrfs\fP \fBscrub resume\fP [-Bdqru] {\fI\fP|\fI\fP} -+Resume a canceled or interrupted scrub cycle on the filesystem identified by -+\fI\fP or on a given \fI\fP. Does not start a new scrub if the -+last scrub finished successfully. -+.RS -+ -+\fIOptions\fP -+.TP -+see \fBscrub start\fP. -+.RE -+ -+.TP - \fBbtrfs\fP \fBscrub status\fP [-d] {\fI\fP|\fI\fP} - Show status of a running scrub for the filesystem identified by \fI\fP or - for the specified \fI\fP. diff --git a/btrfs-mkfs-update-disclaimer.patch b/btrfs-mkfs-update-disclaimer.patch deleted file mode 100644 index 939a4a0..0000000 --- a/btrfs-mkfs-update-disclaimer.patch +++ /dev/null @@ -1,28 +0,0 @@ -Index: btrfs-progs-v0.19-118-gfdb6c04/mkfs.c -=================================================================== ---- btrfs-progs-v0.19-118-gfdb6c04.orig/mkfs.c -+++ btrfs-progs-v0.19-118-gfdb6c04/mkfs.c -@@ -1297,8 +1297,13 @@ int main(int ac, char **av) - if (ac == 0) - print_usage(); - -- printf("\nWARNING! - %s IS EXPERIMENTAL\n", BTRFS_BUILD_VERSION); -- printf("WARNING! - see http://btrfs.wiki.kernel.org before using\n\n"); -+ printf("\n%s\n", BTRFS_BUILD_VERSION); -+ printf("\n\ -+ATTENTION:\n\ -+\n\ -+mkfs.btrfs is not intended to be used directly. Please use the\n\ -+YaST partitioner to create and manage btrfs filesystems to be\n\ -+in a supported state on SUSE Linux Enterprise systems.\n\n"); - - if (source_dir == 0) { - file = av[optind++]; -@@ -1456,7 +1461,6 @@ raid_groups: - pretty_buf = pretty_sizes(btrfs_super_total_bytes(&root->fs_info->super_copy))); - free(pretty_buf); - -- printf("%s\n", BTRFS_BUILD_VERSION); - btrfs_commit_transaction(trans, root); - - if (source_dir_set) { diff --git a/btrfsprogs.changes b/btrfsprogs.changes index b84f326..233762e 100644 --- a/btrfsprogs.changes +++ b/btrfsprogs.changes @@ -1,3 +1,33 @@ +------------------------------------------------------------------- +Sun Jun 16 23:39:42 UTC 2013 - jengelh@inai.de + +- Make requirement on libattr-devel explicit + +------------------------------------------------------------------- +Fri Apr 13 16:06:50 CEST 2012 - dsterba@suse.cz + +- initrd support: add module (bnc#750185, bnc#727383) + +------------------------------------------------------------------- +Tue Apr 10 21:50:00 UTC 2012 - frank.lichtenheld@sophos.com + +- set correct file mode if writing replacement fsck + +------------------------------------------------------------------- +Fri Apr 6 13:57:43 CEST 2012 - dsterba@suse.cz + +- fix build failure + +------------------------------------------------------------------- +Fri Apr 6 13:27:48 CEST 2012 - dsterba@suse.cz + +- add btrfs-debug-tree to initrd +- adjust fs size to correct size (bnc#744593) +- man page documentation updates +- do not package obsolete utilities +- mkfs: store correct size of device in superblock (bnc#730103) +- updated restriper/balance commands to match kernel version + ------------------------------------------------------------------- Fri Mar 9 16:26:20 UTC 2012 - rschweikert@suse.com @@ -12,7 +42,7 @@ Mon Mar 5 13:06:43 CET 2012 - dsterba@suse.cz - fix block group accounting - reset csums for rescue nodatasum mount - prune corrupt extent allocation tree blocks -- device scanning fixes for dm and multipath +- device scanning fixes for dm and multipath (bnc#749540) - initrd support: move btrfs device scan after block device setup - documentation updates - add csize for file commpressed size diff --git a/btrfsprogs.spec b/btrfsprogs.spec index 08680ef..535fc6d 100644 --- a/btrfsprogs.spec +++ b/btrfsprogs.spec @@ -1,7 +1,7 @@ # # spec file for package btrfsprogs # -# Copyright (c) 2012 SUSE LINUX Products GmbH, Nuernberg, Germany. +# Copyright (c) 2013 SUSE LINUX Products GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -24,7 +24,9 @@ Release: 0 Summary: Utilities for the Btrfs filesystem License: GPL-2.0 Group: System/Filesystems -Supplements: filesystem(btrfs) + +#Git-Web: http://git.kernel.org/cgit/linux/kernel/git/mason/btrfs-progs.git +#Git-Clone: git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-progs # git archive --format=tar --prefix=btrfs-progs-`git describe`/ HEAD > %D/btrfs-progs-`git describe`.tar Source: btrfs-progs-%{tar_version}.tar.bz2 Source1: boot-btrfs.sh @@ -79,6 +81,8 @@ Patch144: 0144-Btrfs-progs-print-the-objectid-of-the-root-we-find-w.patch Patch145: 0145-Btrfs-progs-make-specifying-root-objectid-work-if-th.patch Patch146: 0146-Btrfs-progs-don-t-free-the-existing-node.patch Patch147: 0147-mkfs-Handle-creation-of-filesystem-larger-than-the-f.patch +Patch181: 0181-btrfs-progs-mkfs-allow-not-to-trim-a-device.patch +Patch182: 0182-btrfs-progs-convert-set-label-or-copy-from-origin.patch Patch150: 0150-btrfs-progs-removed-extraneous-whitespace-from-mkfs-.patch Patch151: 0151-btrfs-progs-document-rootdir-mkfs-switch.patch Patch152: 0152-Add-open_ctree_fs_info-for-partial-FS-opens.patch @@ -102,6 +106,25 @@ Patch169: 0169-btrfsck-add-early-code-to-handle-corrupted-block-gro.patch Patch170: 0170-Btrfs-progs-btrfs-map-logical-Fix-typo-in-usage.patch Patch171: 0171-Btrfs-progs-btrfs-corrupt-block-fix-the-wrong-usage.patch Patch172: 0172-Btrfs-progs-fix-btrfsck-s-snapshot-wrong-unresolved-.patch +Patch173: 0173-btrfs-progs-adjust-size-of-filesystem-if-blockdevice.patch +Patch174: 0174-Btrfs-progs-nuke-redundant-zeroing-in-__list_subvol_.patch +Patch175: 0175-Btrfs-progs-refactor-resolve_root-function-a-bit.patch +Patch176: 0176-Btrfs-progs-bring-subvol-get-default-back-in.patch +Patch177: 0177-Btrfs-progs-make-print-tree.c-aware-of-free-space-ca.patch +Patch178: 0178-Btrfs-progs-allow-dup-for-data-chunks-in-mixed-mode.patch +Patch179: 0179-btrfs-progs-mkfs-rename-T-to-K.patch +Patch180: 0180-btrfs-progs-use-IEEE1541-suffixes-for-sizes.patch +Patch183: 0183-btrfs-progs-mkfs-disallow-uneven-data-metadata-block.patch +Patch184: 0184-btrfs-progs-get-default-man-page.patch +Patch185: 0185-btrfs-progs-Correct-xstrip-function.patch +Patch186: 0186-btrfs-progs-document-devid-parameter-for-resize.patch +Patch187: 0187-btrfs-progs-document-csize-in-manpage.patch +Patch188: 0188-btrfs-progs-document-balance-in-manpage.patch +Patch189: 0189-btrfs-progs-manpage-fix-markup-in-device-scan.patch +Patch190: 0190-btrfs-progs-document-fi-df.patch +Patch191: 0191-btrfs-progs-document-inspect-internal-commands.patch +Patch192: 0192-btrfs-progs-add-man-page-for-btrfs-convert.patch +Patch193: 0193-btrfs-progs-tweak-order-of-devices-in-fi-show.patch # other fixes Patch135: 0135-Btrfs-progs-fix-compiler-warning-of-extent-tree.c.patch @@ -111,18 +134,18 @@ Patch138: 0138-Btrfs-progs-bugfix-for-scrubbing-single-devices.patch # Patch250: btrfs-progs-fix-open_ctree_usage_segfaults.patch -Patch251: btrfs-mkfs-update-disclaimer.patch -Source252: btrfs-man-update Patch253: btrfs-reorder-commands-help BuildRoot: %{_tmppath}/%{name}-%{version}-build BuildRequires: libacl-devel +BuildRequires: libattr-devel BuildRequires: libext2fs-devel BuildRequires: libuuid-devel BuildRequires: lzo-devel BuildRequires: zlib-devel # for /bin/true Requires: coreutils +Supplements: filesystem(btrfs) %description Utilities needed to create and maintain btrfs file systems under Linux. @@ -176,6 +199,8 @@ Utilities needed to create and maintain btrfs file systems under Linux. %patch145 -p1 %patch146 -p1 %patch147 -p1 +%patch181 -p1 +%patch182 -p1 %patch150 -p1 %patch151 -p1 # other fixes @@ -204,8 +229,26 @@ Utilities needed to create and maintain btrfs file systems under Linux. %patch170 -p1 %patch171 -p1 %patch172 -p1 +%patch173 -p1 +%patch174 -p1 +%patch175 -p1 +%patch176 -p1 +%patch177 -p1 +%patch178 -p1 +%patch179 -p1 +%patch180 -p1 +%patch183 -p1 +%patch184 -p1 +%patch185 -p1 +%patch186 -p1 +%patch187 -p1 +%patch188 -p1 +%patch189 -p1 +%patch190 -p1 +%patch191 -p1 +%patch192 -p1 +%patch193 -p1 %patch250 -p1 -%patch251 -p1 #%patch252 -p1 %patch253 -p1 @@ -214,16 +257,17 @@ make %{?_smp_mflags} CFLAGS="%{optflags}" all btrfs-convert \ btrfs-zero-log btrfs-select-super btrfs-image btrfstune \ btrfs-find-root btrfs-restore btrfs-dump-super -patch -p1 < %{S:252} - %install make install DESTDIR=${RPM_BUILD_ROOT} prefix=%{_prefix} bindir=%{_sbindir} mandir=%{_mandir} install -m 0755 -d ${RPM_BUILD_ROOT}/%{_sbindir} install -m 0755 -d ${RPM_BUILD_ROOT}/%{_bindir} # add btrfs- prefix to generic names # move some utilities out of /usr/sbin -mv ${RPM_BUILD_ROOT}/%{_sbindir}/{btrfs-show,btrfs-vol,btrfsctl} ${RPM_BUILD_ROOT}/%{_bindir} -mv ${RPM_BUILD_ROOT}/%{_sbindir}/{btrfs-map-logical,btrfs-debug-tree} ${RPM_BUILD_ROOT}/%{_bindir} +mv ${RPM_BUILD_ROOT}/%{_sbindir}/btrfs-map-logical ${RPM_BUILD_ROOT}/%{_bindir} +# remove obsolete utilites +rm ${RPM_BUILD_ROOT}/%{_sbindir}/{btrfs-show,btrfs-vol,btrfsctl} +rm ${RPM_BUILD_ROOT}/%{_mandir}/man8/btrfs-show.* +rm ${RPM_BUILD_ROOT}/%{_mandir}/man8/btrfsctl.* # mkinitrd rescue utilities install -m 0755 btrfs-zero-log ${RPM_BUILD_ROOT}/%{_sbindir} install -m 0755 btrfs-select-super ${RPM_BUILD_ROOT}/%{_sbindir} @@ -244,11 +288,17 @@ ln -s %{_sbindir}/btrfsck ${RPM_BUILD_ROOT}/sbin ln -s %{_sbindir}/btrfs-restore ${RPM_BUILD_ROOT}/sbin ln -s %{_sbindir}/btrfs-find-root ${RPM_BUILD_ROOT}/sbin ln -s %{_sbindir}/btrfs-dump-super ${RPM_BUILD_ROOT}/sbin +ln -s %{_sbindir}/btrfs-debug-tree ${RPM_BUILD_ROOT}/sbin ln -s %{_sbindir}/mkfs.btrfs ${RPM_BUILD_ROOT}/sbin #EndUsrMerge # command line options are not compatible (bnc#599224) # copy needed if /bin is different fs from /sbin -cp %{_bindir}/true ${RPM_BUILD_ROOT}/%{_sbindir}/fsck.btrfs +if [ -x "%{_bindir}/true" ]; then + cp %{_bindir}/true ${RPM_BUILD_ROOT}/%{_sbindir}/fsck.btrfs +else + echo -e '#!/bin/sh\nexit 0' > ${RPM_BUILD_ROOT}/%{_sbindir}/fsck.btrfs + chmod +x ${RPM_BUILD_ROOT}/%{_sbindir}/fsck.btrfs +fi #UsrMerge ln -s %{_sbindir}/fsck.btrfs ${RPM_BUILD_ROOT}/sbin #EndUsrMerge @@ -272,6 +322,7 @@ install -m 0755 %{S:2} ${RPM_BUILD_ROOT}/usr/sbin/ /sbin/btrfs-find-root /sbin/btrfs-dump-super /sbin/mkfs.btrfs +/sbin/btrfs-debug-tree #EndUsrMerge %{_sbindir}/btrfs %{_sbindir}/btrfs-zero-log @@ -285,20 +336,15 @@ install -m 0755 %{S:2} ${RPM_BUILD_ROOT}/usr/sbin/ %{_sbindir}/btrfs-dump-super %{_sbindir}/fsck.btrfs %{_sbindir}/mkfs.btrfs +%{_sbindir}/btrfs-debug-tree /usr/sbin/btrfs-dev-clear-sb /lib/mkinitrd/scripts/boot-btrfs.sh # other /usr/bin/btrfs-map-logical -/usr/bin/btrfs-debug-tree -# obsolete -/usr/bin/btrfs-show -/usr/bin/btrfs-vol -/usr/bin/btrfsctl %_mandir/man8/btrfs-image.8.gz -%_mandir/man8/btrfs-show.8.gz %_mandir/man8/btrfsck.8.gz -%_mandir/man8/btrfsctl.8.gz %_mandir/man8/mkfs.btrfs.8.gz %_mandir/man8/btrfs.8.gz +%_mandir/man8/btrfs-convert.8.gz %changelog diff --git a/local-version-override.patch b/local-version-override.patch index b4123dc..d827a52 100644 --- a/local-version-override.patch +++ b/local-version-override.patch @@ -7,7 +7,7 @@ Index: btrfs-progs-v0.19-116-g13eced9/version.sh # Released under the GNU GPLv2 -v="Btrfs v0.19" -+v="v0.19+" ++v="v0.19+20120406" which git &> /dev/null if [ $? == 0 -a -d .git ]; then