Lines Matching refs:inode

60 static __le32 ext4_extent_block_csum(struct inode *inode,  in ext4_extent_block_csum()  argument
63 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_extent_block_csum()
64 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_extent_block_csum()
72 static int ext4_extent_block_csum_verify(struct inode *inode, in ext4_extent_block_csum_verify() argument
77 if (!ext4_has_metadata_csum(inode->i_sb)) in ext4_extent_block_csum_verify()
81 if (et->et_checksum != ext4_extent_block_csum(inode, eh)) in ext4_extent_block_csum_verify()
86 static void ext4_extent_block_csum_set(struct inode *inode, in ext4_extent_block_csum_set() argument
91 if (!ext4_has_metadata_csum(inode->i_sb)) in ext4_extent_block_csum_set()
95 et->et_checksum = ext4_extent_block_csum(inode, eh); in ext4_extent_block_csum_set()
99 struct inode *inode,
106 struct inode *inode,
112 static int ext4_find_delayed_extent(struct inode *inode,
116 struct inode *inode, in ext4_ext_truncate_extend_restart() argument
128 err = ext4_truncate_restart_trans(handle, inode, needed); in ext4_ext_truncate_extend_restart()
140 static int ext4_ext_get_access(handle_t *handle, struct inode *inode, in ext4_ext_get_access() argument
160 struct inode *inode, struct ext4_ext_path *path) in __ext4_ext_dirty() argument
164 WARN_ON(!rwsem_is_locked(&EXT4_I(inode)->i_data_sem)); in __ext4_ext_dirty()
166 ext4_extent_block_csum_set(inode, ext_block_hdr(path->p_bh)); in __ext4_ext_dirty()
169 inode, path->p_bh); in __ext4_ext_dirty()
172 err = ext4_mark_inode_dirty(handle, inode); in __ext4_ext_dirty()
177 static ext4_fsblk_t ext4_ext_find_goal(struct inode *inode, in ext4_ext_find_goal() argument
220 return ext4_inode_to_goal_block(inode); in ext4_ext_find_goal()
227 ext4_ext_new_meta_block(handle_t *handle, struct inode *inode, in ext4_ext_new_meta_block() argument
233 goal = ext4_ext_find_goal(inode, path, le32_to_cpu(ex->ee_block)); in ext4_ext_new_meta_block()
234 newblock = ext4_new_meta_blocks(handle, inode, goal, flags, in ext4_ext_new_meta_block()
239 static inline int ext4_ext_space_block(struct inode *inode, int check) in ext4_ext_space_block() argument
243 size = (inode->i_sb->s_blocksize - sizeof(struct ext4_extent_header)) in ext4_ext_space_block()
252 static inline int ext4_ext_space_block_idx(struct inode *inode, int check) in ext4_ext_space_block_idx() argument
256 size = (inode->i_sb->s_blocksize - sizeof(struct ext4_extent_header)) in ext4_ext_space_block_idx()
265 static inline int ext4_ext_space_root(struct inode *inode, int check) in ext4_ext_space_root() argument
269 size = sizeof(EXT4_I(inode)->i_data); in ext4_ext_space_root()
279 static inline int ext4_ext_space_root_idx(struct inode *inode, int check) in ext4_ext_space_root_idx() argument
283 size = sizeof(EXT4_I(inode)->i_data); in ext4_ext_space_root_idx()
294 ext4_force_split_extent_at(handle_t *handle, struct inode *inode, in ext4_force_split_extent_at() argument
301 return ext4_split_extent_at(handle, inode, ppath, lblk, unwritten ? in ext4_force_split_extent_at()
312 int ext4_ext_calc_metadata_amount(struct inode *inode, ext4_lblk_t lblock) in ext4_ext_calc_metadata_amount() argument
314 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_ext_calc_metadata_amount()
317 idxs = ((inode->i_sb->s_blocksize - sizeof(struct ext4_extent_header)) in ext4_ext_calc_metadata_amount()
351 return ext_depth(inode) + 1; in ext4_ext_calc_metadata_amount()
355 ext4_ext_max_entries(struct inode *inode, int depth) in ext4_ext_max_entries() argument
359 if (depth == ext_depth(inode)) { in ext4_ext_max_entries()
361 max = ext4_ext_space_root(inode, 1); in ext4_ext_max_entries()
363 max = ext4_ext_space_root_idx(inode, 1); in ext4_ext_max_entries()
366 max = ext4_ext_space_block(inode, 1); in ext4_ext_max_entries()
368 max = ext4_ext_space_block_idx(inode, 1); in ext4_ext_max_entries()
374 static int ext4_valid_extent(struct inode *inode, struct ext4_extent *ext) in ext4_valid_extent() argument
383 return ext4_data_block_valid(EXT4_SB(inode->i_sb), block, len); in ext4_valid_extent()
386 static int ext4_valid_extent_idx(struct inode *inode, in ext4_valid_extent_idx() argument
391 return ext4_data_block_valid(EXT4_SB(inode->i_sb), block, 1); in ext4_valid_extent_idx()
394 static int ext4_valid_extent_entries(struct inode *inode, in ext4_valid_extent_entries() argument
407 struct ext4_super_block *es = EXT4_SB(inode->i_sb)->s_es; in ext4_valid_extent_entries()
413 if (!ext4_valid_extent(inode, ext)) in ext4_valid_extent_entries()
431 if (!ext4_valid_extent_idx(inode, ext_idx)) in ext4_valid_extent_entries()
441 struct inode *inode, struct ext4_extent_header *eh, in __ext4_ext_check() argument
459 max = ext4_ext_max_entries(inode, depth); in __ext4_ext_check()
468 if (!ext4_valid_extent_entries(inode, eh, depth)) { in __ext4_ext_check()
473 if (ext_depth(inode) != depth && in __ext4_ext_check()
474 !ext4_extent_block_csum_verify(inode, eh)) { in __ext4_ext_check()
482 ext4_error_inode(inode, function, line, 0, in __ext4_ext_check()
492 #define ext4_ext_check(inode, eh, depth, pblk) \ argument
493 __ext4_ext_check(__func__, __LINE__, (inode), (eh), (depth), (pblk))
495 int ext4_ext_check_inode(struct inode *inode) in ext4_ext_check_inode() argument
497 return ext4_ext_check(inode, ext_inode_hdr(inode), ext_depth(inode), 0); in ext4_ext_check_inode()
502 struct inode *inode, ext4_fsblk_t pblk, int depth, in __read_extent_tree_block() argument
508 bh = sb_getblk_gfp(inode->i_sb, pblk, __GFP_MOVABLE | GFP_NOFS); in __read_extent_tree_block()
513 trace_ext4_ext_load_extent(inode, pblk, _RET_IP_); in __read_extent_tree_block()
520 err = __ext4_ext_check(function, line, inode, in __read_extent_tree_block()
540 ext4_es_cache_extent(inode, prev, in __read_extent_tree_block()
546 ext4_es_cache_extent(inode, lblk, len, in __read_extent_tree_block()
558 #define read_extent_tree_block(inode, pblk, depth, flags) \ argument
559 __read_extent_tree_block(__func__, __LINE__, (inode), (pblk), \
566 int ext4_ext_precache(struct inode *inode) in ext4_ext_precache() argument
568 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_ext_precache()
573 if (!ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) in ext4_ext_precache()
577 depth = ext_depth(inode); in ext4_ext_precache()
589 path[0].p_hdr = ext_inode_hdr(inode); in ext4_ext_precache()
590 ret = ext4_ext_check(inode, path[0].p_hdr, depth, 0); in ext4_ext_precache()
606 bh = read_extent_tree_block(inode, in ext4_ext_precache()
619 ext4_set_inode_state(inode, EXT4_STATE_EXT_PRECACHED); in ext4_ext_precache()
628 static void ext4_ext_show_path(struct inode *inode, struct ext4_ext_path *path) in ext4_ext_show_path() argument
649 static void ext4_ext_show_leaf(struct inode *inode, struct ext4_ext_path *path) in ext4_ext_show_leaf() argument
651 int depth = ext_depth(inode); in ext4_ext_show_leaf()
662 ext_debug("Displaying leaf extents for inode %lu\n", inode->i_ino); in ext4_ext_show_leaf()
672 static void ext4_ext_show_move(struct inode *inode, struct ext4_ext_path *path, in ext4_ext_show_move() argument
675 int depth = ext_depth(inode); in ext4_ext_show_move()
705 #define ext4_ext_show_path(inode, path) argument
706 #define ext4_ext_show_leaf(inode, path) argument
707 #define ext4_ext_show_move(inode, path, newblock, level) argument
730 ext4_ext_binsearch_idx(struct inode *inode, in ext4_ext_binsearch_idx() argument
790 ext4_ext_binsearch(struct inode *inode, in ext4_ext_binsearch() argument
846 int ext4_ext_tree_init(handle_t *handle, struct inode *inode) in ext4_ext_tree_init() argument
850 eh = ext_inode_hdr(inode); in ext4_ext_tree_init()
854 eh->eh_max = cpu_to_le16(ext4_ext_space_root(inode, 0)); in ext4_ext_tree_init()
855 ext4_mark_inode_dirty(handle, inode); in ext4_ext_tree_init()
860 ext4_find_extent(struct inode *inode, ext4_lblk_t block, in ext4_find_extent() argument
869 eh = ext_inode_hdr(inode); in ext4_find_extent()
870 depth = ext_depth(inode); in ext4_find_extent()
896 ext4_ext_binsearch_idx(inode, path + ppos, block); in ext4_find_extent()
901 bh = read_extent_tree_block(inode, path[ppos].p_block, --i, in ext4_find_extent()
912 EXT4_ERROR_INODE(inode, in ext4_find_extent()
926 ext4_ext_binsearch(inode, path + ppos, block); in ext4_find_extent()
931 ext4_ext_show_path(inode, path); in ext4_find_extent()
948 static int ext4_ext_insert_index(handle_t *handle, struct inode *inode, in ext4_ext_insert_index() argument
955 err = ext4_ext_get_access(handle, inode, curp); in ext4_ext_insert_index()
960 EXT4_ERROR_INODE(inode, in ext4_ext_insert_index()
968 EXT4_ERROR_INODE(inode, in ext4_ext_insert_index()
995 EXT4_ERROR_INODE(inode, "ix > EXT_MAX_INDEX!"); in ext4_ext_insert_index()
1004 EXT4_ERROR_INODE(inode, "ix > EXT_LAST_INDEX!"); in ext4_ext_insert_index()
1008 err = ext4_ext_dirty(handle, inode, curp); in ext4_ext_insert_index()
1009 ext4_std_error(inode->i_sb, err); in ext4_ext_insert_index()
1024 static int ext4_ext_split(handle_t *handle, struct inode *inode, in ext4_ext_split() argument
1030 int depth = ext_depth(inode); in ext4_ext_split()
1045 EXT4_ERROR_INODE(inode, "p_ext > EXT_MAX_EXTENT!"); in ext4_ext_split()
1079 newblock = ext4_ext_new_meta_block(handle, inode, path, in ext4_ext_split()
1089 EXT4_ERROR_INODE(inode, "newblock == 0!"); in ext4_ext_split()
1093 bh = sb_getblk_gfp(inode->i_sb, newblock, __GFP_MOVABLE | GFP_NOFS); in ext4_ext_split()
1106 neh->eh_max = cpu_to_le16(ext4_ext_space_block(inode, 0)); in ext4_ext_split()
1113 EXT4_ERROR_INODE(inode, "eh_entries %d != eh_max %d!", in ext4_ext_split()
1121 ext4_ext_show_move(inode, path, newblock, depth); in ext4_ext_split()
1129 ext4_extent_block_csum_set(inode, neh); in ext4_ext_split()
1133 err = ext4_handle_dirty_metadata(handle, inode, bh); in ext4_ext_split()
1141 err = ext4_ext_get_access(handle, inode, path + depth); in ext4_ext_split()
1145 err = ext4_ext_dirty(handle, inode, path + depth); in ext4_ext_split()
1154 EXT4_ERROR_INODE(inode, "k %d < 0!", k); in ext4_ext_split()
1166 bh = sb_getblk(inode->i_sb, newblock); in ext4_ext_split()
1180 neh->eh_max = cpu_to_le16(ext4_ext_space_block_idx(inode, 0)); in ext4_ext_split()
1192 EXT4_ERROR_INODE(inode, in ext4_ext_split()
1202 ext4_ext_show_move(inode, path, newblock, i); in ext4_ext_split()
1208 ext4_extent_block_csum_set(inode, neh); in ext4_ext_split()
1212 err = ext4_handle_dirty_metadata(handle, inode, bh); in ext4_ext_split()
1220 err = ext4_ext_get_access(handle, inode, path + i); in ext4_ext_split()
1224 err = ext4_ext_dirty(handle, inode, path + i); in ext4_ext_split()
1233 err = ext4_ext_insert_index(handle, inode, path + at, in ext4_ext_split()
1248 ext4_free_blocks(handle, inode, NULL, ablocks[i], 1, in ext4_ext_split()
1265 static int ext4_ext_grow_indepth(handle_t *handle, struct inode *inode, in ext4_ext_grow_indepth() argument
1271 struct ext4_super_block *es = EXT4_SB(inode->i_sb)->s_es; in ext4_ext_grow_indepth()
1275 if (ext_depth(inode)) in ext4_ext_grow_indepth()
1276 goal = ext4_idx_pblock(EXT_FIRST_INDEX(ext_inode_hdr(inode))); in ext4_ext_grow_indepth()
1281 goal = ext4_inode_to_goal_block(inode); in ext4_ext_grow_indepth()
1282 newblock = ext4_new_meta_blocks(handle, inode, goal, flags, in ext4_ext_grow_indepth()
1287 bh = sb_getblk_gfp(inode->i_sb, newblock, __GFP_MOVABLE | GFP_NOFS); in ext4_ext_grow_indepth()
1299 memmove(bh->b_data, EXT4_I(inode)->i_data, in ext4_ext_grow_indepth()
1300 sizeof(EXT4_I(inode)->i_data)); in ext4_ext_grow_indepth()
1306 if (ext_depth(inode)) in ext4_ext_grow_indepth()
1307 neh->eh_max = cpu_to_le16(ext4_ext_space_block_idx(inode, 0)); in ext4_ext_grow_indepth()
1309 neh->eh_max = cpu_to_le16(ext4_ext_space_block(inode, 0)); in ext4_ext_grow_indepth()
1311 ext4_extent_block_csum_set(inode, neh); in ext4_ext_grow_indepth()
1315 err = ext4_handle_dirty_metadata(handle, inode, bh); in ext4_ext_grow_indepth()
1320 neh = ext_inode_hdr(inode); in ext4_ext_grow_indepth()
1325 neh->eh_max = cpu_to_le16(ext4_ext_space_root_idx(inode, 0)); in ext4_ext_grow_indepth()
1335 ext4_mark_inode_dirty(handle, inode); in ext4_ext_grow_indepth()
1347 static int ext4_ext_create_new_leaf(handle_t *handle, struct inode *inode, in ext4_ext_create_new_leaf() argument
1358 i = depth = ext_depth(inode); in ext4_ext_create_new_leaf()
1372 err = ext4_ext_split(handle, inode, mb_flags, path, newext, i); in ext4_ext_create_new_leaf()
1377 path = ext4_find_extent(inode, in ext4_ext_create_new_leaf()
1384 err = ext4_ext_grow_indepth(handle, inode, mb_flags); in ext4_ext_create_new_leaf()
1389 path = ext4_find_extent(inode, in ext4_ext_create_new_leaf()
1401 depth = ext_depth(inode); in ext4_ext_create_new_leaf()
1419 static int ext4_ext_search_left(struct inode *inode, in ext4_ext_search_left() argument
1428 EXT4_ERROR_INODE(inode, "path == NULL *logical %d!", *logical); in ext4_ext_search_left()
1445 EXT4_ERROR_INODE(inode, in ext4_ext_search_left()
1453 EXT4_ERROR_INODE(inode, in ext4_ext_search_left()
1466 EXT4_ERROR_INODE(inode, in ext4_ext_search_left()
1484 static int ext4_ext_search_right(struct inode *inode, in ext4_ext_search_right() argument
1498 EXT4_ERROR_INODE(inode, "path == NULL *logical %d!", *logical); in ext4_ext_search_right()
1515 EXT4_ERROR_INODE(inode, in ext4_ext_search_right()
1523 EXT4_ERROR_INODE(inode, in ext4_ext_search_right()
1533 EXT4_ERROR_INODE(inode, in ext4_ext_search_right()
1563 bh = read_extent_tree_block(inode, block, in ext4_ext_search_right()
1573 bh = read_extent_tree_block(inode, block, path->p_depth - depth, 0); in ext4_ext_search_right()
1659 static int ext4_ext_correct_indexes(handle_t *handle, struct inode *inode, in ext4_ext_correct_indexes() argument
1663 int depth = ext_depth(inode); in ext4_ext_correct_indexes()
1672 EXT4_ERROR_INODE(inode, in ext4_ext_correct_indexes()
1692 err = ext4_ext_get_access(handle, inode, path + k); in ext4_ext_correct_indexes()
1696 err = ext4_ext_dirty(handle, inode, path + k); in ext4_ext_correct_indexes()
1704 err = ext4_ext_get_access(handle, inode, path + k); in ext4_ext_correct_indexes()
1708 err = ext4_ext_dirty(handle, inode, path + k); in ext4_ext_correct_indexes()
1717 ext4_can_extents_be_merged(struct inode *inode, struct ext4_extent *ex1, in ext4_can_extents_be_merged() argument
1740 (ext4_test_inode_state(inode, EXT4_STATE_DIO_UNWRITTEN) || in ext4_can_extents_be_merged()
1741 atomic_read(&EXT4_I(inode)->i_unwritten) || in ext4_can_extents_be_merged()
1761 static int ext4_ext_try_to_merge_right(struct inode *inode, in ext4_ext_try_to_merge_right() argument
1769 depth = ext_depth(inode); in ext4_ext_try_to_merge_right()
1774 if (!ext4_can_extents_be_merged(inode, ex, ex + 1)) in ext4_ext_try_to_merge_right()
1792 EXT4_ERROR_INODE(inode, "eh->eh_entries = 0!"); in ext4_ext_try_to_merge_right()
1803 struct inode *inode, in ext4_ext_try_to_merge_up() argument
1807 unsigned max_root = ext4_ext_space_root(inode, 0); in ext4_ext_try_to_merge_up()
1839 ext4_free_blocks(handle, inode, NULL, blk, 1, in ext4_ext_try_to_merge_up()
1848 struct inode *inode, in ext4_ext_try_to_merge() argument
1855 depth = ext_depth(inode); in ext4_ext_try_to_merge()
1860 merge_done = ext4_ext_try_to_merge_right(inode, path, ex - 1); in ext4_ext_try_to_merge()
1863 (void) ext4_ext_try_to_merge_right(inode, path, ex); in ext4_ext_try_to_merge()
1865 ext4_ext_try_to_merge_up(handle, inode, path); in ext4_ext_try_to_merge()
1877 struct inode *inode, in ext4_ext_check_overlap() argument
1887 depth = ext_depth(inode); in ext4_ext_check_overlap()
1925 int ext4_ext_insert_extent(handle_t *handle, struct inode *inode, in ext4_ext_insert_extent() argument
1941 EXT4_ERROR_INODE(inode, "ext4_ext_get_actual_len(newext) == 0"); in ext4_ext_insert_extent()
1944 depth = ext_depth(inode); in ext4_ext_insert_extent()
1948 EXT4_ERROR_INODE(inode, "path[%d].p_hdr == NULL", depth); in ext4_ext_insert_extent()
1975 if (ext4_can_extents_be_merged(inode, ex, newext)) { in ext4_ext_insert_extent()
1984 err = ext4_ext_get_access(handle, inode, in ext4_ext_insert_extent()
2000 if (ext4_can_extents_be_merged(inode, newext, ex)) { in ext4_ext_insert_extent()
2010 err = ext4_ext_get_access(handle, inode, in ext4_ext_insert_extent()
2028 depth = ext_depth(inode); in ext4_ext_insert_extent()
2041 npath = ext4_find_extent(inode, next, NULL, 0); in ext4_ext_insert_extent()
2062 err = ext4_ext_create_new_leaf(handle, inode, mb_flags, gb_flags, in ext4_ext_insert_extent()
2066 depth = ext_depth(inode); in ext4_ext_insert_extent()
2072 err = ext4_ext_get_access(handle, inode, path + depth); in ext4_ext_insert_extent()
2130 ext4_ext_try_to_merge(handle, inode, path, nearex); in ext4_ext_insert_extent()
2134 err = ext4_ext_correct_indexes(handle, inode, path); in ext4_ext_insert_extent()
2138 err = ext4_ext_dirty(handle, inode, path + path->p_depth); in ext4_ext_insert_extent()
2146 static int ext4_fill_fiemap_extents(struct inode *inode, in ext4_fill_fiemap_extents() argument
2157 unsigned char blksize_bits = inode->i_sb->s_blocksize_bits; in ext4_fill_fiemap_extents()
2162 down_read(&EXT4_I(inode)->i_data_sem); in ext4_fill_fiemap_extents()
2164 path = ext4_find_extent(inode, block, &path, 0); in ext4_fill_fiemap_extents()
2166 up_read(&EXT4_I(inode)->i_data_sem); in ext4_fill_fiemap_extents()
2172 depth = ext_depth(inode); in ext4_fill_fiemap_extents()
2174 up_read(&EXT4_I(inode)->i_data_sem); in ext4_fill_fiemap_extents()
2175 EXT4_ERROR_INODE(inode, "path[%d].p_hdr == NULL", depth); in ext4_fill_fiemap_extents()
2235 next_del = ext4_find_delayed_extent(inode, &es); in ext4_fill_fiemap_extents()
2241 up_read(&EXT4_I(inode)->i_data_sem); in ext4_fill_fiemap_extents()
2244 EXT4_ERROR_INODE(inode, "es.es_len == 0"); in ext4_fill_fiemap_extents()
2264 EXT4_ERROR_INODE(inode, in ext4_fill_fiemap_extents()
2301 ext4_ext_put_gap_in_cache(struct inode *inode, struct ext4_ext_path *path, in ext4_ext_put_gap_in_cache() argument
2304 int depth = ext_depth(inode); in ext4_ext_put_gap_in_cache()
2340 ext4_es_find_delayed_extent_range(inode, lblock, lblock + len - 1, &es); in ext4_ext_put_gap_in_cache()
2348 ext4_es_insert_extent(inode, lblock, len, ~0, EXTENT_STATUS_HOLE); in ext4_ext_put_gap_in_cache()
2355 static int ext4_ext_rm_idx(handle_t *handle, struct inode *inode, in ext4_ext_rm_idx() argument
2366 EXT4_ERROR_INODE(inode, "path->p_hdr->eh_entries == 0"); in ext4_ext_rm_idx()
2369 err = ext4_ext_get_access(handle, inode, path); in ext4_ext_rm_idx()
2380 err = ext4_ext_dirty(handle, inode, path); in ext4_ext_rm_idx()
2384 trace_ext4_ext_rm_idx(inode, leaf); in ext4_ext_rm_idx()
2386 ext4_free_blocks(handle, inode, NULL, leaf, 1, in ext4_ext_rm_idx()
2393 err = ext4_ext_get_access(handle, inode, path); in ext4_ext_rm_idx()
2397 err = ext4_ext_dirty(handle, inode, path); in ext4_ext_rm_idx()
2411 int ext4_ext_calc_credits_for_single_extent(struct inode *inode, int nrblocks, in ext4_ext_calc_credits_for_single_extent() argument
2415 int depth = ext_depth(inode); in ext4_ext_calc_credits_for_single_extent()
2431 ret = 2 + EXT4_META_TRANS_BLOCKS(inode->i_sb); in ext4_ext_calc_credits_for_single_extent()
2436 return ext4_chunk_trans_blocks(inode, nrblocks); in ext4_ext_calc_credits_for_single_extent()
2448 int ext4_ext_index_trans_blocks(struct inode *inode, int extents) in ext4_ext_index_trans_blocks() argument
2454 if (ext4_has_inline_data(inode)) in ext4_ext_index_trans_blocks()
2457 depth = ext_depth(inode); in ext4_ext_index_trans_blocks()
2467 static inline int get_default_free_blocks_flags(struct inode *inode) in get_default_free_blocks_flags() argument
2469 if (S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode)) in get_default_free_blocks_flags()
2471 else if (ext4_should_journal_data(inode)) in get_default_free_blocks_flags()
2476 static int ext4_remove_blocks(handle_t *handle, struct inode *inode, in ext4_remove_blocks() argument
2481 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_remove_blocks()
2484 int flags = get_default_free_blocks_flags(inode); in ext4_remove_blocks()
2495 trace_ext4_remove_blocks(inode, ex, from, to, *partial_cluster); in ext4_remove_blocks()
2504 ext4_free_blocks(handle, inode, NULL, in ext4_remove_blocks()
2512 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_remove_blocks()
2520 if (ext_depth(inode) > sbi->s_depth_max) in ext4_remove_blocks()
2521 sbi->s_depth_max = ext_depth(inode); in ext4_remove_blocks()
2544 ext4_free_blocks(handle, inode, NULL, pblk, num, flags); in ext4_remove_blocks()
2592 ext4_ext_rm_leaf(handle_t *handle, struct inode *inode, in ext4_ext_rm_leaf() argument
2597 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_ext_rm_leaf()
2599 int depth = ext_depth(inode), credits; in ext4_ext_rm_leaf()
2615 EXT4_ERROR_INODE(inode, "path[%d].p_hdr == NULL", depth); in ext4_ext_rm_leaf()
2626 trace_ext4_ext_rm_leaf(inode, start, ex, *partial_cluster); in ext4_ext_rm_leaf()
2665 EXT4_ERROR_INODE(inode, in ext4_ext_rm_leaf()
2685 credits = 7 + 2*(ex_ee_len/EXT4_BLOCKS_PER_GROUP(inode->i_sb)); in ext4_ext_rm_leaf()
2688 credits += (ext_depth(inode)) + 1; in ext4_ext_rm_leaf()
2690 credits += EXT4_MAXQUOTAS_TRANS_BLOCKS(inode->i_sb); in ext4_ext_rm_leaf()
2692 err = ext4_ext_truncate_extend_restart(handle, inode, credits); in ext4_ext_rm_leaf()
2696 err = ext4_ext_get_access(handle, inode, path + depth); in ext4_ext_rm_leaf()
2700 err = ext4_remove_blocks(handle, inode, ex, partial_cluster, in ext4_ext_rm_leaf()
2737 err = ext4_ext_dirty(handle, inode, path + depth); in ext4_ext_rm_leaf()
2749 err = ext4_ext_correct_indexes(handle, inode, path); in ext4_ext_rm_leaf()
2761 ext4_free_blocks(handle, inode, NULL, in ext4_ext_rm_leaf()
2764 get_default_free_blocks_flags(inode)); in ext4_ext_rm_leaf()
2772 err = ext4_ext_rm_idx(handle, inode, path, depth); in ext4_ext_rm_leaf()
2799 int ext4_ext_remove_space(struct inode *inode, ext4_lblk_t start, in ext4_ext_remove_space() argument
2802 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_ext_remove_space()
2803 int depth = ext_depth(inode); in ext4_ext_remove_space()
2812 handle = ext4_journal_start(inode, EXT4_HT_TRUNCATE, depth + 1); in ext4_ext_remove_space()
2817 trace_ext4_ext_remove_space(inode, start, end, depth); in ext4_ext_remove_space()
2832 path = ext4_find_extent(inode, end, NULL, EXT4_EX_NOCACHE); in ext4_ext_remove_space()
2837 depth = ext_depth(inode); in ext4_ext_remove_space()
2842 EXT4_ERROR_INODE(inode, in ext4_ext_remove_space()
2878 err = ext4_force_split_extent_at(handle, inode, &path, in ext4_ext_remove_space()
2893 err = ext4_ext_search_right(inode, path, &lblk, &pblk, in ext4_ext_remove_space()
2906 depth = ext_depth(inode); in ext4_ext_remove_space()
2920 path[0].p_hdr = ext_inode_hdr(inode); in ext4_ext_remove_space()
2923 if (ext4_ext_check(inode, path[0].p_hdr, depth, 0)) { in ext4_ext_remove_space()
2933 err = ext4_ext_rm_leaf(handle, inode, path, in ext4_ext_remove_space()
2970 bh = read_extent_tree_block(inode, in ext4_ext_remove_space()
2997 err = ext4_ext_rm_idx(handle, inode, path, i); in ext4_ext_remove_space()
3007 trace_ext4_ext_remove_space_done(inode, start, end, depth, in ext4_ext_remove_space()
3018 ext4_free_blocks(handle, inode, NULL, in ext4_ext_remove_space()
3021 get_default_free_blocks_flags(inode)); in ext4_ext_remove_space()
3030 err = ext4_ext_get_access(handle, inode, path); in ext4_ext_remove_space()
3032 ext_inode_hdr(inode)->eh_depth = 0; in ext4_ext_remove_space()
3033 ext_inode_hdr(inode)->eh_max = in ext4_ext_remove_space()
3034 cpu_to_le16(ext4_ext_space_root(inode, 0)); in ext4_ext_remove_space()
3035 err = ext4_ext_dirty(handle, inode, path); in ext4_ext_remove_space()
3100 static int ext4_zeroout_es(struct inode *inode, struct ext4_extent *ex) in ext4_zeroout_es() argument
3113 return ext4_es_insert_extent(inode, ee_block, ee_len, ee_pblock, in ext4_zeroout_es()
3118 static int ext4_ext_zeroout(struct inode *inode, struct ext4_extent *ex) in ext4_ext_zeroout() argument
3127 if (ext4_encrypted_inode(inode)) in ext4_ext_zeroout()
3128 return ext4_encrypted_zeroout(inode, ex); in ext4_ext_zeroout()
3130 ret = sb_issue_zeroout(inode->i_sb, ee_pblock, ee_len, GFP_NOFS); in ext4_ext_zeroout()
3159 struct inode *inode, in ext4_split_extent_at() argument
3177 "block %llu\n", inode->i_ino, (unsigned long long)split); in ext4_split_extent_at()
3179 ext4_ext_show_leaf(inode, path); in ext4_split_extent_at()
3181 depth = ext_depth(inode); in ext4_split_extent_at()
3193 err = ext4_ext_get_access(handle, inode, path + depth); in ext4_split_extent_at()
3209 ext4_ext_try_to_merge(handle, inode, path, ex); in ext4_split_extent_at()
3211 err = ext4_ext_dirty(handle, inode, path + path->p_depth); in ext4_split_extent_at()
3225 err = ext4_ext_dirty(handle, inode, path + depth); in ext4_split_extent_at()
3236 err = ext4_ext_insert_extent(handle, inode, ppath, &newex, flags); in ext4_split_extent_at()
3240 err = ext4_ext_zeroout(inode, ex2); in ext4_split_extent_at()
3247 err = ext4_ext_zeroout(inode, ex); in ext4_split_extent_at()
3255 err = ext4_ext_zeroout(inode, &orig_ex); in ext4_split_extent_at()
3267 ext4_ext_try_to_merge(handle, inode, path, ex); in ext4_split_extent_at()
3268 err = ext4_ext_dirty(handle, inode, path + path->p_depth); in ext4_split_extent_at()
3273 err = ext4_zeroout_es(inode, &zero_ex); in ext4_split_extent_at()
3280 ext4_ext_show_leaf(inode, path); in ext4_split_extent_at()
3285 ext4_ext_dirty(handle, inode, path + path->p_depth); in ext4_split_extent_at()
3301 struct inode *inode, in ext4_split_extent() argument
3316 depth = ext_depth(inode); in ext4_split_extent()
3330 err = ext4_split_extent_at(handle, inode, ppath, in ext4_split_extent()
3341 path = ext4_find_extent(inode, map->m_lblk, ppath, 0); in ext4_split_extent()
3344 depth = ext_depth(inode); in ext4_split_extent()
3347 EXT4_ERROR_INODE(inode, "unexpected hole at %lu", in ext4_split_extent()
3361 err = ext4_split_extent_at(handle, inode, ppath, in ext4_split_extent()
3367 ext4_ext_show_leaf(inode, path); in ext4_split_extent()
3393 struct inode *inode, in ext4_ext_convert_to_initialized() argument
3411 "block %llu, max_blocks %u\n", inode->i_ino, in ext4_ext_convert_to_initialized()
3414 sbi = EXT4_SB(inode->i_sb); in ext4_ext_convert_to_initialized()
3415 eof_block = (inode->i_size + inode->i_sb->s_blocksize - 1) >> in ext4_ext_convert_to_initialized()
3416 inode->i_sb->s_blocksize_bits; in ext4_ext_convert_to_initialized()
3420 depth = ext_depth(inode); in ext4_ext_convert_to_initialized()
3427 trace_ext4_ext_convert_to_initialized_enter(inode, map, ex); in ext4_ext_convert_to_initialized()
3475 err = ext4_ext_get_access(handle, inode, path + depth); in ext4_ext_convert_to_initialized()
3479 trace_ext4_ext_convert_to_initialized_fastpath(inode, in ext4_ext_convert_to_initialized()
3521 err = ext4_ext_get_access(handle, inode, path + depth); in ext4_ext_convert_to_initialized()
3525 trace_ext4_ext_convert_to_initialized_fastpath(inode, in ext4_ext_convert_to_initialized()
3543 ext4_ext_dirty(handle, inode, path + depth); in ext4_ext_convert_to_initialized()
3560 (inode->i_sb->s_blocksize_bits - 10); in ext4_ext_convert_to_initialized()
3562 if (ext4_encrypted_inode(inode)) in ext4_ext_convert_to_initialized()
3567 err = ext4_ext_zeroout(inode, ex); in ext4_ext_convert_to_initialized()
3574 err = ext4_ext_get_access(handle, inode, path + depth); in ext4_ext_convert_to_initialized()
3578 ext4_ext_try_to_merge(handle, inode, path, ex); in ext4_ext_convert_to_initialized()
3579 err = ext4_ext_dirty(handle, inode, path + path->p_depth); in ext4_ext_convert_to_initialized()
3601 err = ext4_ext_zeroout(inode, &zero_ex); in ext4_ext_convert_to_initialized()
3614 err = ext4_ext_zeroout(inode, &zero_ex); in ext4_ext_convert_to_initialized()
3625 err = ext4_split_extent(handle, inode, ppath, &split_map, split_flag, in ext4_ext_convert_to_initialized()
3632 err = ext4_zeroout_es(inode, &zero_ex); in ext4_ext_convert_to_initialized()
3661 struct inode *inode, in ext4_split_convert_extents() argument
3674 __func__, inode->i_ino, in ext4_split_convert_extents()
3677 eof_block = (inode->i_size + inode->i_sb->s_blocksize - 1) >> in ext4_split_convert_extents()
3678 inode->i_sb->s_blocksize_bits; in ext4_split_convert_extents()
3685 depth = ext_depth(inode); in ext4_split_convert_extents()
3700 return ext4_split_extent(handle, inode, ppath, map, split_flag, flags); in ext4_split_convert_extents()
3704 struct inode *inode, in ext4_convert_unwritten_extents_endio() argument
3715 depth = ext_depth(inode); in ext4_convert_unwritten_extents_endio()
3721 "block %llu, max_blocks %u\n", inode->i_ino, in ext4_convert_unwritten_extents_endio()
3734 inode->i_ino, (unsigned long long)ee_block, ee_len, in ext4_convert_unwritten_extents_endio()
3737 err = ext4_split_convert_extents(handle, inode, map, ppath, in ext4_convert_unwritten_extents_endio()
3741 path = ext4_find_extent(inode, map->m_lblk, ppath, 0); in ext4_convert_unwritten_extents_endio()
3744 depth = ext_depth(inode); in ext4_convert_unwritten_extents_endio()
3748 err = ext4_ext_get_access(handle, inode, path + depth); in ext4_convert_unwritten_extents_endio()
3757 ext4_ext_try_to_merge(handle, inode, path, ex); in ext4_convert_unwritten_extents_endio()
3760 err = ext4_ext_dirty(handle, inode, path + path->p_depth); in ext4_convert_unwritten_extents_endio()
3762 ext4_ext_show_leaf(inode, path); in ext4_convert_unwritten_extents_endio()
3777 static int check_eofblocks_fl(handle_t *handle, struct inode *inode, in check_eofblocks_fl() argument
3786 if (!ext4_test_inode_flag(inode, EXT4_INODE_EOFBLOCKS)) in check_eofblocks_fl()
3789 depth = ext_depth(inode); in check_eofblocks_fl()
3823 ext4_clear_inode_flag(inode, EXT4_INODE_EOFBLOCKS); in check_eofblocks_fl()
3824 return ext4_mark_inode_dirty(handle, inode); in check_eofblocks_fl()
3832 int ext4_find_delalloc_range(struct inode *inode, in ext4_find_delalloc_range() argument
3838 ext4_es_find_delayed_extent_range(inode, lblk_start, lblk_end, &es); in ext4_find_delalloc_range()
3850 int ext4_find_delalloc_cluster(struct inode *inode, ext4_lblk_t lblk) in ext4_find_delalloc_cluster() argument
3852 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_find_delalloc_cluster()
3857 return ext4_find_delalloc_range(inode, lblk_start, lblk_end); in ext4_find_delalloc_cluster()
3896 get_reserved_cluster_alloc(struct inode *inode, ext4_lblk_t lblk_start, in get_reserved_cluster_alloc() argument
3899 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in get_reserved_cluster_alloc()
3910 trace_ext4_get_reserved_cluster_alloc(inode, lblk_start, num_blks); in get_reserved_cluster_alloc()
3918 if (ext4_find_delalloc_range(inode, lblk_from, lblk_to)) in get_reserved_cluster_alloc()
3928 if (ext4_find_delalloc_range(inode, lblk_from, lblk_to)) in get_reserved_cluster_alloc()
3936 convert_initialized_extent(handle_t *handle, struct inode *inode, in convert_initialized_extent() argument
3955 depth = ext_depth(inode); in convert_initialized_extent()
3961 "block %llu, max_blocks %u\n", __func__, inode->i_ino, in convert_initialized_extent()
3965 err = ext4_split_convert_extents(handle, inode, map, ppath, in convert_initialized_extent()
3969 path = ext4_find_extent(inode, map->m_lblk, ppath, 0); in convert_initialized_extent()
3972 depth = ext_depth(inode); in convert_initialized_extent()
3975 EXT4_ERROR_INODE(inode, "unexpected hole at %lu", in convert_initialized_extent()
3981 err = ext4_ext_get_access(handle, inode, path + depth); in convert_initialized_extent()
3990 ext4_ext_try_to_merge(handle, inode, path, ex); in convert_initialized_extent()
3993 err = ext4_ext_dirty(handle, inode, path + path->p_depth); in convert_initialized_extent()
3996 ext4_ext_show_leaf(inode, path); in convert_initialized_extent()
3998 ext4_update_inode_fsync_trans(handle, inode, 1); in convert_initialized_extent()
3999 err = check_eofblocks_fl(handle, inode, map->m_lblk, path, map->m_len); in convert_initialized_extent()
4010 ext4_ext_handle_unwritten_extents(handle_t *handle, struct inode *inode, in ext4_ext_handle_unwritten_extents() argument
4018 ext4_io_end_t *io = ext4_inode_aio(inode); in ext4_ext_handle_unwritten_extents()
4022 inode->i_ino, (unsigned long long)map->m_lblk, map->m_len, in ext4_ext_handle_unwritten_extents()
4024 ext4_ext_show_leaf(inode, path); in ext4_ext_handle_unwritten_extents()
4032 trace_ext4_ext_handle_unwritten_extents(inode, map, flags, in ext4_ext_handle_unwritten_extents()
4037 ret = ext4_split_convert_extents(handle, inode, map, ppath, in ext4_ext_handle_unwritten_extents()
4047 ext4_set_io_unwritten_flag(inode, io); in ext4_ext_handle_unwritten_extents()
4049 ext4_set_inode_state(inode, EXT4_STATE_DIO_UNWRITTEN); in ext4_ext_handle_unwritten_extents()
4055 ret = ext4_convert_unwritten_extents_endio(handle, inode, map, in ext4_ext_handle_unwritten_extents()
4058 ext4_update_inode_fsync_trans(handle, inode, 1); in ext4_ext_handle_unwritten_extents()
4059 err = check_eofblocks_fl(handle, inode, map->m_lblk, in ext4_ext_handle_unwritten_extents()
4094 ret = ext4_ext_convert_to_initialized(handle, inode, map, ppath, flags); in ext4_ext_handle_unwritten_extents()
4096 ext4_update_inode_fsync_trans(handle, inode, 1); in ext4_ext_handle_unwritten_extents()
4112 unmap_underlying_metadata_blocks(inode->i_sb->s_bdev, in ext4_ext_handle_unwritten_extents()
4128 reserved_clusters = get_reserved_cluster_alloc(inode, in ext4_ext_handle_unwritten_extents()
4131 ext4_da_update_reserve_space(inode, in ext4_ext_handle_unwritten_extents()
4139 err = check_eofblocks_fl(handle, inode, map->m_lblk, path, in ext4_ext_handle_unwritten_extents()
4147 ext4_ext_show_leaf(inode, path); in ext4_ext_handle_unwritten_extents()
4275 int ext4_ext_map_blocks(handle_t *handle, struct inode *inode, in ext4_ext_map_blocks() argument
4280 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_ext_map_blocks()
4286 ext4_io_end_t *io = ext4_inode_aio(inode); in ext4_ext_map_blocks()
4292 map->m_lblk, map->m_len, inode->i_ino); in ext4_ext_map_blocks()
4293 trace_ext4_ext_map_blocks_enter(inode, map->m_lblk, map->m_len, flags); in ext4_ext_map_blocks()
4296 path = ext4_find_extent(inode, map->m_lblk, NULL, 0); in ext4_ext_map_blocks()
4303 depth = ext_depth(inode); in ext4_ext_map_blocks()
4311 EXT4_ERROR_INODE(inode, "bad extent address " in ext4_ext_map_blocks()
4332 trace_ext4_ext_show_extent(inode, ee_block, ee_start, ee_len); in ext4_ext_map_blocks()
4349 handle, inode, map, &path, in ext4_ext_map_blocks()
4356 handle, inode, map, &path, flags, in ext4_ext_map_blocks()
4375 ext4_ext_put_gap_in_cache(inode, path, map->m_lblk); in ext4_ext_map_blocks()
4390 get_implied_cluster_alloc(inode->i_sb, map, ex, path)) { in ext4_ext_map_blocks()
4399 err = ext4_ext_search_left(inode, path, &ar.lleft, &ar.pleft); in ext4_ext_map_blocks()
4404 err = ext4_ext_search_right(inode, path, &ar.lright, &ar.pright, &ex2); in ext4_ext_map_blocks()
4411 get_implied_cluster_alloc(inode->i_sb, map, ex2, path)) { in ext4_ext_map_blocks()
4433 err = ext4_ext_check_overlap(sbi, inode, &newex, path); in ext4_ext_map_blocks()
4440 ar.inode = inode; in ext4_ext_map_blocks()
4441 ar.goal = ext4_ext_find_goal(inode, path, map->m_lblk); in ext4_ext_map_blocks()
4455 if (S_ISREG(inode->i_mode)) in ext4_ext_map_blocks()
4498 err = check_eofblocks_fl(handle, inode, map->m_lblk, in ext4_ext_map_blocks()
4501 err = ext4_ext_insert_extent(handle, inode, &path, in ext4_ext_map_blocks()
4506 ext4_set_io_unwritten_flag(inode, io); in ext4_ext_map_blocks()
4508 ext4_set_inode_state(inode, in ext4_ext_map_blocks()
4518 ext4_discard_preallocations(inode); in ext4_ext_map_blocks()
4519 ext4_free_blocks(handle, inode, NULL, newblock, in ext4_ext_map_blocks()
4540 reserved_clusters = get_reserved_cluster_alloc(inode, in ext4_ext_map_blocks()
4545 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_ext_map_blocks()
4588 dquot_reserve_block(inode, in ext4_ext_map_blocks()
4601 ext4_da_update_reserve_space(inode, allocated_clusters, in ext4_ext_map_blocks()
4611 ext4_update_inode_fsync_trans(handle, inode, 1); in ext4_ext_map_blocks()
4613 ext4_update_inode_fsync_trans(handle, inode, 0); in ext4_ext_map_blocks()
4617 ext4_ext_show_leaf(inode, path); in ext4_ext_map_blocks()
4625 trace_ext4_ext_map_blocks_exit(inode, flags, map, in ext4_ext_map_blocks()
4630 void ext4_ext_truncate(handle_t *handle, struct inode *inode) in ext4_ext_truncate() argument
4632 struct super_block *sb = inode->i_sb; in ext4_ext_truncate()
4643 EXT4_I(inode)->i_disksize = inode->i_size; in ext4_ext_truncate()
4644 ext4_mark_inode_dirty(handle, inode); in ext4_ext_truncate()
4646 last_block = (inode->i_size + sb->s_blocksize - 1) in ext4_ext_truncate()
4649 err = ext4_es_remove_extent(inode, last_block, in ext4_ext_truncate()
4657 ext4_std_error(inode->i_sb, err); in ext4_ext_truncate()
4660 err = ext4_ext_remove_space(inode, last_block, EXT_MAX_BLOCKS - 1); in ext4_ext_truncate()
4661 ext4_std_error(inode->i_sb, err); in ext4_ext_truncate()
4668 struct inode *inode = file_inode(file); in ext4_alloc_file_blocks() local
4691 credits = ext4_chunk_trans_blocks(inode, len); in ext4_alloc_file_blocks()
4695 if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) in ext4_alloc_file_blocks()
4696 depth = ext_depth(inode); in ext4_alloc_file_blocks()
4705 if (depth >= 0 && depth != ext_depth(inode)) { in ext4_alloc_file_blocks()
4706 credits = ext4_chunk_trans_blocks(inode, len); in ext4_alloc_file_blocks()
4707 depth = ext_depth(inode); in ext4_alloc_file_blocks()
4710 handle = ext4_journal_start(inode, EXT4_HT_MAP_BLOCKS, in ext4_alloc_file_blocks()
4716 ret = ext4_map_blocks(handle, inode, &map, flags); in ext4_alloc_file_blocks()
4720 inode->i_ino, map.m_lblk, in ext4_alloc_file_blocks()
4722 ext4_mark_inode_dirty(handle, inode); in ext4_alloc_file_blocks()
4728 epos = (loff_t)map.m_lblk << inode->i_blkbits; in ext4_alloc_file_blocks()
4729 inode->i_ctime = ext4_current_time(inode); in ext4_alloc_file_blocks()
4733 if (ext4_update_inode_size(inode, epos) & 0x1) in ext4_alloc_file_blocks()
4734 inode->i_mtime = inode->i_ctime; in ext4_alloc_file_blocks()
4736 if (epos > inode->i_size) in ext4_alloc_file_blocks()
4737 ext4_set_inode_flag(inode, in ext4_alloc_file_blocks()
4740 ext4_mark_inode_dirty(handle, inode); in ext4_alloc_file_blocks()
4746 ext4_should_retry_alloc(inode->i_sb, &retries)) { in ext4_alloc_file_blocks()
4757 struct inode *inode = file_inode(file); in ext4_zero_range() local
4767 unsigned int blkbits = inode->i_blkbits; in ext4_zero_range()
4769 trace_ext4_zero_range(inode, offset, len, mode); in ext4_zero_range()
4771 if (!S_ISREG(inode->i_mode)) in ext4_zero_range()
4775 if (ext4_should_journal_data(inode)) { in ext4_zero_range()
4776 ret = ext4_force_commit(inode->i_sb); in ext4_zero_range()
4802 mutex_lock(&inode->i_mutex); in ext4_zero_range()
4807 if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) { in ext4_zero_range()
4813 offset + len > i_size_read(inode)) { in ext4_zero_range()
4815 ret = inode_newsize_ok(inode, new_size); in ext4_zero_range()
4825 ext4_inode_block_unlocked_dio(inode); in ext4_zero_range()
4826 inode_dio_wait(inode); in ext4_zero_range()
4849 down_write(&EXT4_I(inode)->i_mmap_sem); in ext4_zero_range()
4850 ret = ext4_update_disksize_before_punch(inode, offset, len); in ext4_zero_range()
4852 up_write(&EXT4_I(inode)->i_mmap_sem); in ext4_zero_range()
4856 truncate_pagecache_range(inode, start, end - 1); in ext4_zero_range()
4857 inode->i_mtime = inode->i_ctime = ext4_current_time(inode); in ext4_zero_range()
4861 up_write(&EXT4_I(inode)->i_mmap_sem); in ext4_zero_range()
4872 credits = (2 * ext4_ext_index_trans_blocks(inode, 2)) + 1; in ext4_zero_range()
4873 if (ext4_should_journal_data(inode)) in ext4_zero_range()
4875 handle = ext4_journal_start(inode, EXT4_HT_MISC, credits); in ext4_zero_range()
4878 ext4_std_error(inode->i_sb, ret); in ext4_zero_range()
4882 inode->i_mtime = inode->i_ctime = ext4_current_time(inode); in ext4_zero_range()
4884 ext4_update_inode_size(inode, new_size); in ext4_zero_range()
4890 if ((offset + len) > i_size_read(inode)) in ext4_zero_range()
4891 ext4_set_inode_flag(inode, EXT4_INODE_EOFBLOCKS); in ext4_zero_range()
4893 ext4_mark_inode_dirty(handle, inode); in ext4_zero_range()
4896 ret = ext4_zero_partial_blocks(handle, inode, offset, len); in ext4_zero_range()
4903 ext4_inode_resume_unlocked_dio(inode); in ext4_zero_range()
4905 mutex_unlock(&inode->i_mutex); in ext4_zero_range()
4918 struct inode *inode = file_inode(file); in ext4_fallocate() local
4924 unsigned int blkbits = inode->i_blkbits; in ext4_fallocate()
4936 if (ext4_encrypted_inode(inode) && in ext4_fallocate()
4948 return ext4_punch_hole(inode, offset, len); in ext4_fallocate()
4950 ret = ext4_convert_inline_data(inode); in ext4_fallocate()
4955 return ext4_collapse_range(inode, offset, len); in ext4_fallocate()
4958 return ext4_insert_range(inode, offset, len); in ext4_fallocate()
4963 trace_ext4_fallocate_enter(inode, offset, len, mode); in ext4_fallocate()
4976 mutex_lock(&inode->i_mutex); in ext4_fallocate()
4981 if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) { in ext4_fallocate()
4987 offset + len > i_size_read(inode)) { in ext4_fallocate()
4989 ret = inode_newsize_ok(inode, new_size); in ext4_fallocate()
4995 ext4_inode_block_unlocked_dio(inode); in ext4_fallocate()
4996 inode_dio_wait(inode); in ext4_fallocate()
5000 ext4_inode_resume_unlocked_dio(inode); in ext4_fallocate()
5004 if (file->f_flags & O_SYNC && EXT4_SB(inode->i_sb)->s_journal) { in ext4_fallocate()
5005 ret = jbd2_complete_transaction(EXT4_SB(inode->i_sb)->s_journal, in ext4_fallocate()
5006 EXT4_I(inode)->i_sync_tid); in ext4_fallocate()
5009 mutex_unlock(&inode->i_mutex); in ext4_fallocate()
5010 trace_ext4_fallocate_exit(inode, offset, max_blocks, ret); in ext4_fallocate()
5024 int ext4_convert_unwritten_extents(handle_t *handle, struct inode *inode, in ext4_convert_unwritten_extents() argument
5031 unsigned int credits, blkbits = inode->i_blkbits; in ext4_convert_unwritten_extents()
5055 credits = ext4_chunk_trans_blocks(inode, max_blocks); in ext4_convert_unwritten_extents()
5061 handle = ext4_journal_start(inode, EXT4_HT_MAP_BLOCKS, in ext4_convert_unwritten_extents()
5068 ret = ext4_map_blocks(handle, inode, &map, in ext4_convert_unwritten_extents()
5071 ext4_warning(inode->i_sb, in ext4_convert_unwritten_extents()
5074 inode->i_ino, map.m_lblk, in ext4_convert_unwritten_extents()
5076 ext4_mark_inode_dirty(handle, inode); in ext4_convert_unwritten_extents()
5096 static int ext4_find_delayed_extent(struct inode *inode, in ext4_find_delayed_extent() argument
5103 ext4_es_find_delayed_extent_range(inode, newes->es_lblk, in ext4_find_delayed_extent()
5125 ext4_es_find_delayed_extent_range(inode, block, EXT_MAX_BLOCKS, &es); in ext4_find_delayed_extent()
5136 static int ext4_xattr_fiemap(struct inode *inode, in ext4_xattr_fiemap() argument
5142 int blockbits = inode->i_sb->s_blocksize_bits; in ext4_xattr_fiemap()
5146 if (ext4_test_inode_state(inode, EXT4_STATE_XATTR)) { in ext4_xattr_fiemap()
5150 error = ext4_get_inode_loc(inode, &iloc); in ext4_xattr_fiemap()
5155 EXT4_I(inode)->i_extra_isize; in ext4_xattr_fiemap()
5157 length = EXT4_SB(inode->i_sb)->s_inode_size - offset; in ext4_xattr_fiemap()
5161 physical = (__u64)EXT4_I(inode)->i_file_acl << blockbits; in ext4_xattr_fiemap()
5162 length = inode->i_sb->s_blocksize; in ext4_xattr_fiemap()
5171 int ext4_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, in ext4_fiemap() argument
5177 if (ext4_has_inline_data(inode)) { in ext4_fiemap()
5180 error = ext4_inline_data_fiemap(inode, fieinfo, &has_inline, in ext4_fiemap()
5188 error = ext4_ext_precache(inode); in ext4_fiemap()
5194 if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) in ext4_fiemap()
5195 return generic_block_fiemap(inode, fieinfo, start, len, in ext4_fiemap()
5202 error = ext4_xattr_fiemap(inode, fieinfo); in ext4_fiemap()
5207 start_blk = start >> inode->i_sb->s_blocksize_bits; in ext4_fiemap()
5208 last_blk = (start + len - 1) >> inode->i_sb->s_blocksize_bits; in ext4_fiemap()
5217 error = ext4_fill_fiemap_extents(inode, start_blk, in ext4_fiemap()
5230 ext4_access_path(handle_t *handle, struct inode *inode, in ext4_access_path() argument
5245 credits = ext4_writepage_trans_blocks(inode); in ext4_access_path()
5246 err = ext4_ext_truncate_extend_restart(handle, inode, credits); in ext4_access_path()
5252 err = ext4_ext_get_access(handle, inode, path); in ext4_access_path()
5264 struct inode *inode, handle_t *handle, in ext4_ext_shift_path_extents() argument
5280 err = ext4_access_path(handle, inode, path + depth); in ext4_ext_shift_path_extents()
5295 ext4_ext_try_to_merge_right(inode, in ext4_ext_shift_path_extents()
5302 ext4_ext_try_to_merge_right(inode, path, in ext4_ext_shift_path_extents()
5307 err = ext4_ext_dirty(handle, inode, path + depth); in ext4_ext_shift_path_extents()
5316 err = ext4_access_path(handle, inode, path + depth); in ext4_ext_shift_path_extents()
5324 err = ext4_ext_dirty(handle, inode, path + depth); in ext4_ext_shift_path_extents()
5347 ext4_ext_shift_extents(struct inode *inode, handle_t *handle, in ext4_ext_shift_extents() argument
5357 path = ext4_find_extent(inode, EXT_MAX_BLOCKS - 1, NULL, 0); in ext4_ext_shift_extents()
5374 path = ext4_find_extent(inode, start - 1, &path, 0); in ext4_ext_shift_extents()
5408 path = ext4_find_extent(inode, *iterator, &path, 0); in ext4_ext_shift_extents()
5414 EXT4_ERROR_INODE(inode, "unexpected hole at %lu", in ext4_ext_shift_extents()
5442 ret = ext4_ext_shift_path_extents(path, shift, inode, in ext4_ext_shift_extents()
5458 int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len) in ext4_collapse_range() argument
5460 struct super_block *sb = inode->i_sb; in ext4_collapse_range()
5472 if (!ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) in ext4_collapse_range()
5480 if (!S_ISREG(inode->i_mode)) in ext4_collapse_range()
5483 trace_ext4_collapse_range(inode, offset, len); in ext4_collapse_range()
5489 if (ext4_should_journal_data(inode)) { in ext4_collapse_range()
5490 ret = ext4_force_commit(inode->i_sb); in ext4_collapse_range()
5495 mutex_lock(&inode->i_mutex); in ext4_collapse_range()
5500 if (offset + len >= i_size_read(inode)) { in ext4_collapse_range()
5506 if (!ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) { in ext4_collapse_range()
5512 ext4_inode_block_unlocked_dio(inode); in ext4_collapse_range()
5513 inode_dio_wait(inode); in ext4_collapse_range()
5519 down_write(&EXT4_I(inode)->i_mmap_sem); in ext4_collapse_range()
5529 ret = filemap_write_and_wait_range(inode->i_mapping, ioffset, offset); in ext4_collapse_range()
5537 ret = filemap_write_and_wait_range(inode->i_mapping, offset + len, in ext4_collapse_range()
5541 truncate_pagecache(inode, ioffset); in ext4_collapse_range()
5543 credits = ext4_writepage_trans_blocks(inode); in ext4_collapse_range()
5544 handle = ext4_journal_start(inode, EXT4_HT_TRUNCATE, credits); in ext4_collapse_range()
5550 down_write(&EXT4_I(inode)->i_data_sem); in ext4_collapse_range()
5551 ext4_discard_preallocations(inode); in ext4_collapse_range()
5553 ret = ext4_es_remove_extent(inode, punch_start, in ext4_collapse_range()
5556 up_write(&EXT4_I(inode)->i_data_sem); in ext4_collapse_range()
5560 ret = ext4_ext_remove_space(inode, punch_start, punch_stop - 1); in ext4_collapse_range()
5562 up_write(&EXT4_I(inode)->i_data_sem); in ext4_collapse_range()
5565 ext4_discard_preallocations(inode); in ext4_collapse_range()
5567 ret = ext4_ext_shift_extents(inode, handle, punch_stop, in ext4_collapse_range()
5570 up_write(&EXT4_I(inode)->i_data_sem); in ext4_collapse_range()
5574 new_size = i_size_read(inode) - len; in ext4_collapse_range()
5575 i_size_write(inode, new_size); in ext4_collapse_range()
5576 EXT4_I(inode)->i_disksize = new_size; in ext4_collapse_range()
5578 up_write(&EXT4_I(inode)->i_data_sem); in ext4_collapse_range()
5579 if (IS_SYNC(inode)) in ext4_collapse_range()
5581 inode->i_mtime = inode->i_ctime = ext4_current_time(inode); in ext4_collapse_range()
5582 ext4_mark_inode_dirty(handle, inode); in ext4_collapse_range()
5587 up_write(&EXT4_I(inode)->i_mmap_sem); in ext4_collapse_range()
5588 ext4_inode_resume_unlocked_dio(inode); in ext4_collapse_range()
5590 mutex_unlock(&inode->i_mutex); in ext4_collapse_range()
5602 int ext4_insert_range(struct inode *inode, loff_t offset, loff_t len) in ext4_insert_range() argument
5604 struct super_block *sb = inode->i_sb; in ext4_insert_range()
5618 if (!ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) in ext4_insert_range()
5626 if (!S_ISREG(inode->i_mode)) in ext4_insert_range()
5629 trace_ext4_insert_range(inode, offset, len); in ext4_insert_range()
5635 if (ext4_should_journal_data(inode)) { in ext4_insert_range()
5636 ret = ext4_force_commit(inode->i_sb); in ext4_insert_range()
5641 mutex_lock(&inode->i_mutex); in ext4_insert_range()
5643 if (!ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) { in ext4_insert_range()
5649 if (inode->i_size + len > inode->i_sb->s_maxbytes) { in ext4_insert_range()
5655 if (offset >= i_size_read(inode)) { in ext4_insert_range()
5661 ext4_inode_block_unlocked_dio(inode); in ext4_insert_range()
5662 inode_dio_wait(inode); in ext4_insert_range()
5668 down_write(&EXT4_I(inode)->i_mmap_sem); in ext4_insert_range()
5675 ret = filemap_write_and_wait_range(inode->i_mapping, ioffset, in ext4_insert_range()
5679 truncate_pagecache(inode, ioffset); in ext4_insert_range()
5681 credits = ext4_writepage_trans_blocks(inode); in ext4_insert_range()
5682 handle = ext4_journal_start(inode, EXT4_HT_TRUNCATE, credits); in ext4_insert_range()
5689 inode->i_size += len; in ext4_insert_range()
5690 EXT4_I(inode)->i_disksize += len; in ext4_insert_range()
5691 inode->i_mtime = inode->i_ctime = ext4_current_time(inode); in ext4_insert_range()
5692 ret = ext4_mark_inode_dirty(handle, inode); in ext4_insert_range()
5696 down_write(&EXT4_I(inode)->i_data_sem); in ext4_insert_range()
5697 ext4_discard_preallocations(inode); in ext4_insert_range()
5699 path = ext4_find_extent(inode, offset_lblk, NULL, 0); in ext4_insert_range()
5701 up_write(&EXT4_I(inode)->i_data_sem); in ext4_insert_range()
5705 depth = ext_depth(inode); in ext4_insert_range()
5720 ret = ext4_split_extent_at(handle, inode, &path, in ext4_insert_range()
5730 up_write(&EXT4_I(inode)->i_data_sem); in ext4_insert_range()
5735 ret = ext4_es_remove_extent(inode, offset_lblk, in ext4_insert_range()
5738 up_write(&EXT4_I(inode)->i_data_sem); in ext4_insert_range()
5746 ret = ext4_ext_shift_extents(inode, handle, in ext4_insert_range()
5750 up_write(&EXT4_I(inode)->i_data_sem); in ext4_insert_range()
5751 if (IS_SYNC(inode)) in ext4_insert_range()
5757 up_write(&EXT4_I(inode)->i_mmap_sem); in ext4_insert_range()
5758 ext4_inode_resume_unlocked_dio(inode); in ext4_insert_range()
5760 mutex_unlock(&inode->i_mutex); in ext4_insert_range()
5785 ext4_swap_extents(handle_t *handle, struct inode *inode1, in ext4_swap_extents()
5786 struct inode *inode2, ext4_lblk_t lblk1, ext4_lblk_t lblk2, in ext4_swap_extents()