Revert "btrfs-progs: subvol delete: add options to delete the qgroup"
This reverts commit 9da773aa46
.
There are several problems related to the --delete-qgroup option:
- Currently kernel doesn't allow to delete non-empty qgroups
- A qgroup can only be empty after fully dropped and a transaction is
committed
The tool doesn't take either factor into consideration
- Things like drop_subtree_threshold or other operations can mark qgroup
inconsistent and skip accounting
This can mean the target qgroup will never be empty until next rescan
On the other hand, even we do it the proper way, it would hugely delay
the command (wait until the subvolume to be cleaned).
Furthermore, even if the waiting is handled properly,
drop_subtree_threshold can still prevent us deleting the qgroup (qgroup
numbers are inconsistent, and accounting is skipped completely).
So the qgroup cleanup needs kernel to make it work properly.
Signed-off-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
40588d4aa9
commit
99447fb708
|
@ -112,13 +112,6 @@ delete [options] [<subvolume> [<subvolume>...]], delete -i|--subvolid <subvolid>
|
||||||
-i|--subvolid <subvolid>
|
-i|--subvolid <subvolid>
|
||||||
subvolume id to be removed instead of the <path> that should point to the
|
subvolume id to be removed instead of the <path> that should point to the
|
||||||
filesystem with the subvolume
|
filesystem with the subvolume
|
||||||
|
|
||||||
--delete-qgroup
|
|
||||||
also delete the qgroup 0/subvolid if it exists
|
|
||||||
|
|
||||||
--no-delete-qgroup
|
|
||||||
do not delete the 0/subvolid qgroup (default)
|
|
||||||
|
|
||||||
-v|--verbose
|
-v|--verbose
|
||||||
(deprecated) alias for global *-v* option
|
(deprecated) alias for global *-v* option
|
||||||
|
|
||||||
|
|
|
@ -348,8 +348,6 @@ static const char * const cmd_subvolume_delete_usage[] = {
|
||||||
OPTLINE("-c|--commit-after", "wait for transaction commit at the end of the operation"),
|
OPTLINE("-c|--commit-after", "wait for transaction commit at the end of the operation"),
|
||||||
OPTLINE("-C|--commit-each", "wait for transaction commit after deleting each subvolume"),
|
OPTLINE("-C|--commit-each", "wait for transaction commit after deleting each subvolume"),
|
||||||
OPTLINE("-i|--subvolid", "subvolume id of the to be removed subvolume"),
|
OPTLINE("-i|--subvolid", "subvolume id of the to be removed subvolume"),
|
||||||
OPTLINE("--delete-qgroup", "also delete the qgroup 0/subvolid if it exists"),
|
|
||||||
OPTLINE("--no-delete-qgroup", "do not delete the qgroup 0/subvolid if it exists (default)"),
|
|
||||||
OPTLINE("-v|--verbose", "deprecated, alias for global -v option"),
|
OPTLINE("-v|--verbose", "deprecated, alias for global -v option"),
|
||||||
HELPINFO_INSERT_GLOBALS,
|
HELPINFO_INSERT_GLOBALS,
|
||||||
HELPINFO_INSERT_VERBOSE,
|
HELPINFO_INSERT_VERBOSE,
|
||||||
|
@ -378,20 +376,15 @@ static int cmd_subvolume_delete(const struct cmd_struct *cmd, int argc, char **a
|
||||||
enum { COMMIT_AFTER = 1, COMMIT_EACH = 2 };
|
enum { COMMIT_AFTER = 1, COMMIT_EACH = 2 };
|
||||||
enum btrfs_util_error err;
|
enum btrfs_util_error err;
|
||||||
uint64_t default_subvol_id, target_subvol_id = 0;
|
uint64_t default_subvol_id, target_subvol_id = 0;
|
||||||
bool opt_delete_qgroup = false;
|
|
||||||
|
|
||||||
optind = 0;
|
optind = 0;
|
||||||
while (1) {
|
while (1) {
|
||||||
int c;
|
int c;
|
||||||
enum { GETOPT_VAL_DELETE_QGROUP = GETOPT_VAL_FIRST,
|
|
||||||
GETOPT_VAL_NO_DELETE_QGROUP };
|
|
||||||
static const struct option long_options[] = {
|
static const struct option long_options[] = {
|
||||||
{"commit-after", no_argument, NULL, 'c'},
|
{"commit-after", no_argument, NULL, 'c'},
|
||||||
{"commit-each", no_argument, NULL, 'C'},
|
{"commit-each", no_argument, NULL, 'C'},
|
||||||
{"subvolid", required_argument, NULL, 'i'},
|
{"subvolid", required_argument, NULL, 'i'},
|
||||||
{"verbose", no_argument, NULL, 'v'},
|
{"verbose", no_argument, NULL, 'v'},
|
||||||
{"delete-qgroup", no_argument, NULL, GETOPT_VAL_DELETE_QGROUP },
|
|
||||||
{"no-delete-qgroup", no_argument, NULL, GETOPT_VAL_NO_DELETE_QGROUP },
|
|
||||||
{NULL, 0, NULL, 0}
|
{NULL, 0, NULL, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -412,12 +405,6 @@ static int cmd_subvolume_delete(const struct cmd_struct *cmd, int argc, char **a
|
||||||
case 'v':
|
case 'v':
|
||||||
bconf_be_verbose();
|
bconf_be_verbose();
|
||||||
break;
|
break;
|
||||||
case GETOPT_VAL_DELETE_QGROUP:
|
|
||||||
opt_delete_qgroup = true;
|
|
||||||
break;
|
|
||||||
case GETOPT_VAL_NO_DELETE_QGROUP:
|
|
||||||
opt_delete_qgroup = false;
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
usage_unknown_option(cmd, argv);
|
usage_unknown_option(cmd, argv);
|
||||||
}
|
}
|
||||||
|
@ -553,19 +540,6 @@ again:
|
||||||
warning("deletion failed with EPERM, you don't have permissions or send may be in progress");
|
warning("deletion failed with EPERM, you don't have permissions or send may be in progress");
|
||||||
ret = 1;
|
ret = 1;
|
||||||
goto out;
|
goto out;
|
||||||
} else if (opt_delete_qgroup) {
|
|
||||||
struct btrfs_ioctl_qgroup_create_args args = { .qgroupid = target_subvol_id };
|
|
||||||
|
|
||||||
ret = ioctl(fd, BTRFS_IOC_QGROUP_CREATE, &args);
|
|
||||||
if (ret == 0) {
|
|
||||||
pr_verbose(LOG_DEFAULT, "Delete qgroup 0/%" PRIu64 "\n", target_subvol_id);
|
|
||||||
} else if (ret < 0 && (errno == ENOTCONN || errno == ENOENT)) {
|
|
||||||
/* Quotas not enabled, or there's no qgroup. */
|
|
||||||
} else {
|
|
||||||
warning("unable to delete qgroup 0/%llu: %m", subvolid);
|
|
||||||
}
|
|
||||||
/* Qgroup errors are not fatal. */
|
|
||||||
ret = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (commit_mode == COMMIT_EACH) {
|
if (commit_mode == COMMIT_EACH) {
|
||||||
|
|
Loading…
Reference in New Issue