From c88c2f52fed9554306036385c5c15c012ba49629 Mon Sep 17 00:00:00 2001 From: Danny Kukawka Date: Mon, 21 Jan 2013 16:57:25 +0100 Subject: btrfs-progs: Handle errors returned from open_ctree Signed-off-by: Danny Kukawka Signed-off-by: David Sterba --- mkfs.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'mkfs.c') diff --git a/mkfs.c b/mkfs.c index fbf83196..56c1d9bb 100644 --- a/mkfs.c +++ b/mkfs.c @@ -1362,7 +1362,8 @@ int main(int ac, char **av) root = open_ctree(file, 0, O_RDWR); if (!root) { - fprintf(stderr, "ctree init failed\n"); + fprintf(stderr, "Open ctree failed\n"); + close(fd); exit(1); } root->fs_info->alloc_start = alloc_start; -- cgit v1.2.3 From 5cdc0913dd2e7db37b948464e8cb22fd2982a65e Mon Sep 17 00:00:00 2001 From: Eric Sandeen Date: Sat, 19 Jan 2013 13:06:17 -0500 Subject: btrfs-progs: Use sysconf instead of getpagesize Rawhide is getting cranky with posix compliance, and a few things have stopped building. getpagesize() is now only available -with- __USE_XOPEN_EXTENDED or __USE_BSD, and NOT __USE_XOPEN2K. _GNU_SOURCE must define __USE_XOPEN2K because getpagesize() has gone away for mkfs. I gave up and used sysconf. Also, something used to pull in stat that no longer does, so things like S_ISREG weren't getting defined. The following fixes things for me. Signed-off-by: Eric Sandeen --- mkfs.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'mkfs.c') diff --git a/mkfs.c b/mkfs.c index 56c1d9bb..384f2c61 100644 --- a/mkfs.c +++ b/mkfs.c @@ -1206,7 +1206,7 @@ int main(int ac, char **av) u64 alloc_start = 0; u64 metadata_profile = 0; u64 data_profile = 0; - u32 leafsize = getpagesize(); + u32 leafsize = sysconf(_SC_PAGESIZE); u32 sectorsize = 4096; u32 nodesize = leafsize; u32 stripesize = 4096; @@ -1282,7 +1282,7 @@ int main(int ac, char **av) print_usage(); } } - sectorsize = max(sectorsize, (u32)getpagesize()); + sectorsize = max(sectorsize, (u32)sysconf(_SC_PAGESIZE)); if (check_leaf_or_node_size(leafsize, sectorsize)) exit(1); if (check_leaf_or_node_size(nodesize, sectorsize)) -- cgit v1.2.3 From 124053b1d9f7425b8a2dac02907222d99927e779 Mon Sep 17 00:00:00 2001 From: Josef Bacik Date: Sat, 19 Jan 2013 13:06:21 -0500 Subject: Btrfs-progs: detect if the disk we are formatting is a ssd Patch rebased because of changes in mkfs.c but otherwise the same as created by Josef Bacik SSD's do not gain anything by having metadata DUP turned on. The underlying file system that is a part of all SSD's could easily map duplicate metadat blocks into the same erase block which effectively eliminates the benefit of duplicating the metadata on disk. So detect if we are formatting a single SSD drive and if we are do not use DUP. Thanks, Signed-off-by: Josef Bacik Signed-off-by: Gene Czarcinski --- mkfs.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 60 insertions(+), 3 deletions(-) (limited to 'mkfs.c') diff --git a/mkfs.c b/mkfs.c index 384f2c61..36c39145 100644 --- a/mkfs.c +++ b/mkfs.c @@ -39,6 +39,7 @@ #include #include #include +#include #include "ctree.h" #include "disk-io.h" #include "volumes.h" @@ -204,7 +205,7 @@ static int create_one_raid_group(struct btrfs_trans_handle *trans, static int create_raid_groups(struct btrfs_trans_handle *trans, struct btrfs_root *root, u64 data_profile, int data_profile_opt, u64 metadata_profile, - int metadata_profile_opt, int mixed) + int metadata_profile_opt, int mixed, int ssd) { u64 num_devices = btrfs_super_num_devices(&root->fs_info->super_copy); u64 allowed; @@ -215,8 +216,12 @@ static int create_raid_groups(struct btrfs_trans_handle *trans, * For mixed groups defaults are single/single. */ if (!metadata_profile_opt && !mixed) { + if (num_devices == 1 && ssd) + printf("Detected a SSD, turning off metadata " + "duplication. Mkfs with -m dup if you want to " + "force metadata duplication.\n"); metadata_profile = (num_devices > 1) ? - BTRFS_BLOCK_GROUP_RAID1 : BTRFS_BLOCK_GROUP_DUP; + BTRFS_BLOCK_GROUP_RAID1 : (ssd) ? 0: BTRFS_BLOCK_GROUP_DUP; } if (!data_profile_opt && !mixed) { data_profile = (num_devices > 1) ? @@ -1193,6 +1198,54 @@ static int check_leaf_or_node_size(u32 size, u32 sectorsize) return 0; } +static int is_ssd(const char *file) +{ + char *devname; + blkid_probe probe; + char *dev; + char path[PATH_MAX]; + dev_t disk; + int fd; + char rotational; + + probe = blkid_new_probe_from_filename(file); + if (!probe) + return 0; + + /* + * We want to use blkid_devno_to_wholedisk() but it's broken for some + * reason on F17 at least so we'll do this trickery + */ + disk = blkid_probe_get_wholedisk_devno(probe); + if (!disk) + return 0; + + devname = blkid_devno_to_devname(disk); + if (!devname) + return 0; + + dev = strrchr(devname, '/'); + dev++; + + snprintf(path, PATH_MAX, "/sys/block/%s/queue/rotational", dev); + + free(devname); + blkid_free_probe(probe); + + fd = open(path, O_RDONLY); + if (fd < 0) { + return 0; + } + + if (read(fd, &rotational, sizeof(char)) < sizeof(char)) { + close(fd); + return 0; + } + close(fd); + + return !atoi((const char *)&rotational); +} + int main(int ac, char **av) { char *file; @@ -1219,6 +1272,7 @@ int main(int ac, char **av) int data_profile_opt = 0; int metadata_profile_opt = 0; int nodiscard = 0; + int ssd = 0; char *source_dir = NULL; int source_dir_set = 0; @@ -1338,6 +1392,9 @@ int main(int ac, char **av) exit(1); } } + + ssd = is_ssd(file); + if (mixed) { if (metadata_profile != data_profile) { fprintf(stderr, "With mixed block groups data and metadata " @@ -1424,7 +1481,7 @@ raid_groups: if (!source_dir_set) { ret = create_raid_groups(trans, root, data_profile, data_profile_opt, metadata_profile, - metadata_profile_opt, mixed); + metadata_profile_opt, mixed, ssd); BUG_ON(ret); } -- cgit v1.2.3 From 79e0e445fc2365e47fc7f060d5a4445d37e184b8 Mon Sep 17 00:00:00 2001 From: Josef Bacik Date: Thu, 22 Jan 2009 14:25:44 -0500 Subject: btrfs-progs: kill check for /'s in labels This patch kills a check in mkfs's label stuff which doesn't allow labels that have /'s in them. This causes problems for Anaconda which try to label volumes with their mountpoints. Thanks, Signed-off-by: Josef Bacik --- mkfs.c | 7 ------- 1 file changed, 7 deletions(-) (limited to 'mkfs.c') diff --git a/mkfs.c b/mkfs.c index 36c39145..a129ec48 100644 --- a/mkfs.c +++ b/mkfs.c @@ -357,7 +357,6 @@ static u64 parse_profile(char *s) static char *parse_label(char *input) { - int i; int len = strlen(input); if (len >= BTRFS_LABEL_SIZE) { @@ -365,12 +364,6 @@ static char *parse_label(char *input) BTRFS_LABEL_SIZE - 1); exit(1); } - for (i = 0; i < len; i++) { - if (input[i] == '/' || input[i] == '\\') { - fprintf(stderr, "invalid label %s\n", input); - exit(1); - } - } return strdup(input); } -- cgit v1.2.3 From 680a80ece109a2994ac9c59511fb8974ace12fd9 Mon Sep 17 00:00:00 2001 From: Eric Sandeen Date: Tue, 29 Jan 2013 14:32:28 -0600 Subject: btrfs-progs: fix mkfs.btrfs -r option Commit 605e806166847872bb91831b397d58f95027975a broke the mkfs.btrfs -r option, because it calls make_btrfs without ever setting dev_block_count, in the -r case, so we tell it to make a filesystem of size 0. Then we wander into ENOSPC land and segfault. As a quick one-line-fix, just set the dev_block_count to the size of the destination image file. Signed-off-by: Eric Sandeen --- mkfs.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'mkfs.c') diff --git a/mkfs.c b/mkfs.c index a129ec48..e46f1559 100644 --- a/mkfs.c +++ b/mkfs.c @@ -1384,6 +1384,8 @@ int main(int ac, char **av) fprintf(stderr, "unable to zero the output file\n"); exit(1); } + /* our "device" is the new image file */ + dev_block_count = block_count; } ssd = is_ssd(file); -- cgit v1.2.3 From 1a72afaa85747cdf327b9b6a6ad1364d39007368 Mon Sep 17 00:00:00 2001 From: Mark Fasheh Date: Thu, 7 Jun 2012 16:00:56 -0700 Subject: btrfs-progs: mkfs support for extended inode refs This patch turns on the BTRFS_FEATURE_INCOMPAT_EXTENDED_IREF superblock flag when creating a new file system in mkfs, enabling extended inode refs. Signed-off-by: Mark Fasheh --- mkfs.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'mkfs.c') diff --git a/mkfs.c b/mkfs.c index e46f1559..0e042c7a 100644 --- a/mkfs.c +++ b/mkfs.c @@ -1273,6 +1273,8 @@ int main(int ac, char **av) u64 size_of_data = 0; u64 source_dir_size = 0; char *pretty_buf; + struct btrfs_super_block *super; + u64 flags; while(1) { int c; @@ -1483,13 +1485,14 @@ raid_groups: ret = create_data_reloc_tree(trans, root); BUG_ON(ret); - if (mixed) { - struct btrfs_super_block *super = &root->fs_info->super_copy; - u64 flags = btrfs_super_incompat_flags(super); + super = &root->fs_info->super_copy; + flags = btrfs_super_incompat_flags(super); + flags |= BTRFS_FEATURE_INCOMPAT_EXTENDED_IREF; + if (mixed) flags |= BTRFS_FEATURE_INCOMPAT_MIXED_GROUPS; - btrfs_set_super_incompat_flags(super, flags); - } + + btrfs_set_super_incompat_flags(super, flags); printf("fs created label %s on %s\n\tnodesize %u leafsize %u " "sectorsize %u size %s\n", -- cgit v1.2.3