From: Qu Wenruo <quwen...@cn.fujitsu.com>

Introduce reconfigure subcommand to co-operate with new kernel ioctl
modification.

Signed-off-by: Qu Wenruo <quwen...@cn.fujitsu.com>
---
 Documentation/btrfs-dedupe-inband.asciidoc |  7 ++
 cmds-dedupe-ib.c                           | 75 +++++++++++++++++-----
 2 files changed, 66 insertions(+), 16 deletions(-)

diff --git a/Documentation/btrfs-dedupe-inband.asciidoc 
b/Documentation/btrfs-dedupe-inband.asciidoc
index df068c31ca3a..5fc4bb0d5940 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 854cbda131a3..925d5a8f756a 100644
--- a/cmds-dedupe-ib.c
+++ b/cmds-dedupe-ib.c
@@ -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;
@@ -129,20 +137,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)) {
@@ -226,26 +236,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) {
@@ -261,6 +285,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>",
@@ -381,6 +409,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,
@@ -389,6 +430,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
        }
 };
-- 
2.17.0



--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to