History

btrfs: offline dedupe

This patch adds an ioctl, BTRFS_IOC_FILE_EXTENT_SAME which will try to de-duplicate a list of extents across a range of files. Internally, the ioctl re-uses code from the clone ioctl. This avoids rewriting a large chunk of extent handling code. Userspace passes in an array of file, offset pairs along with a length argument. The ioctl will then (for each dedupe) do a byte-by-byte comparison of the user data before deduping the extent. Status and number of bytes deduped are returned for each operation.

Mark Fasheh committed 13 years ago

Commit 416161d1 parent 4b384312 files · +307 −0Browse files

Showing the changes to include/uapi/linux (1 of 2 files). Show all

Unified · Split

include/uapi/linux/btrfs.h+28−0
@@ -305,6 +305,31 @@ struct btrfs_ioctl_clone_range_args { · 304 unmodified lines
305305 #define BTRFS_DEFRAG_RANGE_COMPRESS 1
306306 #define BTRFS_DEFRAG_RANGE_START_IO 2
307307
308+#define BTRFS_SAME_DATA_DIFFERS 1
309+/* For extent-same ioctl */
310+struct btrfs_ioctl_same_extent_info {
311+ __s64 fd; /* in - destination file */
312+ __u64 logical_offset; /* in - start of extent in destination */
313+ __u64 bytes_deduped; /* out - total # of bytes we were able
314+ * to dedupe from this file */
315+ /* status of this dedupe operation:
316+ * 0 if dedup succeeds
317+ * < 0 for error
318+ * == BTRFS_SAME_DATA_DIFFERS if data differs
319+ */
320+ __s32 status; /* out - see above description */
321+ __u32 reserved;
322+};
323+
324+struct btrfs_ioctl_same_args {
325+ __u64 logical_offset; /* in - start of extent in source */
326+ __u64 length; /* in - length of extent */
327+ __u16 dest_count; /* in - total elements in info array */
328+ __u16 reserved1;
329+ __u32 reserved2;
330+ struct btrfs_ioctl_same_extent_info info[0];
331+};
332+
308333 struct btrfs_ioctl_space_info {
309334 __u64 flags;
310335 __u64 total_bytes;
@@ -579,4 +604,7 @@ static inline char *btrfs_err_str(enum btrfs_err_code err_code) · 268 unmodified lines
579604 struct btrfs_ioctl_get_dev_stats)
580605 #define BTRFS_IOC_DEV_REPLACE _IOWR(BTRFS_IOCTL_MAGIC, 53, \
581606 struct btrfs_ioctl_dev_replace_args)
607+#define BTRFS_IOC_FILE_EXTENT_SAME _IOWR(BTRFS_IOCTL_MAGIC, 54, \
608+ struct btrfs_ioctl_same_args)
609+
582610 #endif /* _UAPI_LINUX_BTRFS_H */