Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1a419d85 authored by Li Zefan's avatar Li Zefan
Browse files

btrfs: Allow to specify compress method when defrag



Update defrag ioctl, so one can choose lzo or zlib when turning
on compression in defrag operation.

Changelog:

v1 -> v2
- Add incompability flag.
- Fix to check invalid compress type.

Signed-off-by: default avatarLi Zefan <lizf@cn.fujitsu.com>
parent a6fa6fae
Loading
Loading
Loading
Loading
+18 −1
Original line number Diff line number Diff line
@@ -638,9 +638,11 @@ static int btrfs_defrag_file(struct file *file,
	struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree;
	struct btrfs_ordered_extent *ordered;
	struct page *page;
	struct btrfs_super_block *disk_super;
	unsigned long last_index;
	unsigned long ra_pages = root->fs_info->bdi.ra_pages;
	unsigned long total_read = 0;
	u64 features;
	u64 page_start;
	u64 page_end;
	u64 last_len = 0;
@@ -648,6 +650,14 @@ static int btrfs_defrag_file(struct file *file,
	u64 defrag_end = 0;
	unsigned long i;
	int ret;
	int compress_type = BTRFS_COMPRESS_ZLIB;

	if (range->flags & BTRFS_DEFRAG_RANGE_COMPRESS) {
		if (range->compress_type > BTRFS_COMPRESS_TYPES)
			return -EINVAL;
		if (range->compress_type)
			compress_type = range->compress_type;
	}

	if (inode->i_size == 0)
		return 0;
@@ -683,7 +693,7 @@ static int btrfs_defrag_file(struct file *file,
		total_read++;
		mutex_lock(&inode->i_mutex);
		if (range->flags & BTRFS_DEFRAG_RANGE_COMPRESS)
			BTRFS_I(inode)->force_compress = BTRFS_COMPRESS_ZLIB;
			BTRFS_I(inode)->force_compress = compress_type;

		ret  = btrfs_delalloc_reserve_space(inode, PAGE_CACHE_SIZE);
		if (ret)
@@ -785,6 +795,13 @@ loop_unlock:
		mutex_unlock(&inode->i_mutex);
	}

	disk_super = &root->fs_info->super_copy;
	features = btrfs_super_incompat_flags(disk_super);
	if (range->compress_type == BTRFS_COMPRESS_LZO) {
		features |= BTRFS_FEATURE_INCOMPAT_COMPRESS_LZO;
		btrfs_set_super_incompat_flags(disk_super, features);
	}

	return 0;

err_reservations:
+8 −1
Original line number Diff line number Diff line
@@ -133,8 +133,15 @@ struct btrfs_ioctl_defrag_range_args {
	 */
	__u32 extent_thresh;

	/*
	 * which compression method to use if turning on compression
	 * for this defrag operation.  If unspecified, zlib will
	 * be used
	 */
	__u32 compress_type;

	/* spare for later */
	__u32 unused[5];
	__u32 unused[4];
};

struct btrfs_ioctl_space_info {