From 0c10be57b72901464d4bb9ea7b5383c42b08bcae Mon Sep 17 00:00:00 2001 From: Nitin A Kamble Date: Thu, 9 Jun 2011 18:12:12 -0700 Subject: btrfs-tools: new recipe for tools to operate on btrfs images Added these patches to the recipe to get it to work as desired: Upstream patches from tmp & for-dragonn branches of repository http://git.kernel.org/?p=linux/kernel/git/mason/btrfs-progs-unstable.git Also included the debian patches. Nitin's patch to make the makefile cross friendly And Xin Zhong's patch to improve mkfs.btrfs (From OE-Core rev: 57a2140dc9673c65fea088fbd024fbd002e6937b) Signed-off-by: Nitin A Kamble Signed-off-by: Richard Purdie --- .../btrfs-tools/btrfs-tools/mkfs-xin-fixes.patch | 183 +++++++++++++++++++++ 1 file changed, 183 insertions(+) create mode 100644 meta/recipes-devtools/btrfs-tools/btrfs-tools/mkfs-xin-fixes.patch (limited to 'meta/recipes-devtools/btrfs-tools/btrfs-tools/mkfs-xin-fixes.patch') diff --git a/meta/recipes-devtools/btrfs-tools/btrfs-tools/mkfs-xin-fixes.patch b/meta/recipes-devtools/btrfs-tools/btrfs-tools/mkfs-xin-fixes.patch new file mode 100644 index 0000000000..47fc97725a --- /dev/null +++ b/meta/recipes-devtools/btrfs-tools/btrfs-tools/mkfs-xin-fixes.patch @@ -0,0 +1,183 @@ +Upstream-Status: Pending + +This patch is made by xin.zhong@intel.com to implement these supported +features in mkfs.btrfs: + * populate fs image from a directory while creating it + * reduce minimum size of the created image from 256MB to around 24MB + * while creating image use the specified device name rather than output.img + +Patch tested and incorporated in poky by: +Nitin A Kamble 2011/06/20 + +diff --git a/file-item.c b/file-item.c +index 9732282..aed42c3 100644 +--- a/file-item.c ++++ b/file-item.c +@@ -193,7 +193,7 @@ int btrfs_csum_file_block(struct btrfs_trans_handle *trans, + struct btrfs_root *root, u64 alloc_end, + u64 bytenr, char *data, size_t len) + { +- int ret; ++ int ret = 0; + struct btrfs_key file_key; + struct btrfs_key found_key; + u64 next_offset = (u64)-1; +diff --git a/mkfs.c b/mkfs.c +index 57c88f9..e953a33 100644 +--- a/mkfs.c ++++ b/mkfs.c +@@ -36,7 +36,7 @@ + #include + #include + #include +-#include ++#include + #include "kerncompat.h" + #include "ctree.h" + #include "disk-io.h" +@@ -517,7 +517,6 @@ static int add_inode_items(struct btrfs_trans_handle *trans, + fail: + return ret; + } +- + static int add_xattr_item(struct btrfs_trans_handle *trans, + struct btrfs_root *root, u64 objectid, + const char *file_name) +@@ -532,8 +531,10 @@ static int add_xattr_item(struct btrfs_trans_handle *trans, + + ret = llistxattr(file_name, xattr_list, XATTR_LIST_MAX); + if (ret < 0) { +- fprintf(stderr, "get a list of xattr failed for %s\n", +- file_name); ++ if(errno == ENOTSUP) ++ return 0; ++ fprintf(stderr, "get a list of xattr failed for %s errno %d\n", ++ file_name, errno); + return ret; + } + if (ret == 0) +@@ -546,8 +547,11 @@ static int add_xattr_item(struct btrfs_trans_handle *trans, + + ret = getxattr(file_name, cur_name, cur_value, XATTR_SIZE_MAX); + if (ret < 0) { +- fprintf(stderr, "get a xattr value failed for %s\n", +- cur_name); ++ if(errno == ENOTSUP) ++ return 0; ++ fprintf(stderr, "get a xattr value failed for %s attr %s errno %d\n", ++ file_name, cur_name, errno); ++ return ret; + } + + ret = btrfs_insert_xattr_item(trans, root, cur_name, +@@ -563,7 +567,6 @@ static int add_xattr_item(struct btrfs_trans_handle *trans, + + return ret; + } +- + static int custom_alloc_extent(struct btrfs_root *root, u64 num_bytes, + u64 hint_byte, struct btrfs_key *ins) + { +@@ -923,27 +926,27 @@ static int traverse_directory(struct btrfs_trans_handle *trans, + fprintf(stderr, "add_inode_items failed\n"); + goto fail; + } +- + ret = add_xattr_item(trans, root, + cur_inum, cur_file->d_name); + if (ret) { + fprintf(stderr, "add_xattr_item failed\n"); +- goto fail; ++ if(ret != -ENOTSUP) ++ goto fail; + } +- + if (S_ISDIR(st.st_mode)) { + dir_entry = malloc(sizeof(struct directory_name_entry)); + dir_entry->dir_name = cur_file->d_name; + dir_entry->path = make_path(parent_dir_entry->path, + cur_file->d_name); + dir_entry->inum = cur_inum; +- list_add_tail(&dir_entry->list, &dir_head->list); ++ list_add_tail(&dir_entry->list, &dir_head->list); + } else if (S_ISREG(st.st_mode)) { + ret = add_file_items(trans, root, &cur_inode, + cur_inum, parent_inum, &st, + cur_file->d_name, out_fd); + if (ret) { +- fprintf(stderr, "add_file_items failed\n"); ++ fprintf(stderr, "add_file_items failed %s\n", ++ cur_file->d_name); + goto fail; + } + } else if (S_ISLNK(st.st_mode)) { +@@ -987,7 +990,7 @@ static int create_chunks(struct btrfs_trans_handle *trans, + u64 chunk_size; + u64 meta_type = BTRFS_BLOCK_GROUP_METADATA; + u64 data_type = BTRFS_BLOCK_GROUP_DATA; +- u64 minimum_data_chunk_size = 64 * 1024 * 1024; ++ u64 minimum_data_chunk_size = 8 * 1024 * 1024; + u64 i; + int ret; + +@@ -1062,7 +1065,6 @@ static u64 size_sourcedir(char *dir_name, u64 sectorsize, + char path[512]; + char *file_name = "temp_file"; + FILE *file; +- u64 minimum_data_size = 256 * 1024 * 1024; /* 256MB */ + u64 default_chunk_size = 8 * 1024 * 1024; /* 8MB */ + u64 allocated_meta_size = 8 * 1024 * 1024; /* 8MB */ + u64 allocated_total_size = 20 * 1024 * 1024; /* 20MB */ +@@ -1101,9 +1103,6 @@ static u64 size_sourcedir(char *dir_name, u64 sectorsize, + + *num_of_meta_chunks_ret = num_of_meta_chunks; + +- if (total_size < minimum_data_size) +- total_size = minimum_data_size; +- + return total_size; + } + +@@ -1158,9 +1157,9 @@ int main(int ac, char **av) + + char *source_dir = NULL; + int source_dir_set = 0; +- char *output = "output.img"; + u64 num_of_meta_chunks = 0; + u64 size_of_data = 0; ++ u64 source_dir_size = 0; + + while(1) { + int c; +@@ -1224,8 +1223,6 @@ int main(int ac, char **av) + fprintf(stderr, "Illegal nodesize %u\n", nodesize); + exit(1); + } +- if (source_dir_set) +- ac++; + ac = ac - optind; + if (ac == 0) + print_usage(); +@@ -1257,17 +1254,19 @@ int main(int ac, char **av) + block_count = dev_block_count; + } else { + ac = 0; +- fd = open_target(output); ++ file = av[optind++]; ++ fd = open_target(file); + if (fd < 0) { + fprintf(stderr, "unable to open the %s\n", file); + exit(1); + } + +- file = output; + first_fd = fd; + first_file = file; +- block_count = size_sourcedir(source_dir, sectorsize, ++ source_dir_size = size_sourcedir(source_dir, sectorsize, + &num_of_meta_chunks, &size_of_data); ++ if(block_count < source_dir_size) ++ block_count = source_dir_size; + ret = zero_output_file(fd, block_count, sectorsize); + if (ret) { + fprintf(stderr, "unable to zero the output file\n"); -- cgit v1.2.3-54-g00ecf