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

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
...@@ -638,9 +638,11 @@ static int btrfs_defrag_file(struct file *file, ...@@ -638,9 +638,11 @@ static int btrfs_defrag_file(struct file *file,
struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree; struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree;
struct btrfs_ordered_extent *ordered; struct btrfs_ordered_extent *ordered;
struct page *page; struct page *page;
struct btrfs_super_block *disk_super;
unsigned long last_index; unsigned long last_index;
unsigned long ra_pages = root->fs_info->bdi.ra_pages; unsigned long ra_pages = root->fs_info->bdi.ra_pages;
unsigned long total_read = 0; unsigned long total_read = 0;
u64 features;
u64 page_start; u64 page_start;
u64 page_end; u64 page_end;
u64 last_len = 0; u64 last_len = 0;
...@@ -648,6 +650,14 @@ static int btrfs_defrag_file(struct file *file, ...@@ -648,6 +650,14 @@ static int btrfs_defrag_file(struct file *file,
u64 defrag_end = 0; u64 defrag_end = 0;
unsigned long i; unsigned long i;
int ret; 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) if (inode->i_size == 0)
return 0; return 0;
...@@ -683,7 +693,7 @@ static int btrfs_defrag_file(struct file *file, ...@@ -683,7 +693,7 @@ static int btrfs_defrag_file(struct file *file,
total_read++; total_read++;
mutex_lock(&inode->i_mutex); mutex_lock(&inode->i_mutex);
if (range->flags & BTRFS_DEFRAG_RANGE_COMPRESS) 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); ret = btrfs_delalloc_reserve_space(inode, PAGE_CACHE_SIZE);
if (ret) if (ret)
...@@ -785,6 +795,13 @@ static int btrfs_defrag_file(struct file *file, ...@@ -785,6 +795,13 @@ static int btrfs_defrag_file(struct file *file,
mutex_unlock(&inode->i_mutex); 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; return 0;
err_reservations: err_reservations:
......
...@@ -133,8 +133,15 @@ struct btrfs_ioctl_defrag_range_args { ...@@ -133,8 +133,15 @@ struct btrfs_ioctl_defrag_range_args {
*/ */
__u32 extent_thresh; __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 */ /* spare for later */
__u32 unused[5]; __u32 unused[4];
}; };
struct btrfs_ioctl_space_info { struct btrfs_ioctl_space_info {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment