Lines Matching refs:inode

59 static __le32 ext4_extent_block_csum(struct inode *inode,  in ext4_extent_block_csum()  argument
62 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_extent_block_csum()
63 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_extent_block_csum()
71 static int ext4_extent_block_csum_verify(struct inode *inode, in ext4_extent_block_csum_verify() argument
76 if (!ext4_has_metadata_csum(inode->i_sb)) in ext4_extent_block_csum_verify()
80 if (et->et_checksum != ext4_extent_block_csum(inode, eh)) in ext4_extent_block_csum_verify()
85 static void ext4_extent_block_csum_set(struct inode *inode, in ext4_extent_block_csum_set() argument
90 if (!ext4_has_metadata_csum(inode->i_sb)) in ext4_extent_block_csum_set()
94 et->et_checksum = ext4_extent_block_csum(inode, eh); in ext4_extent_block_csum_set()
98 struct inode *inode,
105 struct inode *inode,
111 static int ext4_find_delayed_extent(struct inode *inode,
115 struct inode *inode, in ext4_ext_truncate_extend_restart() argument
127 err = ext4_truncate_restart_trans(handle, inode, needed); in ext4_ext_truncate_extend_restart()
139 static int ext4_ext_get_access(handle_t *handle, struct inode *inode, in ext4_ext_get_access() argument
159 struct inode *inode, struct ext4_ext_path *path) in __ext4_ext_dirty() argument
163 WARN_ON(!rwsem_is_locked(&EXT4_I(inode)->i_data_sem)); in __ext4_ext_dirty()
165 ext4_extent_block_csum_set(inode, ext_block_hdr(path->p_bh)); in __ext4_ext_dirty()
168 inode, path->p_bh); in __ext4_ext_dirty()
171 err = ext4_mark_inode_dirty(handle, inode); in __ext4_ext_dirty()
176 static ext4_fsblk_t ext4_ext_find_goal(struct inode *inode, in ext4_ext_find_goal() argument
219 return ext4_inode_to_goal_block(inode); in ext4_ext_find_goal()
226 ext4_ext_new_meta_block(handle_t *handle, struct inode *inode, in ext4_ext_new_meta_block() argument
232 goal = ext4_ext_find_goal(inode, path, le32_to_cpu(ex->ee_block)); in ext4_ext_new_meta_block()
233 newblock = ext4_new_meta_blocks(handle, inode, goal, flags, in ext4_ext_new_meta_block()
238 static inline int ext4_ext_space_block(struct inode *inode, int check) in ext4_ext_space_block() argument
242 size = (inode->i_sb->s_blocksize - sizeof(struct ext4_extent_header)) in ext4_ext_space_block()
251 static inline int ext4_ext_space_block_idx(struct inode *inode, int check) in ext4_ext_space_block_idx() argument
255 size = (inode->i_sb->s_blocksize - sizeof(struct ext4_extent_header)) in ext4_ext_space_block_idx()
264 static inline int ext4_ext_space_root(struct inode *inode, int check) in ext4_ext_space_root() argument
268 size = sizeof(EXT4_I(inode)->i_data); in ext4_ext_space_root()
278 static inline int ext4_ext_space_root_idx(struct inode *inode, int check) in ext4_ext_space_root_idx() argument
282 size = sizeof(EXT4_I(inode)->i_data); in ext4_ext_space_root_idx()
293 ext4_force_split_extent_at(handle_t *handle, struct inode *inode, in ext4_force_split_extent_at() argument
300 return ext4_split_extent_at(handle, inode, ppath, lblk, unwritten ? in ext4_force_split_extent_at()
311 int ext4_ext_calc_metadata_amount(struct inode *inode, ext4_lblk_t lblock) in ext4_ext_calc_metadata_amount() argument
313 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_ext_calc_metadata_amount()
316 idxs = ((inode->i_sb->s_blocksize - sizeof(struct ext4_extent_header)) in ext4_ext_calc_metadata_amount()
350 return ext_depth(inode) + 1; in ext4_ext_calc_metadata_amount()
354 ext4_ext_max_entries(struct inode *inode, int depth) in ext4_ext_max_entries() argument
358 if (depth == ext_depth(inode)) { in ext4_ext_max_entries()
360 max = ext4_ext_space_root(inode, 1); in ext4_ext_max_entries()
362 max = ext4_ext_space_root_idx(inode, 1); in ext4_ext_max_entries()
365 max = ext4_ext_space_block(inode, 1); in ext4_ext_max_entries()
367 max = ext4_ext_space_block_idx(inode, 1); in ext4_ext_max_entries()
373 static int ext4_valid_extent(struct inode *inode, struct ext4_extent *ext) in ext4_valid_extent() argument
382 return ext4_data_block_valid(EXT4_SB(inode->i_sb), block, len); in ext4_valid_extent()
385 static int ext4_valid_extent_idx(struct inode *inode, in ext4_valid_extent_idx() argument
390 return ext4_data_block_valid(EXT4_SB(inode->i_sb), block, 1); in ext4_valid_extent_idx()
393 static int ext4_valid_extent_entries(struct inode *inode, in ext4_valid_extent_entries() argument
406 struct ext4_super_block *es = EXT4_SB(inode->i_sb)->s_es; in ext4_valid_extent_entries()
412 if (!ext4_valid_extent(inode, ext)) in ext4_valid_extent_entries()
430 if (!ext4_valid_extent_idx(inode, ext_idx)) in ext4_valid_extent_entries()
440 struct inode *inode, struct ext4_extent_header *eh, in __ext4_ext_check() argument
458 max = ext4_ext_max_entries(inode, depth); in __ext4_ext_check()
467 if (!ext4_valid_extent_entries(inode, eh, depth)) { in __ext4_ext_check()
472 if (ext_depth(inode) != depth && in __ext4_ext_check()
473 !ext4_extent_block_csum_verify(inode, eh)) { in __ext4_ext_check()
480 ext4_error_inode(inode, function, line, 0, in __ext4_ext_check()
490 #define ext4_ext_check(inode, eh, depth, pblk) \ argument
491 __ext4_ext_check(__func__, __LINE__, (inode), (eh), (depth), (pblk))
493 int ext4_ext_check_inode(struct inode *inode) in ext4_ext_check_inode() argument
495 return ext4_ext_check(inode, ext_inode_hdr(inode), ext_depth(inode), 0); in ext4_ext_check_inode()
500 struct inode *inode, ext4_fsblk_t pblk, int depth, in __read_extent_tree_block() argument
506 bh = sb_getblk_gfp(inode->i_sb, pblk, __GFP_MOVABLE | GFP_NOFS); in __read_extent_tree_block()
511 trace_ext4_ext_load_extent(inode, pblk, _RET_IP_); in __read_extent_tree_block()
518 err = __ext4_ext_check(function, line, inode, in __read_extent_tree_block()
538 ext4_es_cache_extent(inode, prev, in __read_extent_tree_block()
544 ext4_es_cache_extent(inode, lblk, len, in __read_extent_tree_block()
556 #define read_extent_tree_block(inode, pblk, depth, flags) \ argument
557 __read_extent_tree_block(__func__, __LINE__, (inode), (pblk), \
564 int ext4_ext_precache(struct inode *inode) in ext4_ext_precache() argument
566 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_ext_precache()
571 if (!ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) in ext4_ext_precache()
575 depth = ext_depth(inode); in ext4_ext_precache()
587 path[0].p_hdr = ext_inode_hdr(inode); in ext4_ext_precache()
588 ret = ext4_ext_check(inode, path[0].p_hdr, depth, 0); in ext4_ext_precache()
604 bh = read_extent_tree_block(inode, in ext4_ext_precache()
617 ext4_set_inode_state(inode, EXT4_STATE_EXT_PRECACHED); in ext4_ext_precache()
626 static void ext4_ext_show_path(struct inode *inode, struct ext4_ext_path *path) in ext4_ext_show_path() argument
647 static void ext4_ext_show_leaf(struct inode *inode, struct ext4_ext_path *path) in ext4_ext_show_leaf() argument
649 int depth = ext_depth(inode); in ext4_ext_show_leaf()
660 ext_debug("Displaying leaf extents for inode %lu\n", inode->i_ino); in ext4_ext_show_leaf()
670 static void ext4_ext_show_move(struct inode *inode, struct ext4_ext_path *path, in ext4_ext_show_move() argument
673 int depth = ext_depth(inode); in ext4_ext_show_move()
703 #define ext4_ext_show_path(inode, path) argument
704 #define ext4_ext_show_leaf(inode, path) argument
705 #define ext4_ext_show_move(inode, path, newblock, level) argument
728 ext4_ext_binsearch_idx(struct inode *inode, in ext4_ext_binsearch_idx() argument
788 ext4_ext_binsearch(struct inode *inode, in ext4_ext_binsearch() argument
844 int ext4_ext_tree_init(handle_t *handle, struct inode *inode) in ext4_ext_tree_init() argument
848 eh = ext_inode_hdr(inode); in ext4_ext_tree_init()
852 eh->eh_max = cpu_to_le16(ext4_ext_space_root(inode, 0)); in ext4_ext_tree_init()
853 ext4_mark_inode_dirty(handle, inode); in ext4_ext_tree_init()
858 ext4_find_extent(struct inode *inode, ext4_lblk_t block, in ext4_find_extent() argument
867 eh = ext_inode_hdr(inode); in ext4_find_extent()
868 depth = ext_depth(inode); in ext4_find_extent()
894 ext4_ext_binsearch_idx(inode, path + ppos, block); in ext4_find_extent()
899 bh = read_extent_tree_block(inode, path[ppos].p_block, --i, in ext4_find_extent()
910 EXT4_ERROR_INODE(inode, in ext4_find_extent()
924 ext4_ext_binsearch(inode, path + ppos, block); in ext4_find_extent()
929 ext4_ext_show_path(inode, path); in ext4_find_extent()
946 static int ext4_ext_insert_index(handle_t *handle, struct inode *inode, in ext4_ext_insert_index() argument
953 err = ext4_ext_get_access(handle, inode, curp); in ext4_ext_insert_index()
958 EXT4_ERROR_INODE(inode, in ext4_ext_insert_index()
966 EXT4_ERROR_INODE(inode, in ext4_ext_insert_index()
993 EXT4_ERROR_INODE(inode, "ix > EXT_MAX_INDEX!"); in ext4_ext_insert_index()
1002 EXT4_ERROR_INODE(inode, "ix > EXT_LAST_INDEX!"); in ext4_ext_insert_index()
1006 err = ext4_ext_dirty(handle, inode, curp); in ext4_ext_insert_index()
1007 ext4_std_error(inode->i_sb, err); in ext4_ext_insert_index()
1022 static int ext4_ext_split(handle_t *handle, struct inode *inode, in ext4_ext_split() argument
1028 int depth = ext_depth(inode); in ext4_ext_split()
1043 EXT4_ERROR_INODE(inode, "p_ext > EXT_MAX_EXTENT!"); in ext4_ext_split()
1077 newblock = ext4_ext_new_meta_block(handle, inode, path, in ext4_ext_split()
1087 EXT4_ERROR_INODE(inode, "newblock == 0!"); in ext4_ext_split()
1091 bh = sb_getblk_gfp(inode->i_sb, newblock, __GFP_MOVABLE | GFP_NOFS); in ext4_ext_split()
1104 neh->eh_max = cpu_to_le16(ext4_ext_space_block(inode, 0)); in ext4_ext_split()
1111 EXT4_ERROR_INODE(inode, "eh_entries %d != eh_max %d!", in ext4_ext_split()
1119 ext4_ext_show_move(inode, path, newblock, depth); in ext4_ext_split()
1127 ext4_extent_block_csum_set(inode, neh); in ext4_ext_split()
1131 err = ext4_handle_dirty_metadata(handle, inode, bh); in ext4_ext_split()
1139 err = ext4_ext_get_access(handle, inode, path + depth); in ext4_ext_split()
1143 err = ext4_ext_dirty(handle, inode, path + depth); in ext4_ext_split()
1152 EXT4_ERROR_INODE(inode, "k %d < 0!", k); in ext4_ext_split()
1164 bh = sb_getblk(inode->i_sb, newblock); in ext4_ext_split()
1178 neh->eh_max = cpu_to_le16(ext4_ext_space_block_idx(inode, 0)); in ext4_ext_split()
1190 EXT4_ERROR_INODE(inode, in ext4_ext_split()
1200 ext4_ext_show_move(inode, path, newblock, i); in ext4_ext_split()
1206 ext4_extent_block_csum_set(inode, neh); in ext4_ext_split()
1210 err = ext4_handle_dirty_metadata(handle, inode, bh); in ext4_ext_split()
1218 err = ext4_ext_get_access(handle, inode, path + i); in ext4_ext_split()
1222 err = ext4_ext_dirty(handle, inode, path + i); in ext4_ext_split()
1231 err = ext4_ext_insert_index(handle, inode, path + at, in ext4_ext_split()
1246 ext4_free_blocks(handle, inode, NULL, ablocks[i], 1, in ext4_ext_split()
1263 static int ext4_ext_grow_indepth(handle_t *handle, struct inode *inode, in ext4_ext_grow_indepth() argument
1269 struct ext4_super_block *es = EXT4_SB(inode->i_sb)->s_es; in ext4_ext_grow_indepth()
1273 if (ext_depth(inode)) in ext4_ext_grow_indepth()
1274 goal = ext4_idx_pblock(EXT_FIRST_INDEX(ext_inode_hdr(inode))); in ext4_ext_grow_indepth()
1279 goal = ext4_inode_to_goal_block(inode); in ext4_ext_grow_indepth()
1280 newblock = ext4_new_meta_blocks(handle, inode, goal, flags, in ext4_ext_grow_indepth()
1285 bh = sb_getblk_gfp(inode->i_sb, newblock, __GFP_MOVABLE | GFP_NOFS); in ext4_ext_grow_indepth()
1297 memmove(bh->b_data, EXT4_I(inode)->i_data, in ext4_ext_grow_indepth()
1298 sizeof(EXT4_I(inode)->i_data)); in ext4_ext_grow_indepth()
1304 if (ext_depth(inode)) in ext4_ext_grow_indepth()
1305 neh->eh_max = cpu_to_le16(ext4_ext_space_block_idx(inode, 0)); in ext4_ext_grow_indepth()
1307 neh->eh_max = cpu_to_le16(ext4_ext_space_block(inode, 0)); in ext4_ext_grow_indepth()
1309 ext4_extent_block_csum_set(inode, neh); in ext4_ext_grow_indepth()
1313 err = ext4_handle_dirty_metadata(handle, inode, bh); in ext4_ext_grow_indepth()
1318 neh = ext_inode_hdr(inode); in ext4_ext_grow_indepth()
1323 neh->eh_max = cpu_to_le16(ext4_ext_space_root_idx(inode, 0)); in ext4_ext_grow_indepth()
1333 ext4_mark_inode_dirty(handle, inode); in ext4_ext_grow_indepth()
1345 static int ext4_ext_create_new_leaf(handle_t *handle, struct inode *inode, in ext4_ext_create_new_leaf() argument
1356 i = depth = ext_depth(inode); in ext4_ext_create_new_leaf()
1370 err = ext4_ext_split(handle, inode, mb_flags, path, newext, i); in ext4_ext_create_new_leaf()
1375 path = ext4_find_extent(inode, in ext4_ext_create_new_leaf()
1382 err = ext4_ext_grow_indepth(handle, inode, mb_flags); in ext4_ext_create_new_leaf()
1387 path = ext4_find_extent(inode, in ext4_ext_create_new_leaf()
1399 depth = ext_depth(inode); in ext4_ext_create_new_leaf()
1417 static int ext4_ext_search_left(struct inode *inode, in ext4_ext_search_left() argument
1426 EXT4_ERROR_INODE(inode, "path == NULL *logical %d!", *logical); in ext4_ext_search_left()
1443 EXT4_ERROR_INODE(inode, in ext4_ext_search_left()
1451 EXT4_ERROR_INODE(inode, in ext4_ext_search_left()
1464 EXT4_ERROR_INODE(inode, in ext4_ext_search_left()
1482 static int ext4_ext_search_right(struct inode *inode, in ext4_ext_search_right() argument
1496 EXT4_ERROR_INODE(inode, "path == NULL *logical %d!", *logical); in ext4_ext_search_right()
1513 EXT4_ERROR_INODE(inode, in ext4_ext_search_right()
1521 EXT4_ERROR_INODE(inode, in ext4_ext_search_right()
1531 EXT4_ERROR_INODE(inode, in ext4_ext_search_right()
1561 bh = read_extent_tree_block(inode, block, in ext4_ext_search_right()
1571 bh = read_extent_tree_block(inode, block, path->p_depth - depth, 0); in ext4_ext_search_right()
1657 static int ext4_ext_correct_indexes(handle_t *handle, struct inode *inode, in ext4_ext_correct_indexes() argument
1661 int depth = ext_depth(inode); in ext4_ext_correct_indexes()
1670 EXT4_ERROR_INODE(inode, in ext4_ext_correct_indexes()
1690 err = ext4_ext_get_access(handle, inode, path + k); in ext4_ext_correct_indexes()
1694 err = ext4_ext_dirty(handle, inode, path + k); in ext4_ext_correct_indexes()
1702 err = ext4_ext_get_access(handle, inode, path + k); in ext4_ext_correct_indexes()
1706 err = ext4_ext_dirty(handle, inode, path + k); in ext4_ext_correct_indexes()
1715 ext4_can_extents_be_merged(struct inode *inode, struct ext4_extent *ex1, in ext4_can_extents_be_merged() argument
1738 (ext4_test_inode_state(inode, EXT4_STATE_DIO_UNWRITTEN) || in ext4_can_extents_be_merged()
1739 atomic_read(&EXT4_I(inode)->i_unwritten) || in ext4_can_extents_be_merged()
1759 static int ext4_ext_try_to_merge_right(struct inode *inode, in ext4_ext_try_to_merge_right() argument
1767 depth = ext_depth(inode); in ext4_ext_try_to_merge_right()
1772 if (!ext4_can_extents_be_merged(inode, ex, ex + 1)) in ext4_ext_try_to_merge_right()
1790 EXT4_ERROR_INODE(inode, "eh->eh_entries = 0!"); in ext4_ext_try_to_merge_right()
1801 struct inode *inode, in ext4_ext_try_to_merge_up() argument
1805 unsigned max_root = ext4_ext_space_root(inode, 0); in ext4_ext_try_to_merge_up()
1837 ext4_free_blocks(handle, inode, NULL, blk, 1, in ext4_ext_try_to_merge_up()
1846 struct inode *inode, in ext4_ext_try_to_merge() argument
1853 depth = ext_depth(inode); in ext4_ext_try_to_merge()
1858 merge_done = ext4_ext_try_to_merge_right(inode, path, ex - 1); in ext4_ext_try_to_merge()
1861 (void) ext4_ext_try_to_merge_right(inode, path, ex); in ext4_ext_try_to_merge()
1863 ext4_ext_try_to_merge_up(handle, inode, path); in ext4_ext_try_to_merge()
1875 struct inode *inode, in ext4_ext_check_overlap() argument
1885 depth = ext_depth(inode); in ext4_ext_check_overlap()
1923 int ext4_ext_insert_extent(handle_t *handle, struct inode *inode, in ext4_ext_insert_extent() argument
1939 EXT4_ERROR_INODE(inode, "ext4_ext_get_actual_len(newext) == 0"); in ext4_ext_insert_extent()
1942 depth = ext_depth(inode); in ext4_ext_insert_extent()
1946 EXT4_ERROR_INODE(inode, "path[%d].p_hdr == NULL", depth); in ext4_ext_insert_extent()
1973 if (ext4_can_extents_be_merged(inode, ex, newext)) { in ext4_ext_insert_extent()
1982 err = ext4_ext_get_access(handle, inode, in ext4_ext_insert_extent()
1998 if (ext4_can_extents_be_merged(inode, newext, ex)) { in ext4_ext_insert_extent()
2008 err = ext4_ext_get_access(handle, inode, in ext4_ext_insert_extent()
2026 depth = ext_depth(inode); in ext4_ext_insert_extent()
2039 npath = ext4_find_extent(inode, next, NULL, 0); in ext4_ext_insert_extent()
2060 err = ext4_ext_create_new_leaf(handle, inode, mb_flags, gb_flags, in ext4_ext_insert_extent()
2064 depth = ext_depth(inode); in ext4_ext_insert_extent()
2070 err = ext4_ext_get_access(handle, inode, path + depth); in ext4_ext_insert_extent()
2128 ext4_ext_try_to_merge(handle, inode, path, nearex); in ext4_ext_insert_extent()
2132 err = ext4_ext_correct_indexes(handle, inode, path); in ext4_ext_insert_extent()
2136 err = ext4_ext_dirty(handle, inode, path + path->p_depth); in ext4_ext_insert_extent()
2144 static int ext4_fill_fiemap_extents(struct inode *inode, in ext4_fill_fiemap_extents() argument
2155 unsigned char blksize_bits = inode->i_sb->s_blocksize_bits; in ext4_fill_fiemap_extents()
2160 down_read(&EXT4_I(inode)->i_data_sem); in ext4_fill_fiemap_extents()
2162 path = ext4_find_extent(inode, block, &path, 0); in ext4_fill_fiemap_extents()
2164 up_read(&EXT4_I(inode)->i_data_sem); in ext4_fill_fiemap_extents()
2170 depth = ext_depth(inode); in ext4_fill_fiemap_extents()
2172 up_read(&EXT4_I(inode)->i_data_sem); in ext4_fill_fiemap_extents()
2173 EXT4_ERROR_INODE(inode, "path[%d].p_hdr == NULL", depth); in ext4_fill_fiemap_extents()
2233 next_del = ext4_find_delayed_extent(inode, &es); in ext4_fill_fiemap_extents()
2239 up_read(&EXT4_I(inode)->i_data_sem); in ext4_fill_fiemap_extents()
2242 EXT4_ERROR_INODE(inode, "es.es_len == 0"); in ext4_fill_fiemap_extents()
2262 EXT4_ERROR_INODE(inode, in ext4_fill_fiemap_extents()
2299 ext4_ext_put_gap_in_cache(struct inode *inode, struct ext4_ext_path *path, in ext4_ext_put_gap_in_cache() argument
2302 int depth = ext_depth(inode); in ext4_ext_put_gap_in_cache()
2338 ext4_es_find_delayed_extent_range(inode, lblock, lblock + len - 1, &es); in ext4_ext_put_gap_in_cache()
2346 ext4_es_insert_extent(inode, lblock, len, ~0, EXTENT_STATUS_HOLE); in ext4_ext_put_gap_in_cache()
2353 static int ext4_ext_rm_idx(handle_t *handle, struct inode *inode, in ext4_ext_rm_idx() argument
2364 EXT4_ERROR_INODE(inode, "path->p_hdr->eh_entries == 0"); in ext4_ext_rm_idx()
2367 err = ext4_ext_get_access(handle, inode, path); in ext4_ext_rm_idx()
2378 err = ext4_ext_dirty(handle, inode, path); in ext4_ext_rm_idx()
2382 trace_ext4_ext_rm_idx(inode, leaf); in ext4_ext_rm_idx()
2384 ext4_free_blocks(handle, inode, NULL, leaf, 1, in ext4_ext_rm_idx()
2391 err = ext4_ext_get_access(handle, inode, path); in ext4_ext_rm_idx()
2395 err = ext4_ext_dirty(handle, inode, path); in ext4_ext_rm_idx()
2409 int ext4_ext_calc_credits_for_single_extent(struct inode *inode, int nrblocks, in ext4_ext_calc_credits_for_single_extent() argument
2413 int depth = ext_depth(inode); in ext4_ext_calc_credits_for_single_extent()
2429 ret = 2 + EXT4_META_TRANS_BLOCKS(inode->i_sb); in ext4_ext_calc_credits_for_single_extent()
2434 return ext4_chunk_trans_blocks(inode, nrblocks); in ext4_ext_calc_credits_for_single_extent()
2446 int ext4_ext_index_trans_blocks(struct inode *inode, int extents) in ext4_ext_index_trans_blocks() argument
2452 if (ext4_has_inline_data(inode)) in ext4_ext_index_trans_blocks()
2455 depth = ext_depth(inode); in ext4_ext_index_trans_blocks()
2465 static inline int get_default_free_blocks_flags(struct inode *inode) in get_default_free_blocks_flags() argument
2467 if (S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode)) in get_default_free_blocks_flags()
2469 else if (ext4_should_journal_data(inode)) in get_default_free_blocks_flags()
2474 static int ext4_remove_blocks(handle_t *handle, struct inode *inode, in ext4_remove_blocks() argument
2479 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_remove_blocks()
2482 int flags = get_default_free_blocks_flags(inode); in ext4_remove_blocks()
2493 trace_ext4_remove_blocks(inode, ex, from, to, *partial_cluster); in ext4_remove_blocks()
2502 ext4_free_blocks(handle, inode, NULL, in ext4_remove_blocks()
2510 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_remove_blocks()
2518 if (ext_depth(inode) > sbi->s_depth_max) in ext4_remove_blocks()
2519 sbi->s_depth_max = ext_depth(inode); in ext4_remove_blocks()
2542 ext4_free_blocks(handle, inode, NULL, pblk, num, flags); in ext4_remove_blocks()
2590 ext4_ext_rm_leaf(handle_t *handle, struct inode *inode, in ext4_ext_rm_leaf() argument
2595 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_ext_rm_leaf()
2597 int depth = ext_depth(inode), credits; in ext4_ext_rm_leaf()
2613 EXT4_ERROR_INODE(inode, "path[%d].p_hdr == NULL", depth); in ext4_ext_rm_leaf()
2624 trace_ext4_ext_rm_leaf(inode, start, ex, *partial_cluster); in ext4_ext_rm_leaf()
2663 EXT4_ERROR_INODE(inode, in ext4_ext_rm_leaf()
2683 credits = 7 + 2*(ex_ee_len/EXT4_BLOCKS_PER_GROUP(inode->i_sb)); in ext4_ext_rm_leaf()
2686 credits += (ext_depth(inode)) + 1; in ext4_ext_rm_leaf()
2688 credits += EXT4_MAXQUOTAS_TRANS_BLOCKS(inode->i_sb); in ext4_ext_rm_leaf()
2690 err = ext4_ext_truncate_extend_restart(handle, inode, credits); in ext4_ext_rm_leaf()
2694 err = ext4_ext_get_access(handle, inode, path + depth); in ext4_ext_rm_leaf()
2698 err = ext4_remove_blocks(handle, inode, ex, partial_cluster, in ext4_ext_rm_leaf()
2735 err = ext4_ext_dirty(handle, inode, path + depth); in ext4_ext_rm_leaf()
2747 err = ext4_ext_correct_indexes(handle, inode, path); in ext4_ext_rm_leaf()
2759 ext4_free_blocks(handle, inode, NULL, in ext4_ext_rm_leaf()
2762 get_default_free_blocks_flags(inode)); in ext4_ext_rm_leaf()
2770 err = ext4_ext_rm_idx(handle, inode, path, depth); in ext4_ext_rm_leaf()
2797 int ext4_ext_remove_space(struct inode *inode, ext4_lblk_t start, in ext4_ext_remove_space() argument
2800 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_ext_remove_space()
2801 int depth = ext_depth(inode); in ext4_ext_remove_space()
2810 handle = ext4_journal_start(inode, EXT4_HT_TRUNCATE, depth + 1); in ext4_ext_remove_space()
2815 trace_ext4_ext_remove_space(inode, start, end, depth); in ext4_ext_remove_space()
2830 path = ext4_find_extent(inode, end, NULL, EXT4_EX_NOCACHE); in ext4_ext_remove_space()
2835 depth = ext_depth(inode); in ext4_ext_remove_space()
2840 EXT4_ERROR_INODE(inode, in ext4_ext_remove_space()
2876 err = ext4_force_split_extent_at(handle, inode, &path, in ext4_ext_remove_space()
2891 err = ext4_ext_search_right(inode, path, &lblk, &pblk, in ext4_ext_remove_space()
2904 depth = ext_depth(inode); in ext4_ext_remove_space()
2918 path[0].p_hdr = ext_inode_hdr(inode); in ext4_ext_remove_space()
2921 if (ext4_ext_check(inode, path[0].p_hdr, depth, 0)) { in ext4_ext_remove_space()
2931 err = ext4_ext_rm_leaf(handle, inode, path, in ext4_ext_remove_space()
2968 bh = read_extent_tree_block(inode, in ext4_ext_remove_space()
2995 err = ext4_ext_rm_idx(handle, inode, path, i); in ext4_ext_remove_space()
3005 trace_ext4_ext_remove_space_done(inode, start, end, depth, in ext4_ext_remove_space()
3016 ext4_free_blocks(handle, inode, NULL, in ext4_ext_remove_space()
3019 get_default_free_blocks_flags(inode)); in ext4_ext_remove_space()
3028 err = ext4_ext_get_access(handle, inode, path); in ext4_ext_remove_space()
3030 ext_inode_hdr(inode)->eh_depth = 0; in ext4_ext_remove_space()
3031 ext_inode_hdr(inode)->eh_max = in ext4_ext_remove_space()
3032 cpu_to_le16(ext4_ext_space_root(inode, 0)); in ext4_ext_remove_space()
3033 err = ext4_ext_dirty(handle, inode, path); in ext4_ext_remove_space()
3098 static int ext4_zeroout_es(struct inode *inode, struct ext4_extent *ex) in ext4_zeroout_es() argument
3111 return ext4_es_insert_extent(inode, ee_block, ee_len, ee_pblock, in ext4_zeroout_es()
3116 static int ext4_ext_zeroout(struct inode *inode, struct ext4_extent *ex) in ext4_ext_zeroout() argument
3125 if (ext4_encrypted_inode(inode)) in ext4_ext_zeroout()
3126 return ext4_encrypted_zeroout(inode, ex); in ext4_ext_zeroout()
3128 ret = sb_issue_zeroout(inode->i_sb, ee_pblock, ee_len, GFP_NOFS); in ext4_ext_zeroout()
3157 struct inode *inode, in ext4_split_extent_at() argument
3175 "block %llu\n", inode->i_ino, (unsigned long long)split); in ext4_split_extent_at()
3177 ext4_ext_show_leaf(inode, path); in ext4_split_extent_at()
3179 depth = ext_depth(inode); in ext4_split_extent_at()
3191 err = ext4_ext_get_access(handle, inode, path + depth); in ext4_split_extent_at()
3207 ext4_ext_try_to_merge(handle, inode, path, ex); in ext4_split_extent_at()
3209 err = ext4_ext_dirty(handle, inode, path + path->p_depth); in ext4_split_extent_at()
3223 err = ext4_ext_dirty(handle, inode, path + depth); in ext4_split_extent_at()
3234 err = ext4_ext_insert_extent(handle, inode, ppath, &newex, flags); in ext4_split_extent_at()
3238 err = ext4_ext_zeroout(inode, ex2); in ext4_split_extent_at()
3245 err = ext4_ext_zeroout(inode, ex); in ext4_split_extent_at()
3253 err = ext4_ext_zeroout(inode, &orig_ex); in ext4_split_extent_at()
3265 ext4_ext_try_to_merge(handle, inode, path, ex); in ext4_split_extent_at()
3266 err = ext4_ext_dirty(handle, inode, path + path->p_depth); in ext4_split_extent_at()
3271 err = ext4_zeroout_es(inode, &zero_ex); in ext4_split_extent_at()
3278 ext4_ext_show_leaf(inode, path); in ext4_split_extent_at()
3283 ext4_ext_dirty(handle, inode, path + path->p_depth); in ext4_split_extent_at()
3299 struct inode *inode, in ext4_split_extent() argument
3314 depth = ext_depth(inode); in ext4_split_extent()
3328 err = ext4_split_extent_at(handle, inode, ppath, in ext4_split_extent()
3339 path = ext4_find_extent(inode, map->m_lblk, ppath, 0); in ext4_split_extent()
3342 depth = ext_depth(inode); in ext4_split_extent()
3345 EXT4_ERROR_INODE(inode, "unexpected hole at %lu", in ext4_split_extent()
3359 err = ext4_split_extent_at(handle, inode, ppath, in ext4_split_extent()
3365 ext4_ext_show_leaf(inode, path); in ext4_split_extent()
3391 struct inode *inode, in ext4_ext_convert_to_initialized() argument
3409 "block %llu, max_blocks %u\n", inode->i_ino, in ext4_ext_convert_to_initialized()
3412 sbi = EXT4_SB(inode->i_sb); in ext4_ext_convert_to_initialized()
3413 eof_block = (inode->i_size + inode->i_sb->s_blocksize - 1) >> in ext4_ext_convert_to_initialized()
3414 inode->i_sb->s_blocksize_bits; in ext4_ext_convert_to_initialized()
3418 depth = ext_depth(inode); in ext4_ext_convert_to_initialized()
3425 trace_ext4_ext_convert_to_initialized_enter(inode, map, ex); in ext4_ext_convert_to_initialized()
3473 err = ext4_ext_get_access(handle, inode, path + depth); in ext4_ext_convert_to_initialized()
3477 trace_ext4_ext_convert_to_initialized_fastpath(inode, in ext4_ext_convert_to_initialized()
3519 err = ext4_ext_get_access(handle, inode, path + depth); in ext4_ext_convert_to_initialized()
3523 trace_ext4_ext_convert_to_initialized_fastpath(inode, in ext4_ext_convert_to_initialized()
3541 ext4_ext_dirty(handle, inode, path + depth); in ext4_ext_convert_to_initialized()
3558 (inode->i_sb->s_blocksize_bits - 10); in ext4_ext_convert_to_initialized()
3562 err = ext4_ext_zeroout(inode, ex); in ext4_ext_convert_to_initialized()
3569 err = ext4_ext_get_access(handle, inode, path + depth); in ext4_ext_convert_to_initialized()
3573 ext4_ext_try_to_merge(handle, inode, path, ex); in ext4_ext_convert_to_initialized()
3574 err = ext4_ext_dirty(handle, inode, path + path->p_depth); in ext4_ext_convert_to_initialized()
3596 err = ext4_ext_zeroout(inode, &zero_ex); in ext4_ext_convert_to_initialized()
3609 err = ext4_ext_zeroout(inode, &zero_ex); in ext4_ext_convert_to_initialized()
3620 err = ext4_split_extent(handle, inode, ppath, &split_map, split_flag, in ext4_ext_convert_to_initialized()
3627 err = ext4_zeroout_es(inode, &zero_ex); in ext4_ext_convert_to_initialized()
3656 struct inode *inode, in ext4_split_convert_extents() argument
3669 __func__, inode->i_ino, in ext4_split_convert_extents()
3672 eof_block = (inode->i_size + inode->i_sb->s_blocksize - 1) >> in ext4_split_convert_extents()
3673 inode->i_sb->s_blocksize_bits; in ext4_split_convert_extents()
3680 depth = ext_depth(inode); in ext4_split_convert_extents()
3695 return ext4_split_extent(handle, inode, ppath, map, split_flag, flags); in ext4_split_convert_extents()
3699 struct inode *inode, in ext4_convert_unwritten_extents_endio() argument
3710 depth = ext_depth(inode); in ext4_convert_unwritten_extents_endio()
3716 "block %llu, max_blocks %u\n", inode->i_ino, in ext4_convert_unwritten_extents_endio()
3729 inode->i_ino, (unsigned long long)ee_block, ee_len, in ext4_convert_unwritten_extents_endio()
3732 err = ext4_split_convert_extents(handle, inode, map, ppath, in ext4_convert_unwritten_extents_endio()
3736 path = ext4_find_extent(inode, map->m_lblk, ppath, 0); in ext4_convert_unwritten_extents_endio()
3739 depth = ext_depth(inode); in ext4_convert_unwritten_extents_endio()
3743 err = ext4_ext_get_access(handle, inode, path + depth); in ext4_convert_unwritten_extents_endio()
3752 ext4_ext_try_to_merge(handle, inode, path, ex); in ext4_convert_unwritten_extents_endio()
3755 err = ext4_ext_dirty(handle, inode, path + path->p_depth); in ext4_convert_unwritten_extents_endio()
3757 ext4_ext_show_leaf(inode, path); in ext4_convert_unwritten_extents_endio()
3772 static int check_eofblocks_fl(handle_t *handle, struct inode *inode, in check_eofblocks_fl() argument
3781 if (!ext4_test_inode_flag(inode, EXT4_INODE_EOFBLOCKS)) in check_eofblocks_fl()
3784 depth = ext_depth(inode); in check_eofblocks_fl()
3818 ext4_clear_inode_flag(inode, EXT4_INODE_EOFBLOCKS); in check_eofblocks_fl()
3819 return ext4_mark_inode_dirty(handle, inode); in check_eofblocks_fl()
3827 int ext4_find_delalloc_range(struct inode *inode, in ext4_find_delalloc_range() argument
3833 ext4_es_find_delayed_extent_range(inode, lblk_start, lblk_end, &es); in ext4_find_delalloc_range()
3845 int ext4_find_delalloc_cluster(struct inode *inode, ext4_lblk_t lblk) in ext4_find_delalloc_cluster() argument
3847 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_find_delalloc_cluster()
3852 return ext4_find_delalloc_range(inode, lblk_start, lblk_end); in ext4_find_delalloc_cluster()
3891 get_reserved_cluster_alloc(struct inode *inode, ext4_lblk_t lblk_start, in get_reserved_cluster_alloc() argument
3894 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in get_reserved_cluster_alloc()
3905 trace_ext4_get_reserved_cluster_alloc(inode, lblk_start, num_blks); in get_reserved_cluster_alloc()
3913 if (ext4_find_delalloc_range(inode, lblk_from, lblk_to)) in get_reserved_cluster_alloc()
3923 if (ext4_find_delalloc_range(inode, lblk_from, lblk_to)) in get_reserved_cluster_alloc()
3931 convert_initialized_extent(handle_t *handle, struct inode *inode, in convert_initialized_extent() argument
3950 depth = ext_depth(inode); in convert_initialized_extent()
3956 "block %llu, max_blocks %u\n", __func__, inode->i_ino, in convert_initialized_extent()
3960 err = ext4_split_convert_extents(handle, inode, map, ppath, in convert_initialized_extent()
3964 path = ext4_find_extent(inode, map->m_lblk, ppath, 0); in convert_initialized_extent()
3967 depth = ext_depth(inode); in convert_initialized_extent()
3970 EXT4_ERROR_INODE(inode, "unexpected hole at %lu", in convert_initialized_extent()
3976 err = ext4_ext_get_access(handle, inode, path + depth); in convert_initialized_extent()
3985 ext4_ext_try_to_merge(handle, inode, path, ex); in convert_initialized_extent()
3988 err = ext4_ext_dirty(handle, inode, path + path->p_depth); in convert_initialized_extent()
3991 ext4_ext_show_leaf(inode, path); in convert_initialized_extent()
3993 ext4_update_inode_fsync_trans(handle, inode, 1); in convert_initialized_extent()
3994 err = check_eofblocks_fl(handle, inode, map->m_lblk, path, map->m_len); in convert_initialized_extent()
4005 ext4_ext_handle_unwritten_extents(handle_t *handle, struct inode *inode, in ext4_ext_handle_unwritten_extents() argument
4013 ext4_io_end_t *io = ext4_inode_aio(inode); in ext4_ext_handle_unwritten_extents()
4017 inode->i_ino, (unsigned long long)map->m_lblk, map->m_len, in ext4_ext_handle_unwritten_extents()
4019 ext4_ext_show_leaf(inode, path); in ext4_ext_handle_unwritten_extents()
4027 trace_ext4_ext_handle_unwritten_extents(inode, map, flags, in ext4_ext_handle_unwritten_extents()
4032 ret = ext4_split_convert_extents(handle, inode, map, ppath, in ext4_ext_handle_unwritten_extents()
4042 ext4_set_io_unwritten_flag(inode, io); in ext4_ext_handle_unwritten_extents()
4044 ext4_set_inode_state(inode, EXT4_STATE_DIO_UNWRITTEN); in ext4_ext_handle_unwritten_extents()
4050 ret = ext4_convert_unwritten_extents_endio(handle, inode, map, in ext4_ext_handle_unwritten_extents()
4053 ext4_update_inode_fsync_trans(handle, inode, 1); in ext4_ext_handle_unwritten_extents()
4054 err = check_eofblocks_fl(handle, inode, map->m_lblk, in ext4_ext_handle_unwritten_extents()
4089 ret = ext4_ext_convert_to_initialized(handle, inode, map, ppath, flags); in ext4_ext_handle_unwritten_extents()
4091 ext4_update_inode_fsync_trans(handle, inode, 1); in ext4_ext_handle_unwritten_extents()
4107 unmap_underlying_metadata_blocks(inode->i_sb->s_bdev, in ext4_ext_handle_unwritten_extents()
4123 reserved_clusters = get_reserved_cluster_alloc(inode, in ext4_ext_handle_unwritten_extents()
4126 ext4_da_update_reserve_space(inode, in ext4_ext_handle_unwritten_extents()
4134 err = check_eofblocks_fl(handle, inode, map->m_lblk, path, in ext4_ext_handle_unwritten_extents()
4142 ext4_ext_show_leaf(inode, path); in ext4_ext_handle_unwritten_extents()
4270 int ext4_ext_map_blocks(handle_t *handle, struct inode *inode, in ext4_ext_map_blocks() argument
4275 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_ext_map_blocks()
4281 ext4_io_end_t *io = ext4_inode_aio(inode); in ext4_ext_map_blocks()
4287 map->m_lblk, map->m_len, inode->i_ino); in ext4_ext_map_blocks()
4288 trace_ext4_ext_map_blocks_enter(inode, map->m_lblk, map->m_len, flags); in ext4_ext_map_blocks()
4291 path = ext4_find_extent(inode, map->m_lblk, NULL, 0); in ext4_ext_map_blocks()
4298 depth = ext_depth(inode); in ext4_ext_map_blocks()
4306 EXT4_ERROR_INODE(inode, "bad extent address " in ext4_ext_map_blocks()
4327 trace_ext4_ext_show_extent(inode, ee_block, ee_start, ee_len); in ext4_ext_map_blocks()
4344 handle, inode, map, &path, in ext4_ext_map_blocks()
4351 handle, inode, map, &path, flags, in ext4_ext_map_blocks()
4370 ext4_ext_put_gap_in_cache(inode, path, map->m_lblk); in ext4_ext_map_blocks()
4385 get_implied_cluster_alloc(inode->i_sb, map, ex, path)) { in ext4_ext_map_blocks()
4394 err = ext4_ext_search_left(inode, path, &ar.lleft, &ar.pleft); in ext4_ext_map_blocks()
4399 err = ext4_ext_search_right(inode, path, &ar.lright, &ar.pright, &ex2); in ext4_ext_map_blocks()
4406 get_implied_cluster_alloc(inode->i_sb, map, ex2, path)) { in ext4_ext_map_blocks()
4428 err = ext4_ext_check_overlap(sbi, inode, &newex, path); in ext4_ext_map_blocks()
4435 ar.inode = inode; in ext4_ext_map_blocks()
4436 ar.goal = ext4_ext_find_goal(inode, path, map->m_lblk); in ext4_ext_map_blocks()
4450 if (S_ISREG(inode->i_mode)) in ext4_ext_map_blocks()
4491 err = check_eofblocks_fl(handle, inode, map->m_lblk, in ext4_ext_map_blocks()
4494 err = ext4_ext_insert_extent(handle, inode, &path, in ext4_ext_map_blocks()
4499 ext4_set_io_unwritten_flag(inode, io); in ext4_ext_map_blocks()
4501 ext4_set_inode_state(inode, in ext4_ext_map_blocks()
4511 ext4_discard_preallocations(inode); in ext4_ext_map_blocks()
4512 ext4_free_blocks(handle, inode, NULL, newblock, in ext4_ext_map_blocks()
4533 reserved_clusters = get_reserved_cluster_alloc(inode, in ext4_ext_map_blocks()
4538 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_ext_map_blocks()
4581 dquot_reserve_block(inode, in ext4_ext_map_blocks()
4594 ext4_da_update_reserve_space(inode, allocated_clusters, in ext4_ext_map_blocks()
4604 ext4_update_inode_fsync_trans(handle, inode, 1); in ext4_ext_map_blocks()
4606 ext4_update_inode_fsync_trans(handle, inode, 0); in ext4_ext_map_blocks()
4610 ext4_ext_show_leaf(inode, path); in ext4_ext_map_blocks()
4618 trace_ext4_ext_map_blocks_exit(inode, flags, map, in ext4_ext_map_blocks()
4623 void ext4_ext_truncate(handle_t *handle, struct inode *inode) in ext4_ext_truncate() argument
4625 struct super_block *sb = inode->i_sb; in ext4_ext_truncate()
4636 EXT4_I(inode)->i_disksize = inode->i_size; in ext4_ext_truncate()
4637 ext4_mark_inode_dirty(handle, inode); in ext4_ext_truncate()
4639 last_block = (inode->i_size + sb->s_blocksize - 1) in ext4_ext_truncate()
4642 err = ext4_es_remove_extent(inode, last_block, in ext4_ext_truncate()
4650 ext4_std_error(inode->i_sb, err); in ext4_ext_truncate()
4653 err = ext4_ext_remove_space(inode, last_block, EXT_MAX_BLOCKS - 1); in ext4_ext_truncate()
4654 ext4_std_error(inode->i_sb, err); in ext4_ext_truncate()
4661 struct inode *inode = file_inode(file); in ext4_alloc_file_blocks() local
4683 credits = ext4_chunk_trans_blocks(inode, len); in ext4_alloc_file_blocks()
4687 handle = ext4_journal_start(inode, EXT4_HT_MAP_BLOCKS, in ext4_alloc_file_blocks()
4693 ret = ext4_map_blocks(handle, inode, &map, flags); in ext4_alloc_file_blocks()
4697 inode->i_ino, map.m_lblk, in ext4_alloc_file_blocks()
4699 ext4_mark_inode_dirty(handle, inode); in ext4_alloc_file_blocks()
4705 epos = (loff_t)map.m_lblk << inode->i_blkbits; in ext4_alloc_file_blocks()
4706 inode->i_ctime = ext4_current_time(inode); in ext4_alloc_file_blocks()
4710 if (ext4_update_inode_size(inode, epos) & 0x1) in ext4_alloc_file_blocks()
4711 inode->i_mtime = inode->i_ctime; in ext4_alloc_file_blocks()
4713 if (epos > inode->i_size) in ext4_alloc_file_blocks()
4714 ext4_set_inode_flag(inode, in ext4_alloc_file_blocks()
4717 ext4_mark_inode_dirty(handle, inode); in ext4_alloc_file_blocks()
4723 ext4_should_retry_alloc(inode->i_sb, &retries)) { in ext4_alloc_file_blocks()
4734 struct inode *inode = file_inode(file); in ext4_zero_range() local
4744 unsigned int blkbits = inode->i_blkbits; in ext4_zero_range()
4746 trace_ext4_zero_range(inode, offset, len, mode); in ext4_zero_range()
4748 if (!S_ISREG(inode->i_mode)) in ext4_zero_range()
4752 if (ext4_should_journal_data(inode)) { in ext4_zero_range()
4753 ret = ext4_force_commit(inode->i_sb); in ext4_zero_range()
4779 mutex_lock(&inode->i_mutex); in ext4_zero_range()
4784 if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) { in ext4_zero_range()
4790 offset + len > i_size_read(inode)) { in ext4_zero_range()
4792 ret = inode_newsize_ok(inode, new_size); in ext4_zero_range()
4802 ext4_inode_block_unlocked_dio(inode); in ext4_zero_range()
4803 inode_dio_wait(inode); in ext4_zero_range()
4826 down_write(&EXT4_I(inode)->i_mmap_sem); in ext4_zero_range()
4827 ret = ext4_update_disksize_before_punch(inode, offset, len); in ext4_zero_range()
4829 up_write(&EXT4_I(inode)->i_mmap_sem); in ext4_zero_range()
4833 truncate_pagecache_range(inode, start, end - 1); in ext4_zero_range()
4834 inode->i_mtime = inode->i_ctime = ext4_current_time(inode); in ext4_zero_range()
4838 up_write(&EXT4_I(inode)->i_mmap_sem); in ext4_zero_range()
4849 credits = (2 * ext4_ext_index_trans_blocks(inode, 2)) + 1; in ext4_zero_range()
4850 if (ext4_should_journal_data(inode)) in ext4_zero_range()
4852 handle = ext4_journal_start(inode, EXT4_HT_MISC, credits); in ext4_zero_range()
4855 ext4_std_error(inode->i_sb, ret); in ext4_zero_range()
4859 inode->i_mtime = inode->i_ctime = ext4_current_time(inode); in ext4_zero_range()
4861 ext4_update_inode_size(inode, new_size); in ext4_zero_range()
4867 if ((offset + len) > i_size_read(inode)) in ext4_zero_range()
4868 ext4_set_inode_flag(inode, EXT4_INODE_EOFBLOCKS); in ext4_zero_range()
4870 ext4_mark_inode_dirty(handle, inode); in ext4_zero_range()
4873 ret = ext4_zero_partial_blocks(handle, inode, offset, len); in ext4_zero_range()
4880 ext4_inode_resume_unlocked_dio(inode); in ext4_zero_range()
4882 mutex_unlock(&inode->i_mutex); in ext4_zero_range()
4895 struct inode *inode = file_inode(file); in ext4_fallocate() local
4901 unsigned int blkbits = inode->i_blkbits; in ext4_fallocate()
4913 if (ext4_encrypted_inode(inode) && in ext4_fallocate()
4923 return ext4_punch_hole(inode, offset, len); in ext4_fallocate()
4925 ret = ext4_convert_inline_data(inode); in ext4_fallocate()
4930 return ext4_collapse_range(inode, offset, len); in ext4_fallocate()
4935 trace_ext4_fallocate_enter(inode, offset, len, mode); in ext4_fallocate()
4948 mutex_lock(&inode->i_mutex); in ext4_fallocate()
4953 if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) { in ext4_fallocate()
4959 offset + len > i_size_read(inode)) { in ext4_fallocate()
4961 ret = inode_newsize_ok(inode, new_size); in ext4_fallocate()
4967 ext4_inode_block_unlocked_dio(inode); in ext4_fallocate()
4968 inode_dio_wait(inode); in ext4_fallocate()
4972 ext4_inode_resume_unlocked_dio(inode); in ext4_fallocate()
4976 if (file->f_flags & O_SYNC && EXT4_SB(inode->i_sb)->s_journal) { in ext4_fallocate()
4977 ret = jbd2_complete_transaction(EXT4_SB(inode->i_sb)->s_journal, in ext4_fallocate()
4978 EXT4_I(inode)->i_sync_tid); in ext4_fallocate()
4981 mutex_unlock(&inode->i_mutex); in ext4_fallocate()
4982 trace_ext4_fallocate_exit(inode, offset, max_blocks, ret); in ext4_fallocate()
4996 int ext4_convert_unwritten_extents(handle_t *handle, struct inode *inode, in ext4_convert_unwritten_extents() argument
5003 unsigned int credits, blkbits = inode->i_blkbits; in ext4_convert_unwritten_extents()
5027 credits = ext4_chunk_trans_blocks(inode, max_blocks); in ext4_convert_unwritten_extents()
5033 handle = ext4_journal_start(inode, EXT4_HT_MAP_BLOCKS, in ext4_convert_unwritten_extents()
5040 ret = ext4_map_blocks(handle, inode, &map, in ext4_convert_unwritten_extents()
5043 ext4_warning(inode->i_sb, in ext4_convert_unwritten_extents()
5046 inode->i_ino, map.m_lblk, in ext4_convert_unwritten_extents()
5048 ext4_mark_inode_dirty(handle, inode); in ext4_convert_unwritten_extents()
5068 static int ext4_find_delayed_extent(struct inode *inode, in ext4_find_delayed_extent() argument
5075 ext4_es_find_delayed_extent_range(inode, newes->es_lblk, in ext4_find_delayed_extent()
5097 ext4_es_find_delayed_extent_range(inode, block, EXT_MAX_BLOCKS, &es); in ext4_find_delayed_extent()
5108 static int ext4_xattr_fiemap(struct inode *inode, in ext4_xattr_fiemap() argument
5114 int blockbits = inode->i_sb->s_blocksize_bits; in ext4_xattr_fiemap()
5118 if (ext4_test_inode_state(inode, EXT4_STATE_XATTR)) { in ext4_xattr_fiemap()
5122 error = ext4_get_inode_loc(inode, &iloc); in ext4_xattr_fiemap()
5127 EXT4_I(inode)->i_extra_isize; in ext4_xattr_fiemap()
5129 length = EXT4_SB(inode->i_sb)->s_inode_size - offset; in ext4_xattr_fiemap()
5133 physical = (__u64)EXT4_I(inode)->i_file_acl << blockbits; in ext4_xattr_fiemap()
5134 length = inode->i_sb->s_blocksize; in ext4_xattr_fiemap()
5143 int ext4_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, in ext4_fiemap() argument
5149 if (ext4_has_inline_data(inode)) { in ext4_fiemap()
5152 error = ext4_inline_data_fiemap(inode, fieinfo, &has_inline, in ext4_fiemap()
5160 error = ext4_ext_precache(inode); in ext4_fiemap()
5166 if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) in ext4_fiemap()
5167 return generic_block_fiemap(inode, fieinfo, start, len, in ext4_fiemap()
5174 error = ext4_xattr_fiemap(inode, fieinfo); in ext4_fiemap()
5179 start_blk = start >> inode->i_sb->s_blocksize_bits; in ext4_fiemap()
5180 last_blk = (start + len - 1) >> inode->i_sb->s_blocksize_bits; in ext4_fiemap()
5189 error = ext4_fill_fiemap_extents(inode, start_blk, in ext4_fiemap()
5202 ext4_access_path(handle_t *handle, struct inode *inode, in ext4_access_path() argument
5217 credits = ext4_writepage_trans_blocks(inode); in ext4_access_path()
5218 err = ext4_ext_truncate_extend_restart(handle, inode, credits); in ext4_access_path()
5224 err = ext4_ext_get_access(handle, inode, path); in ext4_access_path()
5236 struct inode *inode, handle_t *handle, in ext4_ext_shift_path_extents() argument
5252 err = ext4_access_path(handle, inode, path + depth); in ext4_ext_shift_path_extents()
5267 ext4_ext_try_to_merge_right(inode, in ext4_ext_shift_path_extents()
5273 err = ext4_ext_dirty(handle, inode, path + depth); in ext4_ext_shift_path_extents()
5282 err = ext4_access_path(handle, inode, path + depth); in ext4_ext_shift_path_extents()
5287 err = ext4_ext_dirty(handle, inode, path + depth); in ext4_ext_shift_path_extents()
5309 ext4_ext_shift_extents(struct inode *inode, handle_t *handle, in ext4_ext_shift_extents() argument
5319 path = ext4_find_extent(inode, EXT_MAX_BLOCKS - 1, NULL, 0); in ext4_ext_shift_extents()
5339 path = ext4_find_extent(inode, start - 1, &path, 0); in ext4_ext_shift_extents()
5359 path = ext4_find_extent(inode, start, &path, 0); in ext4_ext_shift_extents()
5365 EXT4_ERROR_INODE(inode, "unexpected hole at %lu", in ext4_ext_shift_extents()
5378 ret = ext4_ext_shift_path_extents(path, shift, inode, in ext4_ext_shift_extents()
5394 int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len) in ext4_collapse_range() argument
5396 struct super_block *sb = inode->i_sb; in ext4_collapse_range()
5408 if (!ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) in ext4_collapse_range()
5416 if (!S_ISREG(inode->i_mode)) in ext4_collapse_range()
5419 trace_ext4_collapse_range(inode, offset, len); in ext4_collapse_range()
5425 if (ext4_should_journal_data(inode)) { in ext4_collapse_range()
5426 ret = ext4_force_commit(inode->i_sb); in ext4_collapse_range()
5431 mutex_lock(&inode->i_mutex); in ext4_collapse_range()
5436 if (offset + len >= i_size_read(inode)) { in ext4_collapse_range()
5442 if (!ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) { in ext4_collapse_range()
5448 ext4_inode_block_unlocked_dio(inode); in ext4_collapse_range()
5449 inode_dio_wait(inode); in ext4_collapse_range()
5455 down_write(&EXT4_I(inode)->i_mmap_sem); in ext4_collapse_range()
5465 ret = filemap_write_and_wait_range(inode->i_mapping, ioffset, offset); in ext4_collapse_range()
5473 ret = filemap_write_and_wait_range(inode->i_mapping, offset + len, in ext4_collapse_range()
5477 truncate_pagecache(inode, ioffset); in ext4_collapse_range()
5479 credits = ext4_writepage_trans_blocks(inode); in ext4_collapse_range()
5480 handle = ext4_journal_start(inode, EXT4_HT_TRUNCATE, credits); in ext4_collapse_range()
5486 down_write(&EXT4_I(inode)->i_data_sem); in ext4_collapse_range()
5487 ext4_discard_preallocations(inode); in ext4_collapse_range()
5489 ret = ext4_es_remove_extent(inode, punch_start, in ext4_collapse_range()
5492 up_write(&EXT4_I(inode)->i_data_sem); in ext4_collapse_range()
5496 ret = ext4_ext_remove_space(inode, punch_start, punch_stop - 1); in ext4_collapse_range()
5498 up_write(&EXT4_I(inode)->i_data_sem); in ext4_collapse_range()
5501 ext4_discard_preallocations(inode); in ext4_collapse_range()
5503 ret = ext4_ext_shift_extents(inode, handle, punch_stop, in ext4_collapse_range()
5506 up_write(&EXT4_I(inode)->i_data_sem); in ext4_collapse_range()
5510 new_size = i_size_read(inode) - len; in ext4_collapse_range()
5511 i_size_write(inode, new_size); in ext4_collapse_range()
5512 EXT4_I(inode)->i_disksize = new_size; in ext4_collapse_range()
5514 up_write(&EXT4_I(inode)->i_data_sem); in ext4_collapse_range()
5515 if (IS_SYNC(inode)) in ext4_collapse_range()
5517 inode->i_mtime = inode->i_ctime = ext4_current_time(inode); in ext4_collapse_range()
5518 ext4_mark_inode_dirty(handle, inode); in ext4_collapse_range()
5523 up_write(&EXT4_I(inode)->i_mmap_sem); in ext4_collapse_range()
5524 ext4_inode_resume_unlocked_dio(inode); in ext4_collapse_range()
5526 mutex_unlock(&inode->i_mutex); in ext4_collapse_range()
5551 ext4_swap_extents(handle_t *handle, struct inode *inode1, in ext4_swap_extents()
5552 struct inode *inode2, ext4_lblk_t lblk1, ext4_lblk_t lblk2, in ext4_swap_extents()