From: Qu Wenruo <quwenruo@cn.fujitsu.com>
To: <dsterba@suse.cz>, <linux-btrfs@vger.kernel.org>
Subject: Re: [PATCH] btrfs-progs: Add minimum device size check.
Date: Tue, 24 Jun 2014 08:58:09 +0800 [thread overview]
Message-ID: <53A8CD21.8030603@cn.fujitsu.com> (raw)
In-Reply-To: <20140623143601.GH1553@twin.jikos.cz>
-------- Original Message --------
Subject: Re: [PATCH] btrfs-progs: Add minimum device size check.
From: David Sterba <dsterba@suse.cz>
To: Qu Wenruo <quwenruo@cn.fujitsu.com>
Date: 2014年06月23日 22:36
> On Thu, Jun 19, 2014 at 11:25:38AM +0800, Qu Wenruo wrote:
>> Btrfs has global block reservation, so even mkfs.btrfs can execute
>> without problem, there is still a possibility that the filesystem can't
>> be mounted.
>> For example when mkfs.btrfs on a 8M file on x86_64 platform, kernel will
>> refuse to mount due to ENOSPC, since system block group takes 4M and
>> mixed block group takes 4M, and global block reservation will takes all
>> the 4M from mixed block group, which makes btrfs unable to create uuid
>> tree.
>>
>> This patch will add minimum device size check before actually mkfs.
>> The minimum size calculation uses a simplified one:
>> minimum_size_for_each_dev = 2 * (system block group + global block rsv)
> So the global block reserve is set to 1024 * sectorsize. I know the
> minimum size guesses are easy to get wrong with various option mixes,
> some sane minimum is good. A filesystem in the scale of megabytes is not
> recommended anyway.
>
>> --- a/mkfs.c
>> +++ b/mkfs.c
>> @@ -1337,6 +1337,15 @@ int main(int ac, char **av)
>> "metadata/data groups\n");
>> mixed = 1;
>> }
>> + if (block_count < BTRFS_MIN_SIZE_EACH) {
>> + fprintf(stderr,
>> + "Size '%llu' is too small to make a usable btrfs\n",
>> + block_count);
>> + fprintf(stderr,
>> + "Recommended size for each device is %llu\n",
>> + BTRFS_MIN_SIZE_EACH);
> I'd suggest to merge the messages into one and do not use "Recommended".
> As described in the changelog it's the 'minimum' accepted size.
>
>> @@ -1370,6 +1379,21 @@ int main(int ac, char **av)
>> }
>> while (dev_cnt-- > 0) {
>> file = av[optind++];
>> + ret = test_minimum_size(file);
>> + if (ret < 0) {
>> + fprintf(stderr, "Failed to check size for '%s': %s\n",
>> + file, strerror(-ret));
>> + exit(1);
>> + }
>> + if (ret > 0) {
>> + fprintf(stderr,
>> + "'%s' is too small to make a usable btrfs\n",
>> + file);
>> + fprintf(stderr,
>> + "Recommended size for each device is %llu\n",
>> + BTRFS_MIN_SIZE_EACH);
>> + exit(1);
> Same here.
>
>> + }
>> if (is_block_device(file))
>> if (test_dev_for_mkfs(file, force_overwrite, estr)) {
>> fprintf(stderr, "Error: %s", estr);
>> --- a/utils.h
>> +++ b/utils.h
>> @@ -101,5 +101,18 @@ int get_btrfs_mount(const char *dev, char *mp, size_t mp_size);
>> int find_mount_root(const char *path, char **mount_root);
>> int get_device_info(int fd, u64 devid,
>> struct btrfs_ioctl_dev_info_args *di_args);
>> +int test_minimum_size(const char *file);
>>
>> +/*
>> + * Btrfs minimum size calculation is complicated, it should include at least:
>> + * 1. system group size
>> + * 2. minimum global block reserve
>> + * 3. metadata used at mkfs
>> + * 4. space reservation to create uuid for first mount.
>> + * Also, raid factor should also be taken into consideration.
>> + * To avoid the overkill calculation, (system group + global block rsv) * 2
>> + * for *EACH* device should be good enough.
>> + */
>> +#define BTRFS_MIN_SIZE_EACH (2 * (BTRFS_MKFS_SYSTEM_GROUP_SIZE + \
>> + ((u64)sysconf(_SC_PAGESIZE) << 10)))
> The use of PAGESIZE here is well hidden in the macro, although it should
> be sectorsize of the currently created filesystem. Also,
> BTRFS_MIN_SIZE_EACH should be rather denote it's related to a device, so
> BTRFS_MIN_DEVICE_SIZE.
>
> Separating the minimum global block reserve size into a macro would be
> also cleaner.
>
> Thanks.
Thanks for the comment, I'll send the v3 patch fixing all the problem.
Thanks,
Qu
next prev parent reply other threads:[~2014-06-24 0:57 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-06-19 3:25 [PATCH] btrfs-progs: Add minimum device size check Qu Wenruo
2014-06-23 14:36 ` David Sterba
2014-06-24 0:58 ` Qu Wenruo [this message]
-- strict thread matches above, loose matches on Subject: below --
2014-06-19 3:18 Qu Wenruo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=53A8CD21.8030603@cn.fujitsu.com \
--to=quwenruo@cn.fujitsu.com \
--cc=dsterba@suse.cz \
--cc=linux-btrfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).