@@ -86,6 +86,13 @@ And compression has higher priority than in-band de-duplication, means if
compression and de-duplication is enabled at the same time, only compression
will work.
+*reconfigure* [options] <path>::
+Re-configure in-band de-duplication parameters of a filesystem.
++
+In-band de-duplication must be enbaled first before re-configuration.
++
+[Options] are the same with 'btrfs dedupe-inband enable'.
+
*status* <path>::
Show current in-band de-duplication status of a filesystem.
@@ -34,7 +34,7 @@ _btrfs()
commands_quota='enable disable rescan'
commands_qgroup='assign remove create destroy show limit'
commands_replace='start status cancel'
- commands_dedupe_inband='enable disable status'
+ commands_dedupe_inband='enable disable status reconfigure'
if [[ "$cur" == -* && $cword -le 3 && "$cmd" != "help" ]]; then
COMPREPLY=( $( compgen -W '--help' -- "$cur" ) )
@@ -56,7 +56,6 @@ static const char * const cmd_dedupe_ib_enable_usage[] = {
NULL
};
-
#define report_fatal_parameter(dargs, old, member, type, err_val, fmt) \
({ \
if (dargs->member != old->member && \
@@ -88,6 +87,12 @@ static void report_parameter_error(struct btrfs_ioctl_dedupe_args *dargs,
}
report_option_parameter(dargs, old, flags, u8, -1, x);
}
+
+ if (dargs->status == 0 && old->cmd == BTRFS_DEDUPE_CTL_RECONF) {
+ error("must enable dedupe before reconfiguration");
+ return;
+ }
+
if (report_fatal_parameter(dargs, old, cmd, u16, -1, u) ||
report_fatal_parameter(dargs, old, blocksize, u64, -1, llu) ||
report_fatal_parameter(dargs, old, backend, u16, -1, u) ||
@@ -100,14 +105,17 @@ static void report_parameter_error(struct btrfs_ioctl_dedupe_args *dargs,
old->limit_nr, old->limit_mem);
}
-static int cmd_dedupe_ib_enable(int argc, char **argv)
+static int enable_reconfig_dedupe(int argc, char **argv, int reconf)
{
int ret;
int fd = -1;
char *path;
u64 blocksize = BTRFS_DEDUPE_BLOCKSIZE_DEFAULT;
+ int blocksize_set = 0;
u16 hash_algo = BTRFS_DEDUPE_HASH_SHA256;
+ int hash_algo_set = 0;
u16 backend = BTRFS_DEDUPE_BACKEND_INMEMORY;
+ int backend_set = 0;
u64 limit_nr = 0;
u64 limit_mem = 0;
u64 sys_mem = 0;
@@ -134,15 +142,17 @@ static int cmd_dedupe_ib_enable(int argc, char **argv)
break;
switch (c) {
case 's':
- if (!strcasecmp("inmemory", optarg))
+ if (!strcasecmp("inmemory", optarg)) {
backend = BTRFS_DEDUPE_BACKEND_INMEMORY;
- else {
+ backend_set = 1;
+ } else {
error("unsupported dedupe backend: %s", optarg);
exit(1);
}
break;
case 'b':
blocksize = parse_size(optarg);
+ blocksize_set = 1;
break;
case 'a':
if (strcmp("sha256", optarg)) {
@@ -224,26 +234,40 @@ static int cmd_dedupe_ib_enable(int argc, char **argv)
return 1;
}
memset(&dargs, -1, sizeof(dargs));
- dargs.cmd = BTRFS_DEDUPE_CTL_ENABLE;
- dargs.blocksize = blocksize;
- dargs.hash_algo = hash_algo;
- dargs.limit_nr = limit_nr;
- dargs.limit_mem = limit_mem;
- dargs.backend = backend;
- if (force)
- dargs.flags |= BTRFS_DEDUPE_FLAG_FORCE;
- else
- dargs.flags = 0;
+ if (reconf) {
+ dargs.cmd = BTRFS_DEDUPE_CTL_RECONF;
+ if (blocksize_set)
+ dargs.blocksize = blocksize;
+ if (hash_algo_set)
+ dargs.hash_algo = hash_algo;
+ if (backend_set)
+ dargs.backend = backend;
+ dargs.limit_nr = limit_nr;
+ dargs.limit_mem = limit_mem;
+ } else {
+ dargs.cmd = BTRFS_DEDUPE_CTL_ENABLE;
+ dargs.blocksize = blocksize;
+ dargs.hash_algo = hash_algo;
+ dargs.limit_nr = limit_nr;
+ dargs.limit_mem = limit_mem;
+ dargs.backend = backend;
+ if (force)
+ dargs.flags |= BTRFS_DEDUPE_FLAG_FORCE;
+ else
+ dargs.flags = 0;
+ }
memcpy(&backup, &dargs, sizeof(dargs));
ret = ioctl(fd, BTRFS_IOC_DEDUPE_CTL, &dargs);
if (ret < 0) {
- error("failed to enable inband deduplication: %m");
+ error("failed to (%s) inband deduplication: %m",
+ reconf ? "reconfigure" : "enable");
report_parameter_error(&dargs, &backup);
ret = 1;
goto out;
}
+ report_parameter_error(&dargs, &backup);
mem_check:
if (!force && dargs.limit_mem > sys_mem / 4) {
ret = 1;
@@ -258,6 +282,10 @@ out:
close_file_or_dir(fd, dirstream);
return ret;
}
+static int cmd_dedupe_ib_enable(int argc, char **argv)
+{
+ return enable_reconfig_dedupe(argc, argv, 0);
+}
static const char * const cmd_dedupe_ib_disable_usage[] = {
"btrfs dedupe-inband disable <path>",
@@ -376,6 +404,19 @@ out:
return ret;
}
+static int cmd_dedupe_ib_reconf(int argc, char **argv)
+{
+ return enable_reconfig_dedupe(argc, argv, 1);
+}
+
+static const char * const cmd_dedupe_ib_reconf_usage[] = {
+ "btrfs dedupe-inband reconfigure [options] <path>",
+ "Reconfigure in-band(write time) de-duplication of a btrfs.",
+ "",
+ "Options are the same as 'btrfs dedupe-inband enable'",
+ NULL
+};
+
const struct cmd_group dedupe_ib_cmd_group = {
dedupe_ib_cmd_group_usage, dedupe_ib_cmd_group_info, {
{ "enable", cmd_dedupe_ib_enable, cmd_dedupe_ib_enable_usage,
@@ -384,6 +425,8 @@ const struct cmd_group dedupe_ib_cmd_group = {
NULL, 0},
{ "status", cmd_dedupe_ib_status, cmd_dedupe_ib_status_usage,
NULL, 0},
+ { "reconfigure", cmd_dedupe_ib_reconf,
+ cmd_dedupe_ib_reconf_usage, NULL, 0},
NULL_CMD_STRUCT
}
};