All of lore.kernel.org
 help / color / mirror / Atom feed
From: Qu Wenruo <wqu@suse.com>
To: linux-btrfs@vger.kernel.org, dan.merillat@gmail.com
Subject: [PATCH] btrfs-progs: rescue: Add ability to disable quota offline
Date: Sun, 12 Aug 2018 09:33:58 +0800	[thread overview]
Message-ID: <20180812013358.16431-1-wqu@suse.com> (raw)

Provide an offline tool to disable quota.

For kernel which skip_balance doesn't work, there is no way to disable
quota on huge fs with balance, as quota will cause balance to hang for a
long long time for each tree block switch.

So add an offline rescue tool to disable quota.

Reported-by: Dan Merillat <dan.merillat@gmail.com>
Signed-off-by: Qu Wenruo <wqu@suse.com>
---
This can patch can be fetched from github repo:
https://github.com/adam900710/btrfs-progs/tree/quota_disable
---
 Documentation/btrfs-rescue.asciidoc |  6 +++
 cmds-rescue.c                       | 80 +++++++++++++++++++++++++++++
 2 files changed, 86 insertions(+)

diff --git a/Documentation/btrfs-rescue.asciidoc b/Documentation/btrfs-rescue.asciidoc
index f94a0ff2b45e..fb088c1a768a 100644
--- a/Documentation/btrfs-rescue.asciidoc
+++ b/Documentation/btrfs-rescue.asciidoc
@@ -31,6 +31,12 @@ help.
 NOTE: Since *chunk-recover* will scan the whole device, it will be *VERY* slow
 especially executed on a large device.
 
+*disable-quota* <device>::
+disable quota offline
++
+Acts as a fallback method to disable quota for case where mount hangs due to
+balance and quota.
+
 *fix-device-size* <device>::
 fix device size and super block total bytes values that are do not match
 +
diff --git a/cmds-rescue.c b/cmds-rescue.c
index 38c4ab9b2ef6..c7cd92427e9d 100644
--- a/cmds-rescue.c
+++ b/cmds-rescue.c
@@ -250,6 +250,84 @@ out:
 	return !!ret;
 }
 
+static const char * const cmd_rescue_disable_quota_usage[] = {
+	"btrfs rescue disable-quota <device>",
+	"Disable quota, especially useful for balance mount hang when quota enabled",
+	"",
+	NULL
+};
+
+static int cmd_rescue_disable_quota(int argc, char **argv)
+{
+	struct btrfs_trans_handle *trans;
+	struct btrfs_fs_info *fs_info;
+	struct btrfs_path path;
+	struct btrfs_root *root;
+	struct btrfs_qgroup_status_item *qi;
+	struct btrfs_key key;
+	char *devname;
+	int ret;
+
+	clean_args_no_options(argc, argv, cmd_rescue_disable_quota_usage);
+	if (check_argc_exact(argc, 2))
+		usage(cmd_rescue_disable_quota_usage);
+
+	devname = argv[optind];
+	ret = check_mounted(devname);
+	if (ret < 0) {
+		error("could not check mount status: %s", strerror(-ret));
+		return !!ret;
+	} else if (ret) {
+		error("%s is currently mounted", devname);
+		return !!ret;
+	}
+	fs_info = open_ctree_fs_info(devname, 0, 0, 0, OPEN_CTREE_WRITES);
+	if (!fs_info) {
+		error("could not open btrfs");
+		ret = -EIO;
+		return !!ret;
+	}
+	root = fs_info->quota_root;
+	if (!root) {
+		printf("Quota is not enabled, no need to modify the fs\n");
+		goto close;
+	}
+	btrfs_init_path(&path);
+	trans = btrfs_start_transaction(root, 1);
+	if (IS_ERR(trans)) {
+		ret = PTR_ERR(trans);
+		error("failed to start transaction: %s", strerror(-ret));
+		goto close;
+	}
+	key.objectid = 0;
+	key.type = BTRFS_QGROUP_STATUS_KEY;
+	key.offset = 0;
+	ret = btrfs_search_slot(trans, root, &key, &path, 0, 1);
+	if (ret < 0) {
+		error("failed to search tree: %s", strerror(-ret));
+		goto close;
+	}
+	if (ret > 0) {
+		printf(
+		"qgroup status item not found, not need to modify the fs");
+		ret = 0;
+		goto release;
+	}
+	qi = btrfs_item_ptr(path.nodes[0], path.slots[0],
+			    struct btrfs_qgroup_status_item);
+	btrfs_set_qgroup_status_flags(path.nodes[0], qi,
+			BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT);
+	btrfs_mark_buffer_dirty(path.nodes[0]);
+	ret = btrfs_commit_transaction(trans, root);
+	if (ret < 0)
+		error("failed to commit transaction: %s", strerror(-ret));
+release:
+	btrfs_release_path(&path);
+close:
+	close_ctree(fs_info->tree_root);
+	return !!ret;
+}
+
 static const char rescue_cmd_group_info[] =
 "toolbox for specific rescue operations";
 
@@ -262,6 +340,8 @@ const struct cmd_group rescue_cmd_group = {
 		{ "zero-log", cmd_rescue_zero_log, cmd_rescue_zero_log_usage, NULL, 0},
 		{ "fix-device-size", cmd_rescue_fix_device_size,
 			cmd_rescue_fix_device_size_usage, NULL, 0},
+		{ "disable-quota", cmd_rescue_disable_quota,
+			cmd_rescue_disable_quota_usage, NULL, 0},
 		NULL_CMD_STRUCT
 	}
 };
-- 
2.18.0

             reply	other threads:[~2018-08-12  4:10 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-08-12  1:33 Qu Wenruo [this message]
2018-08-12  4:09 ` [PATCH] btrfs-progs: rescue: Add ability to disable quota offline Dan Merillat
2018-08-21  7:14 ` Misono Tomohiro
2018-08-21  7:30   ` Qu Wenruo
2018-08-22  2:33 ` Su Yue
2018-08-22  4:59   ` 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=20180812013358.16431-1-wqu@suse.com \
    --to=wqu@suse.com \
    --cc=dan.merillat@gmail.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.