diff options
Diffstat (limited to 'mkfs.c')
-rw-r--r-- | mkfs.c | 22 |
1 files changed, 15 insertions, 7 deletions
@@ -59,8 +59,11 @@ static u64 parse_size(char *s) int len = strlen(s); char c; u64 mult = 1; + u64 ret; - if (!isdigit(s[len - 1])) { + s = strdup(s); + + if (len && !isdigit(s[len - 1])) { c = tolower(s[len - 1]); switch (c) { case 'g': @@ -77,7 +80,9 @@ static u64 parse_size(char *s) } s[len - 1] = '\0'; } - return atol(s) * mult; + ret = atol(s) * mult; + free(s); + return ret; } static int make_root_dir(struct btrfs_root *root, int mixed) @@ -914,8 +919,7 @@ static int traverse_directory(struct btrfs_trans_handle *trans, /* Add list for source directory */ dir_entry = malloc(sizeof(struct directory_name_entry)); dir_entry->dir_name = dir_name; - dir_entry->path = malloc(strlen(dir_name) + 1); - strcpy(dir_entry->path, dir_name); + dir_entry->path = strdup(dir_name); parent_inum = highest_inum + BTRFS_FIRST_FREE_OBJECTID; dir_entry->inum = parent_inum; @@ -1243,6 +1247,8 @@ int main(int ac, char **av) data_profile_opt = 1; break; case 'l': + case 'n': + nodesize = parse_size(optarg); leafsize = parse_size(optarg); break; case 'L': @@ -1255,9 +1261,6 @@ int main(int ac, char **av) case 'M': mixed = 1; break; - case 'n': - nodesize = parse_size(optarg); - break; case 's': sectorsize = parse_size(optarg); break; @@ -1318,6 +1321,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++]; @@ -1408,6 +1415,7 @@ int main(int ac, char **av) close(fd); continue; } + dev_block_count = block_count; ret = btrfs_prepare_device(fd, file, zero_end, &dev_block_count, &mixed); mixed = old_mixed; |