From: Qu Wenruo <quwenruo@cn.fujitsu.com>
To: linux-btrfs@vger.kernel.org
Subject: [PATCH v2 05/25] btrfs-progs: convert: Introduce new function to remove reserved ranges
Date: Tue, 1 Dec 2015 15:11:25 +0800 [thread overview]
Message-ID: <1448953905-28673-6-git-send-email-quwenruo@cn.fujitsu.com> (raw)
In-Reply-To: <1448953905-28673-1-git-send-email-quwenruo@cn.fujitsu.com>
Introduce functions to remove reserved ranges for later btrfs-convert
rework.
The reserved ranges includes:
1. [0,1M)
2. [btrfs_sb_offset(1), +BTRFS_STRIP_LEN)
3. [btrfs_sb_offset(2), +BTRFS_STRIP_LEN)
Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com>
---
btrfs-convert.c | 117 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 117 insertions(+)
diff --git a/btrfs-convert.c b/btrfs-convert.c
index 65841bd..2fef1ed 100644
--- a/btrfs-convert.c
+++ b/btrfs-convert.c
@@ -2521,6 +2521,123 @@ static int convert_open_fs(const char *devname,
}
/*
+ * Remove one reserve range from given cache tree
+ * if min_stripe_size is non-zero, it will ensure for split case,
+ * all its split cache extent is no smaller than @min_strip_size / 2.
+ */
+static int wipe_one_reserved_range(struct cache_tree *tree,
+ u64 start, u64 len, u64 min_stripe_size,
+ int ensure_size)
+{
+ struct cache_extent *cache;
+ int ret;
+
+ BUG_ON(ensure_size && min_stripe_size == 0);
+ /*
+ * The logical here is simplified to handle special cases only
+ * So we don't need to consider merge case for ensure_size
+ */
+ BUG_ON(min_stripe_size && (min_stripe_size < len * 2 ||
+ min_stripe_size / 2 < BTRFS_STRIPE_LEN));
+
+ /* Also, wipe range should already be aligned */
+ BUG_ON(start != round_down(start, BTRFS_STRIPE_LEN) ||
+ start + len != round_up(start + len, BTRFS_STRIPE_LEN));
+
+ min_stripe_size /= 2;
+
+ cache = lookup_cache_extent(tree, start, len);
+ if (!cache)
+ return 0;
+
+ if (start <= cache->start) {
+ /*
+ * |--------cache---------|
+ * |-wipe-|
+ */
+ BUG_ON(start + len <= cache->start);
+
+ /*
+ * The wipe size is smaller than min_stripe_size / 2,
+ * so the result length should still meet min_stripe_size
+ * And no need to do alignment
+ */
+ cache->size -= (start + len - cache->start);
+ if (cache->size == 0) {
+ remove_cache_extent(tree, cache);
+ free(cache);
+ return 0;
+ }
+
+ BUG_ON(ensure_size && cache->size < min_stripe_size);
+
+ cache->start = start + len;
+ return 0;
+ } else if (start > cache->start && start + len < cache->start +
+ cache->size) {
+ /*
+ * |-------cache-----|
+ * |-wipe-|
+ */
+ u64 old_len = cache->size;
+ u64 insert_start = start + len;
+ u64 insert_len;
+
+ cache->size = start - cache->start;
+ if (ensure_size)
+ cache->size = max(cache->size, min_stripe_size);
+ cache->start = start - cache->size;
+
+ /* And insert the new one */
+ insert_len = old_len - start - len;
+ if (ensure_size)
+ insert_len = max(insert_len, min_stripe_size);
+
+ ret = add_merge_cache_extent(tree, insert_start, insert_len);
+ return ret;
+ }
+ /*
+ * |----cache-----|
+ * |--wipe-|
+ * Wipe len should be small enough and no need to expand the
+ * remaining extent
+ */
+ cache->size = start - cache->start;
+ BUG_ON(ensure_size && cache->size < min_stripe_size);
+ return 0;
+}
+
+/*
+ * Remove reserved ranges from given cache_tree
+ *
+ * It will remove the following ranges
+ * 1) 0~1M
+ * 2) 2nd superblock, +64K(make sure chunks are 64K aligned)
+ * 3) 3rd superblock, +64K
+ *
+ * @min_stripe must be given for safety check
+ * and if @ensure_size is given, it will ensure affected cache_extent will be
+ * larger than min_stripe_size
+ */
+static int wipe_reserved_ranges(struct cache_tree *tree, u64 min_stripe_size,
+ int ensure_size)
+{
+ int ret;
+
+ ret = wipe_one_reserved_range(tree, 0, 1024 * 1024, min_stripe_size,
+ ensure_size);
+ if (ret < 0)
+ return ret;
+ ret = wipe_one_reserved_range(tree, btrfs_sb_offset(1),
+ BTRFS_STRIPE_LEN, min_stripe_size, ensure_size);
+ if (ret < 0)
+ return ret;
+ ret = wipe_one_reserved_range(tree, btrfs_sb_offset(2),
+ BTRFS_STRIPE_LEN, min_stripe_size, ensure_size);
+ return ret;
+}
+
+/*
* Read used space
*/
static int convert_read_used_space(struct btrfs_convert_context *cctx)
--
2.6.2
next prev parent reply other threads:[~2015-12-01 7:14 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-12-01 7:11 [PATCH v2 00/25] Btrfs-convert rework to support separate chunk type Qu Wenruo
2015-12-01 7:11 ` [PATCH v2 01/25] btrfs-progs: extent-cache: Add comments for search/lookup functions Qu Wenruo
2015-12-01 7:11 ` [PATCH v2 02/25] btrfs-progs: extent-tree: Add add_merge_cache_extent function Qu Wenruo
2015-12-01 7:11 ` [PATCH v2 03/25] btrfs-progs: Introduce new members for btrfs_convert_context Qu Wenruo
2015-12-01 7:11 ` [PATCH v2 04/25] btrfs-progs: convert: Introduce functions to read used space Qu Wenruo
2015-12-01 7:11 ` Qu Wenruo [this message]
2015-12-01 7:11 ` [PATCH v2 06/25] btrfs-progs: convert: Introduce function to calculate the available space Qu Wenruo
2015-12-01 7:11 ` [PATCH v2 07/25] btrfs-progs: utils: Introduce new function for convert Qu Wenruo
2015-12-01 7:11 ` [PATCH v2 08/25] btrfs-progs: Introduce function to setup temporary superblock Qu Wenruo
2015-12-01 7:11 ` [PATCH v2 09/25] btrfs-progs: Introduce function to setup temporary tree root Qu Wenruo
2015-12-01 7:11 ` [PATCH v2 10/25] btrfs-progs: Introduce function to setup temporary chunk root Qu Wenruo
2015-12-01 7:11 ` [PATCH v2 11/25] btrfs-progs: Introduce function to initialize device tree Qu Wenruo
2015-12-01 7:11 ` [PATCH v2 12/25] btrfs-progs: Introduce function to initialize fs tree Qu Wenruo
2015-12-01 7:11 ` [PATCH v2 13/25] btrfs-progs: Introduce function to initialize csum tree Qu Wenruo
2015-12-01 7:11 ` [PATCH v2 14/25] btrfs-progs: Introduce function to setup temporary extent tree Qu Wenruo
2015-12-01 7:11 ` [PATCH v2 15/25] btrfs-progs: Introduce function to create convert data chunks Qu Wenruo
2015-12-01 7:11 ` [PATCH v2 16/25] btrfs-progs: extent-tree: Introduce function to find the first overlap extent Qu Wenruo
2015-12-01 7:11 ` [PATCH v2 17/25] btrfs-progs: extent-tree: Enhance btrfs_record_file_extent Qu Wenruo
2016-01-12 10:17 ` David Sterba
2016-01-13 0:33 ` Qu Wenruo
2016-01-13 8:55 ` David Sterba
2015-12-01 7:11 ` [PATCH v2 18/25] btrfs-progs: convert: Introduce new function to create converted image Qu Wenruo
2015-12-01 7:11 ` [PATCH v2 19/25] btrfs-progs: convert: Introduce function to migrate reserved ranges Qu Wenruo
2015-12-01 7:11 ` [PATCH v2 20/25] btrfs-progs: convert: Enhance record_file_blocks to handle " Qu Wenruo
2015-12-01 7:11 ` [PATCH v2 21/25] btrfs-progs: convert: Introduce init_btrfs_v2 function Qu Wenruo
2015-12-01 7:11 ` [PATCH v2 22/25] btrfs-progs: Introduce do_convert_v2 function Qu Wenruo
2015-12-01 7:11 ` [PATCH v2 23/25] btrfs-progs: Convert: Add support for rollback new convert behavior Qu Wenruo
2015-12-01 7:11 ` [PATCH v2 24/25] btrfs-progs: convert: Strictly avoid meta or system chunk allocation Qu Wenruo
2015-12-01 7:11 ` [PATCH v2 25/25] btrfs-progs: Cleanup old btrfs-convert Qu Wenruo
2015-12-07 15:20 ` [PATCH v2 00/25] Btrfs-convert rework to support separate chunk type David Sterba
2015-12-08 1:50 ` 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=1448953905-28673-6-git-send-email-quwenruo@cn.fujitsu.com \
--to=quwenruo@cn.fujitsu.com \
--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).