summaryrefslogtreecommitdiff
path: root/mkfs.c
diff options
context:
space:
mode:
Diffstat (limited to 'mkfs.c')
-rw-r--r--mkfs.c22
1 files changed, 15 insertions, 7 deletions
diff --git a/mkfs.c b/mkfs.c
index 6d3ef29f..c44c7e6f 100644
--- a/mkfs.c
+++ b/mkfs.c
@@ -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;