5be20c4ea7
SR: a few fixes, aimed for 13.1 RC2 - fsck updates - more mkfs sanity checks - qgroup rescan wait OBS-URL: https://build.opensuse.org/request/show/205320 OBS-URL: https://build.opensuse.org/package/show/filesystems/btrfsprogs?expand=0&rev=144
92 lines
3.0 KiB
Diff
92 lines
3.0 KiB
Diff
From b11f9613e3b0be7e4b560419a4fec7d7d7264664 Mon Sep 17 00:00:00 2001
|
|
From: Hidetoshi Seto <seto.hidetoshi@jp.fujitsu.com>
|
|
Date: Thu, 5 Sep 2013 15:55:08 +0900
|
|
Subject: [PATCH 60/62] btrfs-progs: error if device have no space to make
|
|
primary chunks
|
|
|
|
The previous patch works fine if the size of specified volume to mkfs
|
|
is less than 4MB. However usually btrfs requires more than 4MB to work,
|
|
and the minimum preferred size is depending on the raid setting etc.
|
|
|
|
This patch let mkfs print error message if it cannot allocate one of
|
|
chunks should be there at first.
|
|
|
|
[before]
|
|
# truncate --size=4500K testfile
|
|
# ./mkfs.btrfs -f testfile
|
|
:
|
|
SMALL VOLUME: forcing mixed metadata/data groups
|
|
mkfs.btrfs: mkfs.c:84: make_root_dir: Assertion `!(ret)' failed.
|
|
Aborted (core dumped)
|
|
|
|
[After]
|
|
# truncate --size=4500K testfile
|
|
# ./mkfs.btrfs -f testfile
|
|
:
|
|
SMALL VOLUME: forcing mixed metadata/data groups
|
|
no space to alloc data/metadata chunk
|
|
failed to setup the root directory
|
|
|
|
TBD is calculate minimum size for setting and put it in the error
|
|
message to let user know how large amount of volume is required.
|
|
|
|
Signed-off-by: Hidetoshi Seto <seto.hidetoshi@jp.fujitsu.com>
|
|
Signed-off-by: David Sterba <dsterba@suse.cz>
|
|
Signed-off-by: Chris Mason <chris.mason@fusionio.com>
|
|
---
|
|
mkfs.c | 17 +++++++++++++++++
|
|
1 file changed, 17 insertions(+)
|
|
|
|
diff --git a/mkfs.c b/mkfs.c
|
|
index 9a017c1dc95b..f7105073a173 100644
|
|
--- a/mkfs.c
|
|
+++ b/mkfs.c
|
|
@@ -81,6 +81,11 @@ static int make_root_dir(struct btrfs_root *root, int mixed)
|
|
&chunk_start, &chunk_size,
|
|
BTRFS_BLOCK_GROUP_METADATA |
|
|
BTRFS_BLOCK_GROUP_DATA);
|
|
+ if (ret == -ENOSPC) {
|
|
+ fprintf(stderr,
|
|
+ "no space to alloc data/metadata chunk\n");
|
|
+ goto err;
|
|
+ }
|
|
BUG_ON(ret);
|
|
ret = btrfs_make_block_group(trans, root, 0,
|
|
BTRFS_BLOCK_GROUP_METADATA |
|
|
@@ -93,6 +98,10 @@ static int make_root_dir(struct btrfs_root *root, int mixed)
|
|
ret = btrfs_alloc_chunk(trans, root->fs_info->extent_root,
|
|
&chunk_start, &chunk_size,
|
|
BTRFS_BLOCK_GROUP_METADATA);
|
|
+ if (ret == -ENOSPC) {
|
|
+ fprintf(stderr, "no space to alloc metadata chunk\n");
|
|
+ goto err;
|
|
+ }
|
|
BUG_ON(ret);
|
|
ret = btrfs_make_block_group(trans, root, 0,
|
|
BTRFS_BLOCK_GROUP_METADATA,
|
|
@@ -110,6 +119,10 @@ static int make_root_dir(struct btrfs_root *root, int mixed)
|
|
ret = btrfs_alloc_chunk(trans, root->fs_info->extent_root,
|
|
&chunk_start, &chunk_size,
|
|
BTRFS_BLOCK_GROUP_DATA);
|
|
+ if (ret == -ENOSPC) {
|
|
+ fprintf(stderr, "no space to alloc data chunk\n");
|
|
+ goto err;
|
|
+ }
|
|
BUG_ON(ret);
|
|
ret = btrfs_make_block_group(trans, root, 0,
|
|
BTRFS_BLOCK_GROUP_DATA,
|
|
@@ -181,6 +194,10 @@ static int create_one_raid_group(struct btrfs_trans_handle *trans,
|
|
|
|
ret = btrfs_alloc_chunk(trans, root->fs_info->extent_root,
|
|
&chunk_start, &chunk_size, type);
|
|
+ if (ret == -ENOSPC) {
|
|
+ fprintf(stderr, "not enough free space\n");
|
|
+ exit(1);
|
|
+ }
|
|
BUG_ON(ret);
|
|
ret = btrfs_make_block_group(trans, root->fs_info->extent_root, 0,
|
|
type, BTRFS_FIRST_CHUNK_TREE_OBJECTID,
|
|
--
|
|
1.8.3.1
|
|
|