From: "Darrick J. Wong" <darrick.wong@oracle.com>
To: mfasheh@versity.com
Cc: xfs <linux-xfs@vger.kernel.org>,
linux-btrfs <linux-btrfs@vger.kernel.org>
Subject: [PATCH] duperemove: test presence of dedupe ioctl
Date: Fri, 9 Dec 2016 09:56:45 -0800 [thread overview]
Message-ID: <20161209175645.GB16813@birch.djwong.org> (raw)
Since a zero-length dedupe operation is guaranteed to succeed, use that
to test whether or not this filesystem supports dedupe.
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
file_scan.c | 47 +++++++++++++++++++++++++++++++++++++----------
1 file changed, 37 insertions(+), 10 deletions(-)
diff --git a/file_scan.c b/file_scan.c
index 617f166..a34453e 100644
--- a/file_scan.c
+++ b/file_scan.c
@@ -45,11 +45,7 @@
#include "file_scan.h"
#include "dbfile.h"
#include "util.h"
-
-/* This is not in linux/magic.h */
-#ifndef XFS_SB_MAGIC
-#define XFS_SB_MAGIC 0x58465342 /* 'XFSB' */
-#endif
+#include "btrfs-ioctl.h"
static char path[PATH_MAX] = { 0, };
static char *pathp = path;
@@ -189,6 +185,39 @@ static int walk_dir(const char *name)
return ret;
}
+struct fake_btrfs_ioctl_same_args {
+ struct btrfs_ioctl_same_args args;
+ struct btrfs_ioctl_same_extent_info info;
+};
+
+/*
+ * A zero-length dedupe between two files should always succeed,
+ * so we can use this to test the presence of dedupe functionality.
+ */
+static bool check_ioctl_works(int fd)
+{
+ struct fake_btrfs_ioctl_same_args sa = {0};
+ struct stat sb;
+ static int cached = -1;
+ int ret;
+
+ if (cached >= 0)
+ return cached != 0;
+
+ ret = fstat(fd, &sb);
+ if (ret)
+ return false;
+
+ sa.args.dest_count = 1;
+ sa.args.length = 0;
+ sa.info.fd = fd;
+ sa.info.logical_offset = 0;
+ errno = 0;
+ ret = btrfs_extent_same(fd, &sa.args);
+ cached = !ret && !errno && !sa.info.status;
+ return cached != 0;
+}
+
static int __add_file(const char *name, struct stat *st,
struct filerec **ret_file)
{
@@ -235,12 +264,10 @@ static int __add_file(const char *name, struct stat *st,
goto out;
}
- if (run_dedupe &&
- ((fs.f_type != BTRFS_SUPER_MAGIC &&
- fs.f_type != XFS_SB_MAGIC))) {
+ if (run_dedupe && !check_ioctl_works(fd)) {
close(fd);
- fprintf(stderr, "\"%s\": Can only dedupe files on btrfs or xfs "
- "(experimental)\n", name);
+ fprintf(stderr, "\"%s\": dedupe ioctl not supported on this "
+ "filesystem.\n", name);
return ENOSYS;
}
next reply other threads:[~2016-12-09 17:56 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-12-09 17:56 Darrick J. Wong [this message]
2016-12-14 10:44 ` [PATCH] duperemove: test presence of dedupe ioctl Christoph Hellwig
2016-12-14 18:38 ` Darrick J. Wong
2016-12-14 19:26 ` Christoph Hellwig
2016-12-16 1:20 ` Darrick J. Wong
2016-12-16 7:53 ` Christoph Hellwig
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20161209175645.GB16813@birch.djwong.org \
--to=darrick.wong@oracle.com \
--cc=linux-btrfs@vger.kernel.org \
--cc=linux-xfs@vger.kernel.org \
--cc=mfasheh@versity.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.