diff mbox series

btrfs-progs: check for minimal needed number of zones

Message ID 20210512075305.19048-1-johannes.thumshirn@wdc.com (mailing list archive)
State New, archived
Headers show
Series btrfs-progs: check for minimal needed number of zones | expand

Commit Message

Johannes Thumshirn May 12, 2021, 7:53 a.m. UTC
In order to create a usable zoned filesystem a minimum of 5 zones is
needed:

- 2 zones for the 1st superblock
- 1 zone for the system block group
- 1 zone for a metadata block group
- 1 zone for a data block group

Some tests in xfstests create a sized filesystem and depending on the zone
size of the underlying device, it may happen, that this filesystem is too
small to be used. It's better to not create a filesystem at all than to
create an unusable filesystem.

Signed-off-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
---
 mkfs/main.c | 8 ++++++++
 1 file changed, 8 insertions(+)

Comments

David Sterba May 12, 2021, 10:36 a.m. UTC | #1
On Wed, May 12, 2021 at 04:53:05PM +0900, Johannes Thumshirn wrote:
> In order to create a usable zoned filesystem a minimum of 5 zones is
> needed:
> 
> - 2 zones for the 1st superblock
> - 1 zone for the system block group
> - 1 zone for a metadata block group
> - 1 zone for a data block group
> 
> Some tests in xfstests create a sized filesystem and depending on the zone
> size of the underlying device, it may happen, that this filesystem is too
> small to be used. It's better to not create a filesystem at all than to
> create an unusable filesystem.

Agreed, though there's no spare zone for relocation once any of them
becomes unusable (which is a known problem and can happen for any zone
count). Once this gets solved the limit will be increased accordingly.
Johannes Thumshirn May 12, 2021, 12:27 p.m. UTC | #2
On 12/05/2021 12:39, David Sterba wrote:
> On Wed, May 12, 2021 at 04:53:05PM +0900, Johannes Thumshirn wrote:
>> In order to create a usable zoned filesystem a minimum of 5 zones is
>> needed:
>>
>> - 2 zones for the 1st superblock
>> - 1 zone for the system block group
>> - 1 zone for a metadata block group
>> - 1 zone for a data block group
>>
>> Some tests in xfstests create a sized filesystem and depending on the zone
>> size of the underlying device, it may happen, that this filesystem is too
>> small to be used. It's better to not create a filesystem at all than to
>> create an unusable filesystem.
> 
> Agreed, though there's no spare zone for relocation once any of them
> becomes unusable (which is a known problem and can happen for any zone
> count). Once this gets solved the limit will be increased accordingly.
> 

Indeed, I'm planning to have something like a 'global' reserve zone for 
relocation. Hope to get this done before the cut for v5.14.
Naohiro Aota May 12, 2021, 2:19 p.m. UTC | #3
On Wed, May 12, 2021 at 04:53:05PM +0900, Johannes Thumshirn wrote:
> In order to create a usable zoned filesystem a minimum of 5 zones is
> needed:
> 
> - 2 zones for the 1st superblock
> - 1 zone for the system block group
> - 1 zone for a metadata block group
> - 1 zone for a data block group
> 
> Some tests in xfstests create a sized filesystem and depending on the zone
> size of the underlying device, it may happen, that this filesystem is too
> small to be used. It's better to not create a filesystem at all than to
> create an unusable filesystem.

We also want to think about reserved zones for regular
superblocks. For example, with zone_size == 16M, we reserve zone #4
for regular superblock at 64MB, and this setup require one more zone
to allocate a data block group.

> Signed-off-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
> ---
>  mkfs/main.c | 8 ++++++++
>  1 file changed, 8 insertions(+)
> 
> diff --git a/mkfs/main.c b/mkfs/main.c
> index 104eead2cee8..a56d970f6362 100644
> --- a/mkfs/main.c
> +++ b/mkfs/main.c
> @@ -1283,6 +1283,14 @@ int BOX_MAIN(mkfs)(int argc, char **argv)
>  			min_dev_size);
>  		goto error;
>  	}
> +	if (zoned && block_count && block_count < 5 * zone_size(file)) {
> +		error("size %llu is too small to make a usable filesystem",
> +			block_count);
> +		error("minimum size for a zoned btrfs filesystem is %llu",
> +			min_dev_size);

This should be "5 * zone_size(file)".

How about extending btrfs_min_dev_size() for zoned? Then, we can avoid
repeating the size check code.

> +		goto error;
> +	}
> +
>  	for (i = saved_optind; i < saved_optind + dev_cnt; i++) {
>  		char *path;
>  
> -- 
> 2.31.1
>
Johannes Thumshirn May 17, 2021, 7:40 a.m. UTC | #4
On 12/05/2021 16:19, Naohiro Aota wrote:
> On Wed, May 12, 2021 at 04:53:05PM +0900, Johannes Thumshirn wrote:
>> In order to create a usable zoned filesystem a minimum of 5 zones is
>> needed:
>>
>> - 2 zones for the 1st superblock
>> - 1 zone for the system block group
>> - 1 zone for a metadata block group
>> - 1 zone for a data block group
>>
>> Some tests in xfstests create a sized filesystem and depending on the zone
>> size of the underlying device, it may happen, that this filesystem is too
>> small to be used. It's better to not create a filesystem at all than to
>> create an unusable filesystem.
> 
> We also want to think about reserved zones for regular
> superblocks. For example, with zone_size == 16M, we reserve zone #4
> for regular superblock at 64MB, and this setup require one more zone
> to allocate a data block group.
> 
>> Signed-off-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
>> ---
>>  mkfs/main.c | 8 ++++++++
>>  1 file changed, 8 insertions(+)
>>
>> diff --git a/mkfs/main.c b/mkfs/main.c
>> index 104eead2cee8..a56d970f6362 100644
>> --- a/mkfs/main.c
>> +++ b/mkfs/main.c
>> @@ -1283,6 +1283,14 @@ int BOX_MAIN(mkfs)(int argc, char **argv)
>>  			min_dev_size);
>>  		goto error;
>>  	}
>> +	if (zoned && block_count && block_count < 5 * zone_size(file)) {
>> +		error("size %llu is too small to make a usable filesystem",
>> +			block_count);
>> +		error("minimum size for a zoned btrfs filesystem is %llu",
>> +			min_dev_size);
> 
> This should be "5 * zone_size(file)".
> 
> How about extending btrfs_min_dev_size() for zoned? Then, we can avoid
> repeating the size check code.

I'll look into it.
diff mbox series

Patch

diff --git a/mkfs/main.c b/mkfs/main.c
index 104eead2cee8..a56d970f6362 100644
--- a/mkfs/main.c
+++ b/mkfs/main.c
@@ -1283,6 +1283,14 @@  int BOX_MAIN(mkfs)(int argc, char **argv)
 			min_dev_size);
 		goto error;
 	}
+	if (zoned && block_count && block_count < 5 * zone_size(file)) {
+		error("size %llu is too small to make a usable filesystem",
+			block_count);
+		error("minimum size for a zoned btrfs filesystem is %llu",
+			min_dev_size);
+		goto error;
+	}
+
 	for (i = saved_optind; i < saved_optind + dev_cnt; i++) {
 		char *path;