diff options
-rw-r--r-- | fs/ext4/ext4.h | 6 | ||||
-rw-r--r-- | fs/ext4/extents.c | 9 | ||||
-rw-r--r-- | fs/ext4/inode.c | 23 |
3 files changed, 5 insertions, 33 deletions
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index 4311cc85b534..59657ff7b8f4 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h | |||
@@ -323,15 +323,13 @@ struct ext4_new_group_data { | |||
323 | #define EXT4_GET_BLOCKS_UNINIT_EXT 0x0002 | 323 | #define EXT4_GET_BLOCKS_UNINIT_EXT 0x0002 |
324 | #define EXT4_GET_BLOCKS_CREATE_UNINIT_EXT (EXT4_GET_BLOCKS_UNINIT_EXT|\ | 324 | #define EXT4_GET_BLOCKS_CREATE_UNINIT_EXT (EXT4_GET_BLOCKS_UNINIT_EXT|\ |
325 | EXT4_GET_BLOCKS_CREATE) | 325 | EXT4_GET_BLOCKS_CREATE) |
326 | /* Update the ext4_inode_info i_disksize field */ | ||
327 | #define EXT4_GET_BLOCKS_EXTEND_DISKSIZE 0x0004 | ||
328 | /* Caller is from the delayed allocation writeout path, | 326 | /* Caller is from the delayed allocation writeout path, |
329 | so set the magic i_delalloc_reserve_flag after taking the | 327 | so set the magic i_delalloc_reserve_flag after taking the |
330 | inode allocation semaphore for */ | 328 | inode allocation semaphore for */ |
331 | #define EXT4_GET_BLOCKS_DELALLOC_RESERVE 0x0008 | 329 | #define EXT4_GET_BLOCKS_DELALLOC_RESERVE 0x0004 |
332 | /* Call ext4_da_update_reserve_space() after successfully | 330 | /* Call ext4_da_update_reserve_space() after successfully |
333 | allocating the blocks */ | 331 | allocating the blocks */ |
334 | #define EXT4_GET_BLOCKS_UPDATE_RESERVE_SPACE 0x0010 | 332 | #define EXT4_GET_BLOCKS_UPDATE_RESERVE_SPACE 0x0008 |
335 | 333 | ||
336 | 334 | ||
337 | /* | 335 | /* |
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index d4e99e96fddb..9c35a7b1f0ae 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c | |||
@@ -2779,7 +2779,6 @@ int ext4_ext_get_blocks(handle_t *handle, struct inode *inode, | |||
2779 | int err = 0, depth, ret, cache_type; | 2779 | int err = 0, depth, ret, cache_type; |
2780 | unsigned int allocated = 0; | 2780 | unsigned int allocated = 0; |
2781 | struct ext4_allocation_request ar; | 2781 | struct ext4_allocation_request ar; |
2782 | loff_t disksize; | ||
2783 | 2782 | ||
2784 | __clear_bit(BH_New, &bh_result->b_state); | 2783 | __clear_bit(BH_New, &bh_result->b_state); |
2785 | ext_debug("blocks %u/%u requested for inode %u\n", | 2784 | ext_debug("blocks %u/%u requested for inode %u\n", |
@@ -2969,14 +2968,6 @@ int ext4_ext_get_blocks(handle_t *handle, struct inode *inode, | |||
2969 | newblock = ext_pblock(&newex); | 2968 | newblock = ext_pblock(&newex); |
2970 | allocated = ext4_ext_get_actual_len(&newex); | 2969 | allocated = ext4_ext_get_actual_len(&newex); |
2971 | outnew: | 2970 | outnew: |
2972 | if (flags & EXT4_GET_BLOCKS_EXTEND_DISKSIZE) { | ||
2973 | disksize = ((loff_t) iblock + ar.len) << inode->i_blkbits; | ||
2974 | if (disksize > i_size_read(inode)) | ||
2975 | disksize = i_size_read(inode); | ||
2976 | if (disksize > EXT4_I(inode)->i_disksize) | ||
2977 | EXT4_I(inode)->i_disksize = disksize; | ||
2978 | } | ||
2979 | |||
2980 | set_buffer_new(bh_result); | 2971 | set_buffer_new(bh_result); |
2981 | 2972 | ||
2982 | /* Cache only when it is _not_ an uninitialized extent */ | 2973 | /* Cache only when it is _not_ an uninitialized extent */ |
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 14c00fff3713..17ed0d244dbb 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c | |||
@@ -933,11 +933,8 @@ static int ext4_ind_get_blocks(handle_t *handle, struct inode *inode, | |||
933 | int indirect_blks; | 933 | int indirect_blks; |
934 | int blocks_to_boundary = 0; | 934 | int blocks_to_boundary = 0; |
935 | int depth; | 935 | int depth; |
936 | struct ext4_inode_info *ei = EXT4_I(inode); | ||
937 | int count = 0; | 936 | int count = 0; |
938 | ext4_fsblk_t first_block = 0; | 937 | ext4_fsblk_t first_block = 0; |
939 | loff_t disksize; | ||
940 | |||
941 | 938 | ||
942 | J_ASSERT(!(EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL)); | 939 | J_ASSERT(!(EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL)); |
943 | J_ASSERT(handle != NULL || (flags & EXT4_GET_BLOCKS_CREATE) == 0); | 940 | J_ASSERT(handle != NULL || (flags & EXT4_GET_BLOCKS_CREATE) == 0); |
@@ -1003,19 +1000,7 @@ static int ext4_ind_get_blocks(handle_t *handle, struct inode *inode, | |||
1003 | if (!err) | 1000 | if (!err) |
1004 | err = ext4_splice_branch(handle, inode, iblock, | 1001 | err = ext4_splice_branch(handle, inode, iblock, |
1005 | partial, indirect_blks, count); | 1002 | partial, indirect_blks, count); |
1006 | /* | 1003 | else |
1007 | * i_disksize growing is protected by i_data_sem. Don't forget to | ||
1008 | * protect it if you're about to implement concurrent | ||
1009 | * ext4_get_block() -bzzz | ||
1010 | */ | ||
1011 | if (!err && (flags & EXT4_GET_BLOCKS_EXTEND_DISKSIZE)) { | ||
1012 | disksize = ((loff_t) iblock + count) << inode->i_blkbits; | ||
1013 | if (disksize > i_size_read(inode)) | ||
1014 | disksize = i_size_read(inode); | ||
1015 | if (disksize > ei->i_disksize) | ||
1016 | ei->i_disksize = disksize; | ||
1017 | } | ||
1018 | if (err) | ||
1019 | goto cleanup; | 1004 | goto cleanup; |
1020 | 1005 | ||
1021 | set_buffer_new(bh_result); | 1006 | set_buffer_new(bh_result); |
@@ -1321,7 +1306,7 @@ struct buffer_head *ext4_getblk(handle_t *handle, struct inode *inode, | |||
1321 | { | 1306 | { |
1322 | struct buffer_head dummy; | 1307 | struct buffer_head dummy; |
1323 | int fatal = 0, err; | 1308 | int fatal = 0, err; |
1324 | int flags = EXT4_GET_BLOCKS_EXTEND_DISKSIZE; | 1309 | int flags = 0; |
1325 | 1310 | ||
1326 | J_ASSERT(handle != NULL || create == 0); | 1311 | J_ASSERT(handle != NULL || create == 0); |
1327 | 1312 | ||
@@ -2153,9 +2138,7 @@ static int mpage_da_map_blocks(struct mpage_da_data *mpd) | |||
2153 | } | 2138 | } |
2154 | 2139 | ||
2155 | /* | 2140 | /* |
2156 | * Update on-disk size along with block allocation we don't | 2141 | * Update on-disk size along with block allocation. |
2157 | * use EXT4_GET_BLOCKS_EXTEND_DISKSIZE as size may change | ||
2158 | * within already allocated block -bzzz | ||
2159 | */ | 2142 | */ |
2160 | disksize = ((loff_t) next + blks) << mpd->inode->i_blkbits; | 2143 | disksize = ((loff_t) next + blks) << mpd->inode->i_blkbits; |
2161 | if (disksize > i_size_read(mpd->inode)) | 2144 | if (disksize > i_size_read(mpd->inode)) |