diff options
-rw-r--r-- | fs/ext4/dir.c | 2 | ||||
-rw-r--r-- | fs/ext4/ext4.h | 22 | ||||
-rw-r--r-- | fs/ext4/extents.c | 22 | ||||
-rw-r--r-- | fs/ext4/inode.c | 57 |
4 files changed, 57 insertions, 46 deletions
diff --git a/fs/ext4/dir.c b/fs/ext4/dir.c index 052d6378f997..9dc93168e262 100644 --- a/fs/ext4/dir.c +++ b/fs/ext4/dir.c | |||
@@ -131,7 +131,7 @@ static int ext4_readdir(struct file *filp, | |||
131 | struct buffer_head *bh = NULL; | 131 | struct buffer_head *bh = NULL; |
132 | 132 | ||
133 | map_bh.b_state = 0; | 133 | map_bh.b_state = 0; |
134 | err = ext4_get_blocks(NULL, inode, blk, 1, &map_bh, 0, 0, 0); | 134 | err = ext4_get_blocks(NULL, inode, blk, 1, &map_bh, 0); |
135 | if (err > 0) { | 135 | if (err > 0) { |
136 | pgoff_t index = map_bh.b_blocknr >> | 136 | pgoff_t index = map_bh.b_blocknr >> |
137 | (PAGE_CACHE_SHIFT - inode->i_blkbits); | 137 | (PAGE_CACHE_SHIFT - inode->i_blkbits); |
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index 5dc8368e46bc..17feb4ac633a 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h | |||
@@ -314,10 +314,20 @@ struct ext4_new_group_data { | |||
314 | }; | 314 | }; |
315 | 315 | ||
316 | /* | 316 | /* |
317 | * Following is used by preallocation code to tell get_blocks() that we | 317 | * Flags used by ext4_get_blocks() |
318 | * want uninitialzed extents. | ||
319 | */ | 318 | */ |
320 | #define EXT4_CREATE_UNINITIALIZED_EXT 2 | 319 | /* Allocate any needed blocks and/or convert an unitialized |
320 | extent to be an initialized ext4 */ | ||
321 | #define EXT4_GET_BLOCKS_CREATE 1 | ||
322 | /* Request the creation of an unitialized extent */ | ||
323 | #define EXT4_GET_BLOCKS_UNINIT_EXT 2 | ||
324 | #define EXT4_GET_BLOCKS_CREATE_UNINIT_EXT (EXT4_GET_BLOCKS_UNINIT_EXT|\ | ||
325 | EXT4_GET_BLOCKS_CREATE) | ||
326 | /* Update the ext4_inode_info i_disksize field */ | ||
327 | #define EXT4_GET_BLOCKS_EXTEND_DISKSIZE 4 | ||
328 | /* Caller is from the delayed allocation writeout path, | ||
329 | so the filesystem blocks have already been accounted for */ | ||
330 | #define EXT4_GET_BLOCKS_DELALLOC_RESERVE 8 | ||
321 | 331 | ||
322 | /* | 332 | /* |
323 | * ioctl commands | 333 | * ioctl commands |
@@ -1610,8 +1620,7 @@ extern int ext4_ext_index_trans_blocks(struct inode *inode, int nrblocks, | |||
1610 | int chunk); | 1620 | int chunk); |
1611 | extern int ext4_ext_get_blocks(handle_t *handle, struct inode *inode, | 1621 | extern int ext4_ext_get_blocks(handle_t *handle, struct inode *inode, |
1612 | ext4_lblk_t iblock, unsigned int max_blocks, | 1622 | ext4_lblk_t iblock, unsigned int max_blocks, |
1613 | struct buffer_head *bh_result, | 1623 | struct buffer_head *bh_result, int flags); |
1614 | int create, int extend_disksize); | ||
1615 | extern void ext4_ext_truncate(struct inode *); | 1624 | extern void ext4_ext_truncate(struct inode *); |
1616 | extern void ext4_ext_init(struct super_block *); | 1625 | extern void ext4_ext_init(struct super_block *); |
1617 | extern void ext4_ext_release(struct super_block *); | 1626 | extern void ext4_ext_release(struct super_block *); |
@@ -1619,8 +1628,7 @@ extern long ext4_fallocate(struct inode *inode, int mode, loff_t offset, | |||
1619 | loff_t len); | 1628 | loff_t len); |
1620 | extern int ext4_get_blocks(handle_t *handle, struct inode *inode, | 1629 | extern int ext4_get_blocks(handle_t *handle, struct inode *inode, |
1621 | sector_t block, unsigned int max_blocks, | 1630 | sector_t block, unsigned int max_blocks, |
1622 | struct buffer_head *bh, int create, | 1631 | struct buffer_head *bh, int flags); |
1623 | int extend_disksize, int flag); | ||
1624 | extern int ext4_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, | 1632 | extern int ext4_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, |
1625 | __u64 start, __u64 len); | 1633 | __u64 start, __u64 len); |
1626 | 1634 | ||
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index 7e7d02dd2739..27c383c7b43c 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c | |||
@@ -2784,7 +2784,7 @@ fix_extent_len: | |||
2784 | int ext4_ext_get_blocks(handle_t *handle, struct inode *inode, | 2784 | int ext4_ext_get_blocks(handle_t *handle, struct inode *inode, |
2785 | ext4_lblk_t iblock, | 2785 | ext4_lblk_t iblock, |
2786 | unsigned int max_blocks, struct buffer_head *bh_result, | 2786 | unsigned int max_blocks, struct buffer_head *bh_result, |
2787 | int create, int extend_disksize) | 2787 | int flags) |
2788 | { | 2788 | { |
2789 | struct ext4_ext_path *path = NULL; | 2789 | struct ext4_ext_path *path = NULL; |
2790 | struct ext4_extent_header *eh; | 2790 | struct ext4_extent_header *eh; |
@@ -2803,7 +2803,7 @@ int ext4_ext_get_blocks(handle_t *handle, struct inode *inode, | |||
2803 | cache_type = ext4_ext_in_cache(inode, iblock, &newex); | 2803 | cache_type = ext4_ext_in_cache(inode, iblock, &newex); |
2804 | if (cache_type) { | 2804 | if (cache_type) { |
2805 | if (cache_type == EXT4_EXT_CACHE_GAP) { | 2805 | if (cache_type == EXT4_EXT_CACHE_GAP) { |
2806 | if (!create) { | 2806 | if ((flags & EXT4_GET_BLOCKS_CREATE) == 0) { |
2807 | /* | 2807 | /* |
2808 | * block isn't allocated yet and | 2808 | * block isn't allocated yet and |
2809 | * user doesn't want to allocate it | 2809 | * user doesn't want to allocate it |
@@ -2869,9 +2869,9 @@ int ext4_ext_get_blocks(handle_t *handle, struct inode *inode, | |||
2869 | EXT4_EXT_CACHE_EXTENT); | 2869 | EXT4_EXT_CACHE_EXTENT); |
2870 | goto out; | 2870 | goto out; |
2871 | } | 2871 | } |
2872 | if (create == EXT4_CREATE_UNINITIALIZED_EXT) | 2872 | if (flags & EXT4_GET_BLOCKS_UNINIT_EXT) |
2873 | goto out; | 2873 | goto out; |
2874 | if (!create) { | 2874 | if ((flags & EXT4_GET_BLOCKS_CREATE) == 0) { |
2875 | if (allocated > max_blocks) | 2875 | if (allocated > max_blocks) |
2876 | allocated = max_blocks; | 2876 | allocated = max_blocks; |
2877 | /* | 2877 | /* |
@@ -2903,7 +2903,7 @@ int ext4_ext_get_blocks(handle_t *handle, struct inode *inode, | |||
2903 | * requested block isn't allocated yet; | 2903 | * requested block isn't allocated yet; |
2904 | * we couldn't try to create block if create flag is zero | 2904 | * we couldn't try to create block if create flag is zero |
2905 | */ | 2905 | */ |
2906 | if (!create) { | 2906 | if ((flags & EXT4_GET_BLOCKS_CREATE) == 0) { |
2907 | /* | 2907 | /* |
2908 | * put just found gap into cache to speed up | 2908 | * put just found gap into cache to speed up |
2909 | * subsequent requests | 2909 | * subsequent requests |
@@ -2932,10 +2932,10 @@ int ext4_ext_get_blocks(handle_t *handle, struct inode *inode, | |||
2932 | * EXT_UNINIT_MAX_LEN. | 2932 | * EXT_UNINIT_MAX_LEN. |
2933 | */ | 2933 | */ |
2934 | if (max_blocks > EXT_INIT_MAX_LEN && | 2934 | if (max_blocks > EXT_INIT_MAX_LEN && |
2935 | create != EXT4_CREATE_UNINITIALIZED_EXT) | 2935 | !(flags & EXT4_GET_BLOCKS_UNINIT_EXT)) |
2936 | max_blocks = EXT_INIT_MAX_LEN; | 2936 | max_blocks = EXT_INIT_MAX_LEN; |
2937 | else if (max_blocks > EXT_UNINIT_MAX_LEN && | 2937 | else if (max_blocks > EXT_UNINIT_MAX_LEN && |
2938 | create == EXT4_CREATE_UNINITIALIZED_EXT) | 2938 | (flags & EXT4_GET_BLOCKS_UNINIT_EXT)) |
2939 | max_blocks = EXT_UNINIT_MAX_LEN; | 2939 | max_blocks = EXT_UNINIT_MAX_LEN; |
2940 | 2940 | ||
2941 | /* Check if we can really insert (iblock)::(iblock+max_blocks) extent */ | 2941 | /* Check if we can really insert (iblock)::(iblock+max_blocks) extent */ |
@@ -2966,7 +2966,7 @@ int ext4_ext_get_blocks(handle_t *handle, struct inode *inode, | |||
2966 | /* try to insert new extent into found leaf and return */ | 2966 | /* try to insert new extent into found leaf and return */ |
2967 | ext4_ext_store_pblock(&newex, newblock); | 2967 | ext4_ext_store_pblock(&newex, newblock); |
2968 | newex.ee_len = cpu_to_le16(ar.len); | 2968 | newex.ee_len = cpu_to_le16(ar.len); |
2969 | if (create == EXT4_CREATE_UNINITIALIZED_EXT) /* Mark uninitialized */ | 2969 | if (flags & EXT4_GET_BLOCKS_UNINIT_EXT) /* Mark uninitialized */ |
2970 | ext4_ext_mark_uninitialized(&newex); | 2970 | ext4_ext_mark_uninitialized(&newex); |
2971 | err = ext4_ext_insert_extent(handle, inode, path, &newex); | 2971 | err = ext4_ext_insert_extent(handle, inode, path, &newex); |
2972 | if (err) { | 2972 | if (err) { |
@@ -2983,7 +2983,7 @@ int ext4_ext_get_blocks(handle_t *handle, struct inode *inode, | |||
2983 | newblock = ext_pblock(&newex); | 2983 | newblock = ext_pblock(&newex); |
2984 | allocated = ext4_ext_get_actual_len(&newex); | 2984 | allocated = ext4_ext_get_actual_len(&newex); |
2985 | outnew: | 2985 | outnew: |
2986 | if (extend_disksize) { | 2986 | if (flags & EXT4_GET_BLOCKS_EXTEND_DISKSIZE) { |
2987 | disksize = ((loff_t) iblock + ar.len) << inode->i_blkbits; | 2987 | disksize = ((loff_t) iblock + ar.len) << inode->i_blkbits; |
2988 | if (disksize > i_size_read(inode)) | 2988 | if (disksize > i_size_read(inode)) |
2989 | disksize = i_size_read(inode); | 2989 | disksize = i_size_read(inode); |
@@ -2994,7 +2994,7 @@ outnew: | |||
2994 | set_buffer_new(bh_result); | 2994 | set_buffer_new(bh_result); |
2995 | 2995 | ||
2996 | /* Cache only when it is _not_ an uninitialized extent */ | 2996 | /* Cache only when it is _not_ an uninitialized extent */ |
2997 | if (create != EXT4_CREATE_UNINITIALIZED_EXT) | 2997 | if ((flags & EXT4_GET_BLOCKS_UNINIT_EXT) == 0) |
2998 | ext4_ext_put_in_cache(inode, iblock, allocated, newblock, | 2998 | ext4_ext_put_in_cache(inode, iblock, allocated, newblock, |
2999 | EXT4_EXT_CACHE_EXTENT); | 2999 | EXT4_EXT_CACHE_EXTENT); |
3000 | out: | 3000 | out: |
@@ -3153,7 +3153,7 @@ retry: | |||
3153 | map_bh.b_state = 0; | 3153 | map_bh.b_state = 0; |
3154 | ret = ext4_get_blocks(handle, inode, block, | 3154 | ret = ext4_get_blocks(handle, inode, block, |
3155 | max_blocks, &map_bh, | 3155 | max_blocks, &map_bh, |
3156 | EXT4_CREATE_UNINITIALIZED_EXT, 0, 0); | 3156 | EXT4_GET_BLOCKS_CREATE_UNINIT_EXT); |
3157 | if (ret <= 0) { | 3157 | if (ret <= 0) { |
3158 | #ifdef EXT4FS_DEBUG | 3158 | #ifdef EXT4FS_DEBUG |
3159 | WARN_ON(ret <= 0); | 3159 | WARN_ON(ret <= 0); |
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index a9a9b9b77e8e..8b7564dfacdf 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c | |||
@@ -917,7 +917,7 @@ err_out: | |||
917 | static int ext4_ind_get_blocks(handle_t *handle, struct inode *inode, | 917 | static int ext4_ind_get_blocks(handle_t *handle, struct inode *inode, |
918 | ext4_lblk_t iblock, unsigned int maxblocks, | 918 | ext4_lblk_t iblock, unsigned int maxblocks, |
919 | struct buffer_head *bh_result, | 919 | struct buffer_head *bh_result, |
920 | int create, int extend_disksize) | 920 | int flags) |
921 | { | 921 | { |
922 | int err = -EIO; | 922 | int err = -EIO; |
923 | ext4_lblk_t offsets[4]; | 923 | ext4_lblk_t offsets[4]; |
@@ -934,7 +934,7 @@ static int ext4_ind_get_blocks(handle_t *handle, struct inode *inode, | |||
934 | 934 | ||
935 | 935 | ||
936 | J_ASSERT(!(EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL)); | 936 | J_ASSERT(!(EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL)); |
937 | J_ASSERT(handle != NULL || create == 0); | 937 | J_ASSERT(handle != NULL || (flags & EXT4_GET_BLOCKS_CREATE) == 0); |
938 | depth = ext4_block_to_path(inode, iblock, offsets, | 938 | depth = ext4_block_to_path(inode, iblock, offsets, |
939 | &blocks_to_boundary); | 939 | &blocks_to_boundary); |
940 | 940 | ||
@@ -963,7 +963,7 @@ static int ext4_ind_get_blocks(handle_t *handle, struct inode *inode, | |||
963 | } | 963 | } |
964 | 964 | ||
965 | /* Next simple case - plain lookup or failed read of indirect block */ | 965 | /* Next simple case - plain lookup or failed read of indirect block */ |
966 | if (!create || err == -EIO) | 966 | if ((flags & EXT4_GET_BLOCKS_CREATE) == 0 || err == -EIO) |
967 | goto cleanup; | 967 | goto cleanup; |
968 | 968 | ||
969 | /* | 969 | /* |
@@ -1002,7 +1002,7 @@ static int ext4_ind_get_blocks(handle_t *handle, struct inode *inode, | |||
1002 | * protect it if you're about to implement concurrent | 1002 | * protect it if you're about to implement concurrent |
1003 | * ext4_get_block() -bzzz | 1003 | * ext4_get_block() -bzzz |
1004 | */ | 1004 | */ |
1005 | if (!err && extend_disksize) { | 1005 | if (!err && (flags & EXT4_GET_BLOCKS_EXTEND_DISKSIZE)) { |
1006 | disksize = ((loff_t) iblock + count) << inode->i_blkbits; | 1006 | disksize = ((loff_t) iblock + count) << inode->i_blkbits; |
1007 | if (disksize > i_size_read(inode)) | 1007 | if (disksize > i_size_read(inode)) |
1008 | disksize = i_size_read(inode); | 1008 | disksize = i_size_read(inode); |
@@ -1144,7 +1144,7 @@ static void ext4_da_update_reserve_space(struct inode *inode, int used) | |||
1144 | */ | 1144 | */ |
1145 | int ext4_get_blocks(handle_t *handle, struct inode *inode, sector_t block, | 1145 | int ext4_get_blocks(handle_t *handle, struct inode *inode, sector_t block, |
1146 | unsigned int max_blocks, struct buffer_head *bh, | 1146 | unsigned int max_blocks, struct buffer_head *bh, |
1147 | int create, int extend_disksize, int flag) | 1147 | int flags) |
1148 | { | 1148 | { |
1149 | int retval; | 1149 | int retval; |
1150 | 1150 | ||
@@ -1158,15 +1158,15 @@ int ext4_get_blocks(handle_t *handle, struct inode *inode, sector_t block, | |||
1158 | down_read((&EXT4_I(inode)->i_data_sem)); | 1158 | down_read((&EXT4_I(inode)->i_data_sem)); |
1159 | if (EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL) { | 1159 | if (EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL) { |
1160 | retval = ext4_ext_get_blocks(handle, inode, block, max_blocks, | 1160 | retval = ext4_ext_get_blocks(handle, inode, block, max_blocks, |
1161 | bh, 0, 0); | 1161 | bh, 0); |
1162 | } else { | 1162 | } else { |
1163 | retval = ext4_ind_get_blocks(handle, inode, block, max_blocks, | 1163 | retval = ext4_ind_get_blocks(handle, inode, block, max_blocks, |
1164 | bh, 0, 0); | 1164 | bh, 0); |
1165 | } | 1165 | } |
1166 | up_read((&EXT4_I(inode)->i_data_sem)); | 1166 | up_read((&EXT4_I(inode)->i_data_sem)); |
1167 | 1167 | ||
1168 | /* If it is only a block(s) look up */ | 1168 | /* If it is only a block(s) look up */ |
1169 | if (!create) | 1169 | if ((flags & EXT4_GET_BLOCKS_CREATE) == 0) |
1170 | return retval; | 1170 | return retval; |
1171 | 1171 | ||
1172 | /* | 1172 | /* |
@@ -1205,7 +1205,7 @@ int ext4_get_blocks(handle_t *handle, struct inode *inode, sector_t block, | |||
1205 | * let the underlying get_block() function know to | 1205 | * let the underlying get_block() function know to |
1206 | * avoid double accounting | 1206 | * avoid double accounting |
1207 | */ | 1207 | */ |
1208 | if (flag) | 1208 | if (flags & EXT4_GET_BLOCKS_DELALLOC_RESERVE) |
1209 | EXT4_I(inode)->i_delalloc_reserved_flag = 1; | 1209 | EXT4_I(inode)->i_delalloc_reserved_flag = 1; |
1210 | /* | 1210 | /* |
1211 | * We need to check for EXT4 here because migrate | 1211 | * We need to check for EXT4 here because migrate |
@@ -1213,10 +1213,10 @@ int ext4_get_blocks(handle_t *handle, struct inode *inode, sector_t block, | |||
1213 | */ | 1213 | */ |
1214 | if (EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL) { | 1214 | if (EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL) { |
1215 | retval = ext4_ext_get_blocks(handle, inode, block, max_blocks, | 1215 | retval = ext4_ext_get_blocks(handle, inode, block, max_blocks, |
1216 | bh, create, extend_disksize); | 1216 | bh, flags); |
1217 | } else { | 1217 | } else { |
1218 | retval = ext4_ind_get_blocks(handle, inode, block, | 1218 | retval = ext4_ind_get_blocks(handle, inode, block, |
1219 | max_blocks, bh, create, extend_disksize); | 1219 | max_blocks, bh, flags); |
1220 | 1220 | ||
1221 | if (retval > 0 && buffer_new(bh)) { | 1221 | if (retval > 0 && buffer_new(bh)) { |
1222 | /* | 1222 | /* |
@@ -1229,7 +1229,7 @@ int ext4_get_blocks(handle_t *handle, struct inode *inode, sector_t block, | |||
1229 | } | 1229 | } |
1230 | } | 1230 | } |
1231 | 1231 | ||
1232 | if (flag) { | 1232 | if (flags & EXT4_GET_BLOCKS_DELALLOC_RESERVE) { |
1233 | EXT4_I(inode)->i_delalloc_reserved_flag = 0; | 1233 | EXT4_I(inode)->i_delalloc_reserved_flag = 0; |
1234 | /* | 1234 | /* |
1235 | * Update reserved blocks/metadata blocks | 1235 | * Update reserved blocks/metadata blocks |
@@ -1269,7 +1269,7 @@ int ext4_get_block(struct inode *inode, sector_t iblock, | |||
1269 | } | 1269 | } |
1270 | 1270 | ||
1271 | ret = ext4_get_blocks(handle, inode, iblock, max_blocks, bh_result, | 1271 | ret = ext4_get_blocks(handle, inode, iblock, max_blocks, bh_result, |
1272 | create, 0, 0); | 1272 | create ? EXT4_GET_BLOCKS_CREATE : 0); |
1273 | if (ret > 0) { | 1273 | if (ret > 0) { |
1274 | bh_result->b_size = (ret << inode->i_blkbits); | 1274 | bh_result->b_size = (ret << inode->i_blkbits); |
1275 | ret = 0; | 1275 | ret = 0; |
@@ -1288,16 +1288,19 @@ struct buffer_head *ext4_getblk(handle_t *handle, struct inode *inode, | |||
1288 | { | 1288 | { |
1289 | struct buffer_head dummy; | 1289 | struct buffer_head dummy; |
1290 | int fatal = 0, err; | 1290 | int fatal = 0, err; |
1291 | int flags = EXT4_GET_BLOCKS_EXTEND_DISKSIZE; | ||
1291 | 1292 | ||
1292 | J_ASSERT(handle != NULL || create == 0); | 1293 | J_ASSERT(handle != NULL || create == 0); |
1293 | 1294 | ||
1294 | dummy.b_state = 0; | 1295 | dummy.b_state = 0; |
1295 | dummy.b_blocknr = -1000; | 1296 | dummy.b_blocknr = -1000; |
1296 | buffer_trace_init(&dummy.b_history); | 1297 | buffer_trace_init(&dummy.b_history); |
1297 | err = ext4_get_blocks(handle, inode, block, 1, &dummy, create, 1, 0); | 1298 | if (create) |
1299 | flags |= EXT4_GET_BLOCKS_CREATE; | ||
1300 | err = ext4_get_blocks(handle, inode, block, 1, &dummy, flags); | ||
1298 | /* | 1301 | /* |
1299 | * ext4_get_blocks() returns number of blocks | 1302 | * ext4_get_blocks() returns number of blocks mapped. 0 in |
1300 | * mapped. 0 in case of a HOLE. | 1303 | * case of a HOLE. |
1301 | */ | 1304 | */ |
1302 | if (err > 0) { | 1305 | if (err > 0) { |
1303 | if (err > 1) | 1306 | if (err > 1) |
@@ -1997,7 +2000,6 @@ static void ext4_print_free_blocks(struct inode *inode) | |||
1997 | return; | 2000 | return; |
1998 | } | 2001 | } |
1999 | 2002 | ||
2000 | #define EXT4_DELALLOC_RSVED 1 | ||
2001 | static int ext4_da_get_block_write(struct inode *inode, sector_t iblock, | 2003 | static int ext4_da_get_block_write(struct inode *inode, sector_t iblock, |
2002 | struct buffer_head *bh_result) | 2004 | struct buffer_head *bh_result) |
2003 | { | 2005 | { |
@@ -2009,7 +2011,8 @@ static int ext4_da_get_block_write(struct inode *inode, sector_t iblock, | |||
2009 | handle = ext4_journal_current_handle(); | 2011 | handle = ext4_journal_current_handle(); |
2010 | BUG_ON(!handle); | 2012 | BUG_ON(!handle); |
2011 | ret = ext4_get_blocks(handle, inode, iblock, max_blocks, | 2013 | ret = ext4_get_blocks(handle, inode, iblock, max_blocks, |
2012 | bh_result, 1, 0, EXT4_DELALLOC_RSVED); | 2014 | bh_result, EXT4_GET_BLOCKS_CREATE| |
2015 | EXT4_GET_BLOCKS_DELALLOC_RESERVE); | ||
2013 | if (ret <= 0) | 2016 | if (ret <= 0) |
2014 | return ret; | 2017 | return ret; |
2015 | 2018 | ||
@@ -2065,16 +2068,17 @@ static int mpage_da_map_blocks(struct mpage_da_data *mpd) | |||
2065 | return 0; | 2068 | return 0; |
2066 | /* | 2069 | /* |
2067 | * We need to make sure the BH_Delay flag is passed down to | 2070 | * We need to make sure the BH_Delay flag is passed down to |
2068 | * ext4_da_get_block_write(), since it calls | 2071 | * ext4_da_get_block_write(), since it calls ext4_get_blocks() |
2069 | * ext4_get_blocks() with the EXT4_DELALLOC_RSVED flag. | 2072 | * with the EXT4_GET_BLOCKS_DELALLOC_RESERVE flag. This flag |
2070 | * This flag causes ext4_get_blocks() to call | 2073 | * causes ext4_get_blocks() to call |
2071 | * ext4_da_update_reserve_space() if the passed buffer head | 2074 | * ext4_da_update_reserve_space() if the passed buffer head |
2072 | * has the BH_Delay flag set. In the future, once we clean up | 2075 | * has the BH_Delay flag set. In the future, once we clean up |
2073 | * the interfaces to ext4_get_blocks(), we should pass in | 2076 | * the interfaces to ext4_get_blocks(), we should pass in a |
2074 | * a separate flag which requests that the delayed allocation | 2077 | * separate flag which requests that the delayed allocation |
2075 | * statistics should be updated, instead of depending on the | 2078 | * statistics should be updated, instead of depending on the |
2076 | * state information getting passed down via the map_bh's | 2079 | * state information getting passed down via the map_bh's |
2077 | * state bitmasks plus the magic EXT4_DELALLOC_RSVED flag. | 2080 | * state bitmasks plus the magic |
2081 | * EXT4_GET_BLOCKS_DELALLOC_RESERVE flag. | ||
2078 | */ | 2082 | */ |
2079 | new.b_state = mpd->b_state & (1 << BH_Delay); | 2083 | new.b_state = mpd->b_state & (1 << BH_Delay); |
2080 | new.b_blocknr = 0; | 2084 | new.b_blocknr = 0; |
@@ -2362,7 +2366,7 @@ static int ext4_da_get_block_prep(struct inode *inode, sector_t iblock, | |||
2362 | * preallocated blocks are unmapped but should treated | 2366 | * preallocated blocks are unmapped but should treated |
2363 | * the same as allocated blocks. | 2367 | * the same as allocated blocks. |
2364 | */ | 2368 | */ |
2365 | ret = ext4_get_blocks(NULL, inode, iblock, 1, bh_result, 0, 0, 0); | 2369 | ret = ext4_get_blocks(NULL, inode, iblock, 1, bh_result, 0); |
2366 | if ((ret == 0) && !buffer_delay(bh_result)) { | 2370 | if ((ret == 0) && !buffer_delay(bh_result)) { |
2367 | /* the block isn't (pre)allocated yet, let's reserve space */ | 2371 | /* the block isn't (pre)allocated yet, let's reserve space */ |
2368 | /* | 2372 | /* |
@@ -2406,8 +2410,7 @@ static int ext4_normal_get_block_write(struct inode *inode, sector_t iblock, | |||
2406 | * we don't want to do block allocation in writepage | 2410 | * we don't want to do block allocation in writepage |
2407 | * so call get_block_wrap with create = 0 | 2411 | * so call get_block_wrap with create = 0 |
2408 | */ | 2412 | */ |
2409 | ret = ext4_get_blocks(NULL, inode, iblock, max_blocks, | 2413 | ret = ext4_get_blocks(NULL, inode, iblock, max_blocks, bh_result, 0); |
2410 | bh_result, 0, 0, 0); | ||
2411 | if (ret > 0) { | 2414 | if (ret > 0) { |
2412 | bh_result->b_size = (ret << inode->i_blkbits); | 2415 | bh_result->b_size = (ret << inode->i_blkbits); |
2413 | ret = 0; | 2416 | ret = 0; |