diff options
Diffstat (limited to 'fs/ext4/extents.c')
-rw-r--r-- | fs/ext4/extents.c | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index 90ba8d9df697..c7f166ab50eb 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c | |||
@@ -1619,7 +1619,7 @@ int ext4_ext_insert_extent(handle_t *handle, struct inode *inode, | |||
1619 | BUG_ON(path[depth].p_hdr == NULL); | 1619 | BUG_ON(path[depth].p_hdr == NULL); |
1620 | 1620 | ||
1621 | /* try to insert block into found extent and return */ | 1621 | /* try to insert block into found extent and return */ |
1622 | if (ex && (flag != EXT4_GET_BLOCKS_PRE_IO) | 1622 | if (ex && !(flag & EXT4_GET_BLOCKS_PRE_IO) |
1623 | && ext4_can_extents_be_merged(inode, ex, newext)) { | 1623 | && ext4_can_extents_be_merged(inode, ex, newext)) { |
1624 | ext_debug("append [%d]%d block to %d:[%d]%d (from %llu)\n", | 1624 | ext_debug("append [%d]%d block to %d:[%d]%d (from %llu)\n", |
1625 | ext4_ext_is_uninitialized(newext), | 1625 | ext4_ext_is_uninitialized(newext), |
@@ -1740,7 +1740,7 @@ has_space: | |||
1740 | 1740 | ||
1741 | merge: | 1741 | merge: |
1742 | /* try to merge extents to the right */ | 1742 | /* try to merge extents to the right */ |
1743 | if (flag != EXT4_GET_BLOCKS_PRE_IO) | 1743 | if (!(flag & EXT4_GET_BLOCKS_PRE_IO)) |
1744 | ext4_ext_try_to_merge(inode, path, nearex); | 1744 | ext4_ext_try_to_merge(inode, path, nearex); |
1745 | 1745 | ||
1746 | /* try to merge extents to the left */ | 1746 | /* try to merge extents to the left */ |
@@ -3065,7 +3065,7 @@ ext4_ext_handle_uninitialized_extents(handle_t *handle, struct inode *inode, | |||
3065 | ext4_ext_show_leaf(inode, path); | 3065 | ext4_ext_show_leaf(inode, path); |
3066 | 3066 | ||
3067 | /* get_block() before submit the IO, split the extent */ | 3067 | /* get_block() before submit the IO, split the extent */ |
3068 | if (flags == EXT4_GET_BLOCKS_PRE_IO) { | 3068 | if ((flags & EXT4_GET_BLOCKS_PRE_IO)) { |
3069 | ret = ext4_split_unwritten_extents(handle, | 3069 | ret = ext4_split_unwritten_extents(handle, |
3070 | inode, path, iblock, | 3070 | inode, path, iblock, |
3071 | max_blocks, flags); | 3071 | max_blocks, flags); |
@@ -3078,10 +3078,12 @@ ext4_ext_handle_uninitialized_extents(handle_t *handle, struct inode *inode, | |||
3078 | io->flag = EXT4_IO_UNWRITTEN; | 3078 | io->flag = EXT4_IO_UNWRITTEN; |
3079 | else | 3079 | else |
3080 | ext4_set_inode_state(inode, EXT4_STATE_DIO_UNWRITTEN); | 3080 | ext4_set_inode_state(inode, EXT4_STATE_DIO_UNWRITTEN); |
3081 | if (ext4_should_dioread_nolock(inode)) | ||
3082 | set_buffer_uninit(bh_result); | ||
3081 | goto out; | 3083 | goto out; |
3082 | } | 3084 | } |
3083 | /* IO end_io complete, convert the filled extent to written */ | 3085 | /* IO end_io complete, convert the filled extent to written */ |
3084 | if (flags == EXT4_GET_BLOCKS_CONVERT) { | 3086 | if ((flags & EXT4_GET_BLOCKS_CONVERT)) { |
3085 | ret = ext4_convert_unwritten_extents_endio(handle, inode, | 3087 | ret = ext4_convert_unwritten_extents_endio(handle, inode, |
3086 | path); | 3088 | path); |
3087 | if (ret >= 0) | 3089 | if (ret >= 0) |
@@ -3351,21 +3353,21 @@ int ext4_ext_get_blocks(handle_t *handle, struct inode *inode, | |||
3351 | if (flags & EXT4_GET_BLOCKS_UNINIT_EXT){ | 3353 | if (flags & EXT4_GET_BLOCKS_UNINIT_EXT){ |
3352 | ext4_ext_mark_uninitialized(&newex); | 3354 | ext4_ext_mark_uninitialized(&newex); |
3353 | /* | 3355 | /* |
3354 | * io_end structure was created for every async | 3356 | * io_end structure was created for every IO write to an |
3355 | * direct IO write to the middle of the file. | 3357 | * uninitialized extent. To avoid unecessary conversion, |
3356 | * To avoid unecessary convertion for every aio dio rewrite | 3358 | * here we flag the IO that really needs the conversion. |
3357 | * to the mid of file, here we flag the IO that is really | ||
3358 | * need the convertion. | ||
3359 | * For non asycn direct IO case, flag the inode state | 3359 | * For non asycn direct IO case, flag the inode state |
3360 | * that we need to perform convertion when IO is done. | 3360 | * that we need to perform convertion when IO is done. |
3361 | */ | 3361 | */ |
3362 | if (flags == EXT4_GET_BLOCKS_PRE_IO) { | 3362 | if ((flags & EXT4_GET_BLOCKS_PRE_IO)) { |
3363 | if (io) | 3363 | if (io) |
3364 | io->flag = EXT4_IO_UNWRITTEN; | 3364 | io->flag = EXT4_IO_UNWRITTEN; |
3365 | else | 3365 | else |
3366 | ext4_set_inode_state(inode, | 3366 | ext4_set_inode_state(inode, |
3367 | EXT4_STATE_DIO_UNWRITTEN); | 3367 | EXT4_STATE_DIO_UNWRITTEN); |
3368 | } | 3368 | } |
3369 | if (ext4_should_dioread_nolock(inode)) | ||
3370 | set_buffer_uninit(bh_result); | ||
3369 | } | 3371 | } |
3370 | 3372 | ||
3371 | if (unlikely(EXT4_I(inode)->i_flags & EXT4_EOFBLOCKS_FL)) { | 3373 | if (unlikely(EXT4_I(inode)->i_flags & EXT4_EOFBLOCKS_FL)) { |