aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorQu Wenruo <quwenruo@cn.fujitsu.com>2016-06-30 10:46:06 +0800
committerDavid Sterba <dsterba@suse.com>2016-07-29 18:01:11 +0200
commit269f20a5e7b2fbfb46f422e608fed3be004a11fd (patch)
tree244c938261db8593482d94ac8d525859873e5edb
parent1a14f9529d7d2ec52045412fef373dadae80bac5 (diff)
downloadbtrfs-progs-foreign/qu/dedupe-v9.tar.gz
btrfs-progs-foreign/qu/dedupe-v9.tar.xz
btrfs-progs-foreign/qu/dedupe-v9.zip
btrfs-progs: dedupe: introduce reconfigure subcommandforeign/qu/dedupe-v9
Introduce reconfigure subcommand to co-operate with new kernel ioctl modification. Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com>
-rw-r--r--Documentation/btrfs-dedupe-inband.asciidoc7
-rw-r--r--cmds-dedupe-ib.c74
2 files changed, 65 insertions, 16 deletions
diff --git a/Documentation/btrfs-dedupe-inband.asciidoc b/Documentation/btrfs-dedupe-inband.asciidoc
index df068c3..5fc4bb0 100644
--- a/Documentation/btrfs-dedupe-inband.asciidoc
+++ b/Documentation/btrfs-dedupe-inband.asciidoc
@@ -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.
diff --git a/cmds-dedupe-ib.c b/cmds-dedupe-ib.c
index d97c9ba..342784c 100644
--- a/cmds-dedupe-ib.c
+++ b/cmds-dedupe-ib.c
@@ -68,7 +68,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 && dargs->member == (type)(err_val)) { \
error("unsupported dedupe "#member": %"#fmt"", old->member); \
@@ -91,6 +90,10 @@ 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;
+ }
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);
@@ -101,14 +104,17 @@ static void report_parameter_error(struct btrfs_ioctl_dedupe_args *dargs,
return;
}
-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;
@@ -130,20 +136,22 @@ static int cmd_dedupe_ib_enable(int argc, char **argv)
{ NULL, 0, NULL, 0}
};
- c = getopt_long(argc, argv, "s:b:a:l:m:", long_options, NULL);
+ c = getopt_long(argc, argv, "s:b:a:l:m:f", long_options, NULL);
if (c < 0)
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)) {
@@ -151,6 +159,7 @@ static int cmd_dedupe_ib_enable(int argc, char **argv)
optarg);
return 1;
}
+ hash_algo = 1;
break;
case 'l':
limit_nr = parse_size(optarg);
@@ -221,26 +230,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: %s",
+ error("failed to (%s) inband deduplication: %s",
+ reconf ? "reconfigure" : "enable",
strerror(errno));
report_parameter_error(&dargs, &backup);
ret = 1;
goto out;
}
+ report_parameter_error(&dargs, &backup);
ret = 0;
mem_check:
if (!force && dargs.limit_mem > sys_mem / 4) {
@@ -255,6 +278,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 disable <path>",
@@ -375,6 +402,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,
@@ -383,6 +423,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
}
};