btrfs-progs: Improvement for making btrfs image from source directory.
authorZhong, Xin <xin.zhong@intel.com>
Tue, 21 Jun 2011 01:45:59 +0000 (09:45 +0800)
committerChris Mason <chris.mason@oracle.com>
Tue, 25 Oct 2011 13:19:00 +0000 (09:19 -0400)
* Initialize ret in btrfs_csum_file_block
* Do not abort when xattr is not supported in the source directory
* Remove size limitation of 256M
* Alloc data chunk in a smaller size (8M) to make btrfs image smaller
* Let user specify the btrfs image name
Depends on below patch from samsung guys:
http://marc.info/?l=linux-btrfs&m=127858068226025&w=2

Signed-off-by: Zhong, Xin <xin.zhong@intel.com>
file-item.c
mkfs.c

index 47f6ad2..c746b44 100644 (file)
@@ -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 2a11af5..e3ced19 100644 (file)
--- a/mkfs.c
+++ b/mkfs.c
@@ -553,6 +553,8 @@ static int add_xattr_item(struct btrfs_trans_handle *trans,
 
        ret = llistxattr(file_name, xattr_list, XATTR_LIST_MAX);
        if (ret < 0) {
+               if(errno == ENOTSUP)
+                       return 0;
                fprintf(stderr, "get a list of xattr failed for %s\n",
                        file_name);
                return ret;
@@ -567,8 +569,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\n",
+                               file_name, cur_name);
+                       return ret;
                }
 
                ret = btrfs_insert_xattr_item(trans, root, cur_name,
@@ -584,7 +589,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)
 {
@@ -957,7 +961,8 @@ static int traverse_directory(struct btrfs_trans_handle *trans,
                                             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)) {
@@ -1019,7 +1024,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;
 
@@ -1091,7 +1096,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 */
@@ -1130,9 +1134,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;
 }
 
@@ -1186,9 +1187,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;
        char *pretty_buf;
 
        while(1) {
@@ -1253,8 +1254,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();
@@ -1285,16 +1284,18 @@ int main(int ac, char **av)
                        block_count = dev_block_count;
        } else {
                ac = 0;
-               file = output;
-               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);
                }
 
                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");