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

Add basic ioctl header and command group framework for later use.
Alone with basic man page doc.

Signed-off-by: Qu Wenruo <quwen...@cn.fujitsu.com>
Signed-off-by: Lu Fengqi <lufq.f...@cn.fujitsu.com>
---
v10.4:
1. s/btrfs-dedupe/btrfs-dedupe-inband in man page
2. use SZ_* instead of the intermediate number

 Documentation/Makefile.in                  |  1 +
 Documentation/btrfs-dedupe-inband.asciidoc | 40 ++++++++++++++++++++++
 Documentation/btrfs.asciidoc               |  4 +++
 Makefile                                   |  3 +-
 btrfs.c                                    |  2 ++
 cmds-dedupe-ib.c                           | 35 +++++++++++++++++++
 commands.h                                 |  2 ++
 dedupe-ib.h                                | 28 +++++++++++++++
 ioctl.h                                    | 36 +++++++++++++++++++
 9 files changed, 150 insertions(+), 1 deletion(-)
 create mode 100644 Documentation/btrfs-dedupe-inband.asciidoc
 create mode 100644 cmds-dedupe-ib.c
 create mode 100644 dedupe-ib.h

diff --git a/Documentation/Makefile.in b/Documentation/Makefile.in
index 184647c41940..402155fae001 100644
--- a/Documentation/Makefile.in
+++ b/Documentation/Makefile.in
@@ -28,6 +28,7 @@ MAN8_TXT += btrfs-qgroup.asciidoc
 MAN8_TXT += btrfs-replace.asciidoc
 MAN8_TXT += btrfs-restore.asciidoc
 MAN8_TXT += btrfs-property.asciidoc
+MAN8_TXT += btrfs-dedupe-inband.asciidoc
 
 # Category 5 manual page
 MAN5_TXT += btrfs-man5.asciidoc
diff --git a/Documentation/btrfs-dedupe-inband.asciidoc 
b/Documentation/btrfs-dedupe-inband.asciidoc
new file mode 100644
index 000000000000..83113f5487e2
--- /dev/null
+++ b/Documentation/btrfs-dedupe-inband.asciidoc
@@ -0,0 +1,40 @@
+btrfs-dedupe-inband(8)
+======================
+
+NAME
+----
+btrfs-dedupe-inband - manage in-band (write time) de-duplication of a btrfs
+filesystem
+
+SYNOPSIS
+--------
+*btrfs dedupe-inband* <subcommand> <args>
+
+DESCRIPTION
+-----------
+*btrfs dedupe-inband* is used to enable/disable or show current in-band 
de-duplication
+status of a btrfs filesystem.
+
+Kernel support for in-band de-duplication starts from 4.19.
+
+WARNING: In-band de-duplication is still an experimental feautre of btrfs,
+use with caution.
+
+SUBCOMMAND
+----------
+Nothing yet
+
+EXIT STATUS
+-----------
+*btrfs dedupe-inband* returns a zero exit status if it succeeds. Non zero is
+returned in case of failure.
+
+AVAILABILITY
+------------
+*btrfs* is part of btrfs-progs.
+Please refer to the btrfs wiki http://btrfs.wiki.kernel.org for
+further details.
+
+SEE ALSO
+--------
+`mkfs.btrfs`(8),
diff --git a/Documentation/btrfs.asciidoc b/Documentation/btrfs.asciidoc
index 7316ac094413..1cf5bddec335 100644
--- a/Documentation/btrfs.asciidoc
+++ b/Documentation/btrfs.asciidoc
@@ -50,6 +50,10 @@ COMMANDS
        Do off-line check on a btrfs filesystem. +
        See `btrfs-check`(8) for details.
 
+*dedupe-inband*::
+       Control btrfs in-band(write time) de-duplication. +
+       See `btrfs-dedupe-inband`(8) for details.
+
 *device*::
        Manage devices managed by btrfs, including add/delete/scan and so
        on. +
diff --git a/Makefile b/Makefile
index 544410e6440c..1ebed7135714 100644
--- a/Makefile
+++ b/Makefile
@@ -123,7 +123,8 @@ cmds_objects = cmds-subvolume.o cmds-filesystem.o 
cmds-device.o cmds-scrub.o \
               cmds-restore.o cmds-rescue.o chunk-recover.o super-recover.o \
               cmds-property.o cmds-fi-usage.o cmds-inspect-dump-tree.o \
               cmds-inspect-dump-super.o cmds-inspect-tree-stats.o cmds-fi-du.o 
\
-              mkfs/common.o check/mode-common.o check/mode-lowmem.o
+              mkfs/common.o check/mode-common.o check/mode-lowmem.o \
+              cmds-dedupe-ib.o
 libbtrfs_objects = send-stream.o send-utils.o kernel-lib/rbtree.o btrfs-list.o 
\
                   kernel-lib/crc32c.o messages.o \
                   uuid-tree.o utils-lib.o rbtree-utils.o
diff --git a/btrfs.c b/btrfs.c
index 2d39f2ced3e8..2168f5a8bc7f 100644
--- a/btrfs.c
+++ b/btrfs.c
@@ -255,6 +255,8 @@ static const struct cmd_group btrfs_cmd_group = {
                { "quota", cmd_quota, NULL, &quota_cmd_group, 0 },
                { "qgroup", cmd_qgroup, NULL, &qgroup_cmd_group, 0 },
                { "replace", cmd_replace, NULL, &replace_cmd_group, 0 },
+               { "dedupe-inband", cmd_dedupe_ib, NULL, &dedupe_ib_cmd_group,
+                       0 },
                { "help", cmd_help, cmd_help_usage, NULL, 0 },
                { "version", cmd_version, cmd_version_usage, NULL, 0 },
                NULL_CMD_STRUCT
diff --git a/cmds-dedupe-ib.c b/cmds-dedupe-ib.c
new file mode 100644
index 000000000000..73c923a797da
--- /dev/null
+++ b/cmds-dedupe-ib.c
@@ -0,0 +1,35 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2017 Fujitsu.  All rights reserved.
+ */
+
+#include <getopt.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+
+#include "ctree.h"
+#include "ioctl.h"
+
+#include "commands.h"
+#include "utils.h"
+#include "kerncompat.h"
+#include "dedupe-ib.h"
+
+static const char * const dedupe_ib_cmd_group_usage[] = {
+       "btrfs dedupe-inband <command> [options] <path>",
+       NULL
+};
+
+static const char dedupe_ib_cmd_group_info[] =
+"manage inband(write time) de-duplication";
+
+const struct cmd_group dedupe_ib_cmd_group = {
+       dedupe_ib_cmd_group_usage, dedupe_ib_cmd_group_info, {
+               NULL_CMD_STRUCT
+       }
+};
+
+int cmd_dedupe_ib(int argc, char **argv)
+{
+       return handle_command_group(&dedupe_ib_cmd_group, argc, argv);
+}
diff --git a/commands.h b/commands.h
index 76991f2b28d5..28b8eec7cbfd 100644
--- a/commands.h
+++ b/commands.h
@@ -81,6 +81,7 @@ extern const struct cmd_group quota_cmd_group;
 extern const struct cmd_group qgroup_cmd_group;
 extern const struct cmd_group replace_cmd_group;
 extern const struct cmd_group rescue_cmd_group;
+extern const struct cmd_group dedupe_ib_cmd_group;
 
 extern const char * const cmd_send_usage[];
 extern const char * const cmd_receive_usage[];
@@ -120,5 +121,6 @@ int cmd_select_super(int argc, char **argv);
 int cmd_dump_super(int argc, char **argv);
 int cmd_debug_tree(int argc, char **argv);
 int cmd_rescue(int argc, char **argv);
+int cmd_dedupe_ib(int argc, char **argv);
 
 #endif
diff --git a/dedupe-ib.h b/dedupe-ib.h
new file mode 100644
index 000000000000..c5a35724e97b
--- /dev/null
+++ b/dedupe-ib.h
@@ -0,0 +1,28 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2017 Fujitsu.  All rights reserved.
+ */
+
+#ifndef __BTRFS_DEDUPE__
+#define __BTRFS_DEDUPE__
+
+/*
+ * Dedup storage backend
+ * On disk is persist storage but overhead is large
+ * In memory is fast but will lose all its hash on umount
+ */
+#define BTRFS_DEDUPE_BACKEND_INMEMORY          0
+#define BTRFS_DEDUPE_BACKEND_LAST              1
+
+/* Dedup block size limit and default value */
+#define BTRFS_DEDUPE_BLOCKSIZE_MAX     SZ_8M
+#define BTRFS_DEDUPE_BLOCKSIZE_MIN     SZ_16K
+#define BTRFS_DEDUPE_BLOCKSIZE_DEFAULT SZ_128K
+
+/* Default dedupe limit on number of hash */
+#define BTRFS_DEDUPE_LIMIT_NR_DEFAULT  SZ_32K
+
+/* Hash algorithm, only support SHA256 yet */
+#define BTRFS_DEDUPE_HASH_SHA256               0
+
+#endif
diff --git a/ioctl.h b/ioctl.h
index 709e996f401c..8268c0354eb9 100644
--- a/ioctl.h
+++ b/ioctl.h
@@ -559,6 +559,42 @@ struct btrfs_ioctl_qgroup_create_args {
 };
 BUILD_ASSERT(sizeof(struct btrfs_ioctl_qgroup_create_args) == 16);
 
+/*
+ * de-duplication control modes
+ * For re-config, enable will handle it
+ */
+#define BTRFS_DEDUPE_CTL_ENABLE        1
+#define BTRFS_DEDUPE_CTL_DISABLE 2
+#define BTRFS_DEDUPE_CTL_STATUS        3
+#define BTRFS_DEDUPE_CTL_RECONF        4
+#define BTRFS_DEDUPE_CTL_LAST  5
+
+/*
+ * Allow enable command to be executed on dedupe enabled fs.
+ * Make dedupe_enable ioctl to be stateless.
+ *
+ * Or only dedup_reconf ioctl can be executed on dedupe enabled fs
+ */
+#define BTRFS_DEDUPE_FLAG_FORCE                (1 << 0)
+/*
+ * This structure is used for dedupe enable/disable/configure
+ * and status ioctl.
+ * Reserved range should be set to 0xff.
+ */
+struct btrfs_ioctl_dedupe_args {
+       __u16 cmd;              /* In: command */
+       __u64 blocksize;        /* In/Out: blocksize */
+       __u64 limit_nr;         /* In/Out: limit nr for inmem backend */
+       __u64 limit_mem;        /* In/Out: limit mem for inmem backend */
+       __u64 current_nr;       /* Out: current hash nr */
+       __u16 backend;          /* In/Out: current backend */
+       __u16 hash_algo;        /* In/Out: hash algorithm */
+       u8 status;              /* Out: enabled or disabled */
+       u8 flags;               /* In: special flags for ioctl */
+       u8 __unused[472];       /* Pad to 512 bytes */
+};
+BUILD_ASSERT(sizeof(btrfs_ioctl_dedupe_args) == 512);
+
 struct btrfs_ioctl_timespec {
        __u64 sec;
        __u32 nsec;
-- 
2.18.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