All of lore.kernel.org
 help / color / mirror / Atom feed
From: Su Yue <suy.fnst@cn.fujitsu.com>
To: <linux-btrfs@vger.kernel.org>
Cc: <suy.fnst@cn.fujitsu.com>
Subject: [PATCH v3 09/17] btrfs-progs: lowmem check: start to remove parameters @trans in lowmem
Date: Thu, 11 Jan 2018 15:35:03 +0800	[thread overview]
Message-ID: <20180111073511.25288-10-suy.fnst@cn.fujitsu.com> (raw)
In-Reply-To: <20180111073511.25288-1-suy.fnst@cn.fujitsu.com>

Since extents can be avoid overwrite by excluding or new chunk
allocation. It's unnessesary to do all repairs in one transaction.

This patch removes parameter @trans of repair_extent_data_item().
repair_extent_data_item() calls try_avoid_extents_overwrite()
and starts a transaction by itself.

Note: This patch and next patches cause error in lowmem repair like:
"Error: Commit_root already set when starting transaction".
This error will disappear after removing @trans finished.

Signed-off-by: Su Yue <suy.fnst@cn.fujitsu.com>
---
 cmds-check.c | 24 +++++++++++++++++++-----
 1 file changed, 19 insertions(+), 5 deletions(-)

diff --git a/cmds-check.c b/cmds-check.c
index 341f73829ec7..cd8b6ed3898f 100644
--- a/cmds-check.c
+++ b/cmds-check.c
@@ -12164,18 +12164,19 @@ out:
 	return err;
 }
 
+static int try_avoid_extents_overwrite(struct btrfs_fs_info *fs_info);
 /*
  * If @err contains BACKREF_MISSING then add extent of the
  * file_extent_data_item.
  *
  * Returns error bits after reapir.
  */
-static int repair_extent_data_item(struct btrfs_trans_handle *trans,
-				   struct btrfs_root *root,
+static int repair_extent_data_item(struct btrfs_root *root,
 				   struct btrfs_path *pathp,
 				   struct node_refs *nrefs,
 				   int err)
 {
+	struct btrfs_trans_handle *trans = NULL;
 	struct btrfs_file_extent_item *fi;
 	struct btrfs_key fi_key;
 	struct btrfs_key key;
@@ -12192,6 +12193,7 @@ static int repair_extent_data_item(struct btrfs_trans_handle *trans,
 	u64 file_offset;
 	int generation;
 	int slot;
+	int need_insert = 0;
 	int ret = 0;
 
 	eb = pathp->nodes[0];
@@ -12230,9 +12232,20 @@ static int repair_extent_data_item(struct btrfs_trans_handle *trans,
 		ret = -EIO;
 		goto out;
 	}
+	need_insert = ret;
 
+	ret = try_avoid_extents_overwrite(root->fs_info);
+	if (ret)
+		goto out;
+	trans = btrfs_start_transaction(root, 1);
+	if (IS_ERR(trans)) {
+		ret = PTR_ERR(trans);
+		trans = NULL;
+		error("fail to start transaction %s", strerror(-ret));
+		goto out;
+	}
 	/* insert an extent item */
-	if (ret > 0) {
+	if (need_insert) {
 		key.objectid = disk_bytenr;
 		key.type = BTRFS_EXTENT_ITEM_KEY;
 		key.offset = num_bytes;
@@ -12272,6 +12285,8 @@ static int repair_extent_data_item(struct btrfs_trans_handle *trans,
 
 	err &= ~BACKREF_MISSING;
 out:
+	if (trans)
+		btrfs_commit_transaction(trans, root);
 	btrfs_release_path(&path);
 	if (ret)
 		error("can't repair root %llu extent data item[%llu %llu]",
@@ -13545,8 +13560,7 @@ again:
 	case BTRFS_EXTENT_DATA_KEY:
 		ret = check_extent_data_item(root, path, nrefs, account_bytes);
 		if (repair && ret)
-			ret = repair_extent_data_item(trans, root, path, nrefs,
-						      ret);
+			ret = repair_extent_data_item(root, path, nrefs, ret);
 		err |= ret;
 		break;
 	case BTRFS_BLOCK_GROUP_ITEM_KEY:
-- 
2.15.1




  parent reply	other threads:[~2018-01-11  7:31 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-01-11  7:34 [PATCH v3 00/17] btrfs-progs: lowmem check: avoid extents overwrite Su Yue
2018-01-11  7:34 ` [PATCH v3 01/17] btrfs-progs: lowmem check: release path in repair_extent_data_item() Su Yue
2018-01-11  7:34 ` [PATCH v3 02/17] btrfs-progs: lowmem check: record returned errors after walk_down_tree_v2() Su Yue
2018-01-11  7:34 ` [PATCH v3 03/17] btrfs-progs: lowmem check: assign @parent early in repair_extent_data_item() Su Yue
2018-01-11  7:34 ` [PATCH v3 04/17] btrfs-progs: lowmem check: exclude extents of metadata blocks Su Yue
2018-01-11  7:34 ` [PATCH v3 05/17] btrfs-progs: lowmem check: introduce mark/clear_block_groups_full() Su Yue
2018-01-11  7:35 ` [PATCH v3 06/17] btrfs-progs: lowmem check: introduce force_cow_in_new_chunk() Su Yue
2018-01-11  7:35 ` [PATCH v3 07/17] btrfs-progs: lowmem check: introduce try_avoid_extents_overwrite() Su Yue
2018-01-11  7:35 ` [PATCH v3 08/17] btrfs-progs: lowmem check: exclude extents if init-extent-tree in lowmem Su Yue
2018-01-11  7:35 ` Su Yue [this message]
2018-01-11  7:35 ` [PATCH v3 10/17] btrfs-progs: lowmem check: remove parameter @trans of delete_extent_item() Su Yue
2018-01-11  7:35 ` [PATCH v3 11/17] btrfs-progs: lowmem check: remove parameter @trans of repair_chunk_item() Su Yue
2018-01-11  7:35 ` [PATCH v3 12/17] btrfs-progs: lowmem check: remove parameter @trans of repair_extent_item() Su Yue
2018-01-11  7:35 ` [PATCH v3 13/17] btrfs-progs: lowmem check: remove parameter @trans of check_leaf_items() Su Yue
2018-01-11  7:35 ` [PATCH v3 14/17] btrfs-progs: lowmem check: remove parameter @trans of repair_tree_back_ref() Su Yue
2018-01-11  7:35 ` [PATCH v3 15/17] btrfs-progs: lowmem check: remove parameter @trans of check_btrfs_root() Su Yue
2018-01-11  7:35 ` [PATCH v3 16/17] btrfs-progs: lowmem check: introduce repair_block_accounting() Su Yue
2018-01-11  7:35 ` [PATCH v3 17/17] btrfs-progs: lowmem check: end of removing parameters @trans in lowmem Su Yue
2018-01-29  6:01 ` [PATCH v3 00/17] btrfs-progs: lowmem check: avoid extents overwrite Su Yue

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=20180111073511.25288-10-suy.fnst@cn.fujitsu.com \
    --to=suy.fnst@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.