diff options
author | Li Zefan <lizf@cn.fujitsu.com> | 2010-10-25 03:12:50 -0400 |
---|---|---|
committer | Li Zefan <lizf@cn.fujitsu.com> | 2010-12-22 10:15:48 -0500 |
commit | 1a419d85a76853d7d04e9b6280a80e96770bf3e3 (patch) | |
tree | 01535c5571208561af5d475eaa151e1c2f936f57 /fs/btrfs/ioctl.c | |
parent | a6fa6fae40ec336c7df6155255ae64ebef43a8bc (diff) |
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: Li Zefan <lizf@cn.fujitsu.com>
Diffstat (limited to 'fs/btrfs/ioctl.c')
-rw-r--r-- | fs/btrfs/ioctl.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index 8cb86d4d763c..b6985d33eede 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c | |||
@@ -638,9 +638,11 @@ static int btrfs_defrag_file(struct file *file, | |||
638 | struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree; | 638 | struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree; |
639 | struct btrfs_ordered_extent *ordered; | 639 | struct btrfs_ordered_extent *ordered; |
640 | struct page *page; | 640 | struct page *page; |
641 | struct btrfs_super_block *disk_super; | ||
641 | unsigned long last_index; | 642 | unsigned long last_index; |
642 | unsigned long ra_pages = root->fs_info->bdi.ra_pages; | 643 | unsigned long ra_pages = root->fs_info->bdi.ra_pages; |
643 | unsigned long total_read = 0; | 644 | unsigned long total_read = 0; |
645 | u64 features; | ||
644 | u64 page_start; | 646 | u64 page_start; |
645 | u64 page_end; | 647 | u64 page_end; |
646 | u64 last_len = 0; | 648 | u64 last_len = 0; |
@@ -648,6 +650,14 @@ static int btrfs_defrag_file(struct file *file, | |||
648 | u64 defrag_end = 0; | 650 | u64 defrag_end = 0; |
649 | unsigned long i; | 651 | unsigned long i; |
650 | int ret; | 652 | int ret; |
653 | int compress_type = BTRFS_COMPRESS_ZLIB; | ||
654 | |||
655 | if (range->flags & BTRFS_DEFRAG_RANGE_COMPRESS) { | ||
656 | if (range->compress_type > BTRFS_COMPRESS_TYPES) | ||
657 | return -EINVAL; | ||
658 | if (range->compress_type) | ||
659 | compress_type = range->compress_type; | ||
660 | } | ||
651 | 661 | ||
652 | if (inode->i_size == 0) | 662 | if (inode->i_size == 0) |
653 | return 0; | 663 | return 0; |
@@ -683,7 +693,7 @@ static int btrfs_defrag_file(struct file *file, | |||
683 | total_read++; | 693 | total_read++; |
684 | mutex_lock(&inode->i_mutex); | 694 | mutex_lock(&inode->i_mutex); |
685 | if (range->flags & BTRFS_DEFRAG_RANGE_COMPRESS) | 695 | if (range->flags & BTRFS_DEFRAG_RANGE_COMPRESS) |
686 | BTRFS_I(inode)->force_compress = BTRFS_COMPRESS_ZLIB; | 696 | BTRFS_I(inode)->force_compress = compress_type; |
687 | 697 | ||
688 | ret = btrfs_delalloc_reserve_space(inode, PAGE_CACHE_SIZE); | 698 | ret = btrfs_delalloc_reserve_space(inode, PAGE_CACHE_SIZE); |
689 | if (ret) | 699 | if (ret) |
@@ -785,6 +795,13 @@ loop_unlock: | |||
785 | mutex_unlock(&inode->i_mutex); | 795 | mutex_unlock(&inode->i_mutex); |
786 | } | 796 | } |
787 | 797 | ||
798 | disk_super = &root->fs_info->super_copy; | ||
799 | features = btrfs_super_incompat_flags(disk_super); | ||
800 | if (range->compress_type == BTRFS_COMPRESS_LZO) { | ||
801 | features |= BTRFS_FEATURE_INCOMPAT_COMPRESS_LZO; | ||
802 | btrfs_set_super_incompat_flags(disk_super, features); | ||
803 | } | ||
804 | |||
788 | return 0; | 805 | return 0; |
789 | 806 | ||
790 | err_reservations: | 807 | err_reservations: |