| From 10ea35c834241a2400b470cf574105e9cf3a9679 Mon Sep 17 00:00:00 2001 |
| From: Akira Fujita <a-fujita@rs.jp.nec.com> |
| Date: Tue, 24 Nov 2009 10:31:56 -0500 |
| Subject: [PATCH 75/85] ext4: move_extent_per_page() cleanup |
| |
| (cherry picked from commit ac48b0a1d068887141581bea8285de5fcab182b0) |
| |
| Integrate duplicate lines (acquire/release semaphore and invalidate |
| extent cache in move_extent_per_page()) into mext_replace_branches(), |
| to reduce source and object code size. |
| |
| Signed-off-by: Akira Fujita <a-fujita@rs.jp.nec.com> |
| Signed-off-by: "Theodore Ts'o" <tytso@mit.edu> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| --- |
| fs/ext4/move_extent.c | 30 +++++++++--------------------- |
| 1 file changed, 9 insertions(+), 21 deletions(-) |
| |
| --- a/fs/ext4/move_extent.c |
| +++ b/fs/ext4/move_extent.c |
| @@ -660,6 +660,9 @@ mext_replace_branches(handle_t *handle, |
| int replaced_count = 0; |
| int dext_alen; |
| |
| + /* Protect extent trees against block allocations via delalloc */ |
| + double_down_write_data_sem(orig_inode, donor_inode); |
| + |
| /* Get the original extent for the block "orig_off" */ |
| *err = get_ext_path(orig_inode, orig_off, &orig_path); |
| if (*err) |
| @@ -755,6 +758,11 @@ out: |
| kfree(donor_path); |
| } |
| |
| + ext4_ext_invalidate_cache(orig_inode); |
| + ext4_ext_invalidate_cache(donor_inode); |
| + |
| + double_up_write_data_sem(orig_inode, donor_inode); |
| + |
| return replaced_count; |
| } |
| |
| @@ -820,19 +828,9 @@ move_extent_per_page(struct file *o_filp |
| * Just swap data blocks between orig and donor. |
| */ |
| if (uninit) { |
| - /* |
| - * Protect extent trees against block allocations |
| - * via delalloc |
| - */ |
| - double_down_write_data_sem(orig_inode, donor_inode); |
| replaced_count = mext_replace_branches(handle, orig_inode, |
| donor_inode, orig_blk_offset, |
| block_len_in_page, err); |
| - |
| - /* Clear the inode cache not to refer to the old data */ |
| - ext4_ext_invalidate_cache(orig_inode); |
| - ext4_ext_invalidate_cache(donor_inode); |
| - double_up_write_data_sem(orig_inode, donor_inode); |
| goto out2; |
| } |
| |
| @@ -880,8 +878,6 @@ move_extent_per_page(struct file *o_filp |
| /* Release old bh and drop refs */ |
| try_to_release_page(page, 0); |
| |
| - /* Protect extent trees against block allocations via delalloc */ |
| - double_down_write_data_sem(orig_inode, donor_inode); |
| replaced_count = mext_replace_branches(handle, orig_inode, donor_inode, |
| orig_blk_offset, block_len_in_page, |
| &err2); |
| @@ -890,18 +886,10 @@ move_extent_per_page(struct file *o_filp |
| block_len_in_page = replaced_count; |
| replaced_size = |
| block_len_in_page << orig_inode->i_blkbits; |
| - } else { |
| - double_up_write_data_sem(orig_inode, donor_inode); |
| + } else |
| goto out; |
| - } |
| } |
| |
| - /* Clear the inode cache not to refer to the old data */ |
| - ext4_ext_invalidate_cache(orig_inode); |
| - ext4_ext_invalidate_cache(donor_inode); |
| - |
| - double_up_write_data_sem(orig_inode, donor_inode); |
| - |
| if (!page_has_buffers(page)) |
| create_empty_buffers(page, 1 << orig_inode->i_blkbits, 0); |
| |