• Home
  • Raw
  • Download

Lines Matching +full:depth +full:-

1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2003-2006, Cluster File Systems, Inc, info@clusterfs.com
15 * - ext4*_error() should be used in some situations
16 * - analyze all BUG()/BUG_ON(), use -EIO where appropriate
17 * - smart tree reduction
30 #include <linux/backing-dev.h>
53 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_extent_block_csum()
56 csum = ext4_chksum(sbi, ei->i_csum_seed, (__u8 *)eh, in ext4_extent_block_csum()
66 if (!ext4_has_metadata_csum(inode->i_sb)) in ext4_extent_block_csum_verify()
70 if (et->et_checksum != ext4_extent_block_csum(inode, eh)) in ext4_extent_block_csum_verify()
80 if (!ext4_has_metadata_csum(inode->i_sb)) in ext4_extent_block_csum_set()
84 et->et_checksum = ext4_extent_block_csum(inode, eh); in ext4_extent_block_csum_set()
104 up_write(&EXT4_I(inode)->i_data_sem); in ext4_ext_trunc_restart_fn()
127 down_write(&EXT4_I(inode)->i_data_sem); in ext4_datasem_ensure_credits()
133 * - EROFS
134 * - ENOMEM
141 if (path->p_bh) { in ext4_ext_get_access()
143 BUFFER_TRACE(path->p_bh, "get_write_access"); in ext4_ext_get_access()
144 err = ext4_journal_get_write_access(handle, path->p_bh); in ext4_ext_get_access()
152 clear_buffer_verified(path->p_bh); in ext4_ext_get_access()
155 /* we use in-core data, no need to protect them */ in ext4_ext_get_access()
161 * - EROFS
162 * - ENOMEM
163 * - EIO
171 WARN_ON(!rwsem_is_locked(&EXT4_I(inode)->i_data_sem)); in __ext4_ext_dirty()
172 if (path->p_bh) { in __ext4_ext_dirty()
173 ext4_extent_block_csum_set(inode, ext_block_hdr(path->p_bh)); in __ext4_ext_dirty()
176 inode, path->p_bh); in __ext4_ext_dirty()
177 /* Extents updating done, re-set verified flag */ in __ext4_ext_dirty()
179 set_buffer_verified(path->p_bh); in __ext4_ext_dirty()
195 int depth = path->p_depth; in ext4_ext_find_goal() local
201 * non-sparse --- i.e., in the case of libbfd writing in ext4_ext_find_goal()
202 * an ELF object sections out-of-order but in a way in ext4_ext_find_goal()
206 * non-ideal if we are writing a sparse file such as in ext4_ext_find_goal()
215 ex = path[depth].p_ext; in ext4_ext_find_goal()
218 ext4_lblk_t ext_block = le32_to_cpu(ex->ee_block); in ext4_ext_find_goal()
221 return ext_pblk + (block - ext_block); in ext4_ext_find_goal()
223 return ext_pblk - (ext_block - block); in ext4_ext_find_goal()
228 if (path[depth].p_bh) in ext4_ext_find_goal()
229 return path[depth].p_bh->b_blocknr; in ext4_ext_find_goal()
246 goal = ext4_ext_find_goal(inode, path, le32_to_cpu(ex->ee_block)); in ext4_ext_new_meta_block()
256 size = (inode->i_sb->s_blocksize - sizeof(struct ext4_extent_header)) in ext4_ext_space_block()
269 size = (inode->i_sb->s_blocksize - sizeof(struct ext4_extent_header)) in ext4_ext_space_block_idx()
282 size = sizeof(EXT4_I(inode)->i_data); in ext4_ext_space_root()
283 size -= sizeof(struct ext4_extent_header); in ext4_ext_space_root()
296 size = sizeof(EXT4_I(inode)->i_data); in ext4_ext_space_root_idx()
297 size -= sizeof(struct ext4_extent_header); in ext4_ext_space_root_idx()
312 int unwritten = ext4_ext_is_unwritten(path[path->p_depth].p_ext); in ext4_force_split_extent_at()
324 ext4_ext_max_entries(struct inode *inode, int depth) in ext4_ext_max_entries() argument
328 if (depth == ext_depth(inode)) { in ext4_ext_max_entries()
329 if (depth == 0) in ext4_ext_max_entries()
334 if (depth == 0) in ext4_ext_max_entries()
347 ext4_lblk_t lblock = le32_to_cpu(ext->ee_block); in ext4_valid_extent()
351 * - zero length in ext4_valid_extent()
352 * - overflow/wrap-around in ext4_valid_extent()
370 int depth) in ext4_valid_extent_entries() argument
376 if (eh->eh_entries == 0) in ext4_valid_extent_entries()
379 entries = le16_to_cpu(eh->eh_entries); in ext4_valid_extent_entries()
381 if (depth == 0) { in ext4_valid_extent_entries()
389 if (depth != ext_depth(inode) && in ext4_valid_extent_entries()
390 lblk != le32_to_cpu(ext->ee_block)) in ext4_valid_extent_entries()
397 lblock = le32_to_cpu(ext->ee_block); in ext4_valid_extent_entries()
402 prev = lblock + ext4_ext_get_actual_len(ext) - 1; in ext4_valid_extent_entries()
404 entries--; in ext4_valid_extent_entries()
413 if (depth != ext_depth(inode) && in ext4_valid_extent_entries()
414 lblk != le32_to_cpu(ext_idx->ei_block)) in ext4_valid_extent_entries()
421 lblock = le32_to_cpu(ext_idx->ei_block); in ext4_valid_extent_entries()
427 entries--; in ext4_valid_extent_entries()
436 int depth, ext4_fsblk_t pblk, ext4_lblk_t lblk) in __ext4_ext_check() argument
439 int max = 0, err = -EFSCORRUPTED; in __ext4_ext_check()
441 if (unlikely(eh->eh_magic != EXT4_EXT_MAGIC)) { in __ext4_ext_check()
445 if (unlikely(le16_to_cpu(eh->eh_depth) != depth)) { in __ext4_ext_check()
449 if (unlikely(eh->eh_max == 0)) { in __ext4_ext_check()
453 max = ext4_ext_max_entries(inode, depth); in __ext4_ext_check()
454 if (unlikely(le16_to_cpu(eh->eh_max) > max)) { in __ext4_ext_check()
458 if (unlikely(le16_to_cpu(eh->eh_entries) > le16_to_cpu(eh->eh_max))) { in __ext4_ext_check()
462 if (!ext4_valid_extent_entries(inode, eh, lblk, &pblk, depth)) { in __ext4_ext_check()
466 if (unlikely(depth > 32)) { in __ext4_ext_check()
470 /* Verify checksum on non-root extent tree nodes */ in __ext4_ext_check()
471 if (ext_depth(inode) != depth && in __ext4_ext_check()
474 err = -EFSBADCRC; in __ext4_ext_check()
480 ext4_error_inode_err(inode, function, line, 0, -err, in __ext4_ext_check()
481 "pblk %llu bad header/extent: %s - magic %x, " in __ext4_ext_check()
482 "entries %u, max %u(%u), depth %u(%u)", in __ext4_ext_check()
484 le16_to_cpu(eh->eh_magic), in __ext4_ext_check()
485 le16_to_cpu(eh->eh_entries), in __ext4_ext_check()
486 le16_to_cpu(eh->eh_max), in __ext4_ext_check()
487 max, le16_to_cpu(eh->eh_depth), depth); in __ext4_ext_check()
491 #define ext4_ext_check(inode, eh, depth, pblk) \ argument
492 __ext4_ext_check(__func__, __LINE__, (inode), (eh), (depth), (pblk), 0)
506 for (i = le16_to_cpu(eh->eh_entries); i > 0; i--, ex++) { in ext4_cache_extents()
508 ext4_lblk_t lblk = le32_to_cpu(ex->ee_block); in ext4_cache_extents()
512 ext4_es_cache_extent(inode, prev, lblk - prev, ~0, in ext4_cache_extents()
526 int depth, int flags) in __read_extent_tree_block() argument
537 bh = sb_getblk_gfp(inode->i_sb, pblk, gfp_flags); in __read_extent_tree_block()
539 return ERR_PTR(-ENOMEM); in __read_extent_tree_block()
548 if (unlikely(ext_block_hdr(bh)->eh_magic != EXT4_EXT_MAGIC)) { in __read_extent_tree_block()
549 err = -EFSCORRUPTED; in __read_extent_tree_block()
552 (unsigned long long)bh->b_blocknr); in __read_extent_tree_block()
560 depth, pblk, le32_to_cpu(idx->ei_block)); in __read_extent_tree_block()
568 if (!(flags & EXT4_EX_NOCACHE) && depth == 0) { in __read_extent_tree_block()
579 #define read_extent_tree_block(inode, idx, depth, flags) \ argument
581 (depth), (flags))
592 int i = 0, depth, ret = 0; in ext4_ext_precache() local
595 return 0; /* not an extent-mapped inode */ in ext4_ext_precache()
597 down_read(&ei->i_data_sem); in ext4_ext_precache()
598 depth = ext_depth(inode); in ext4_ext_precache()
601 if (!depth) { in ext4_ext_precache()
602 up_read(&ei->i_data_sem); in ext4_ext_precache()
606 path = kcalloc(depth + 1, sizeof(struct ext4_ext_path), in ext4_ext_precache()
609 up_read(&ei->i_data_sem); in ext4_ext_precache()
610 return -ENOMEM; in ext4_ext_precache()
614 ret = ext4_ext_check(inode, path[0].p_hdr, depth, 0); in ext4_ext_precache()
623 if ((i == depth) || in ext4_ext_precache()
627 i--; in ext4_ext_precache()
631 depth - i - 1, in ext4_ext_precache()
644 up_read(&ei->i_data_sem); in ext4_ext_precache()
653 int k, l = path->p_depth; in ext4_ext_show_path()
657 if (path->p_idx) { in ext4_ext_show_path()
658 ext_debug(inode, " %d->%llu", in ext4_ext_show_path()
659 le32_to_cpu(path->p_idx->ei_block), in ext4_ext_show_path()
660 ext4_idx_pblock(path->p_idx)); in ext4_ext_show_path()
661 } else if (path->p_ext) { in ext4_ext_show_path()
663 le32_to_cpu(path->p_ext->ee_block), in ext4_ext_show_path()
664 ext4_ext_is_unwritten(path->p_ext), in ext4_ext_show_path()
665 ext4_ext_get_actual_len(path->p_ext), in ext4_ext_show_path()
666 ext4_ext_pblock(path->p_ext)); in ext4_ext_show_path()
675 int depth = ext_depth(inode); in ext4_ext_show_leaf() local
683 eh = path[depth].p_hdr; in ext4_ext_show_leaf()
688 for (i = 0; i < le16_to_cpu(eh->eh_entries); i++, ex++) { in ext4_ext_show_leaf()
689 ext_debug(inode, "%d:[%d]%d:%llu ", le32_to_cpu(ex->ee_block), in ext4_ext_show_leaf()
699 int depth = ext_depth(inode); in ext4_ext_show_move() local
702 if (depth != level) { in ext4_ext_show_move()
707 level, le32_to_cpu(idx->ei_block), in ext4_ext_show_move()
715 ex = path[depth].p_ext; in ext4_ext_show_move()
716 while (ex <= EXT_MAX_EXTENT(path[depth].p_hdr)) { in ext4_ext_show_move()
718 le32_to_cpu(ex->ee_block), in ext4_ext_show_move()
735 int depth, i; in ext4_ext_drop_refs() local
739 depth = path->p_depth; in ext4_ext_drop_refs()
740 for (i = 0; i <= depth; i++, path++) { in ext4_ext_drop_refs()
741 brelse(path->p_bh); in ext4_ext_drop_refs()
742 path->p_bh = NULL; in ext4_ext_drop_refs()
755 struct ext4_extent_header *eh = path->p_hdr; in ext4_ext_binsearch_idx()
764 m = l + (r - l) / 2; in ext4_ext_binsearch_idx()
765 if (block < le32_to_cpu(m->ei_block)) in ext4_ext_binsearch_idx()
766 r = m - 1; in ext4_ext_binsearch_idx()
770 le32_to_cpu(l->ei_block), m, le32_to_cpu(m->ei_block), in ext4_ext_binsearch_idx()
771 r, le32_to_cpu(r->ei_block)); in ext4_ext_binsearch_idx()
774 path->p_idx = l - 1; in ext4_ext_binsearch_idx()
775 ext_debug(inode, " -> %u->%lld ", le32_to_cpu(path->p_idx->ei_block), in ext4_ext_binsearch_idx()
776 ext4_idx_pblock(path->p_idx)); in ext4_ext_binsearch_idx()
784 for (k = 0; k < le16_to_cpu(eh->eh_entries); k++, ix++) { in ext4_ext_binsearch_idx()
785 if (k != 0 && le32_to_cpu(ix->ei_block) <= in ext4_ext_binsearch_idx()
786 le32_to_cpu(ix[-1].ei_block)) { in ext4_ext_binsearch_idx()
791 le32_to_cpu(ix->ei_block), in ext4_ext_binsearch_idx()
792 le32_to_cpu(ix[-1].ei_block)); in ext4_ext_binsearch_idx()
794 BUG_ON(k && le32_to_cpu(ix->ei_block) in ext4_ext_binsearch_idx()
795 <= le32_to_cpu(ix[-1].ei_block)); in ext4_ext_binsearch_idx()
796 if (block < le32_to_cpu(ix->ei_block)) in ext4_ext_binsearch_idx()
800 BUG_ON(chix != path->p_idx); in ext4_ext_binsearch_idx()
815 struct ext4_extent_header *eh = path->p_hdr; in ext4_ext_binsearch()
818 if (eh->eh_entries == 0) { in ext4_ext_binsearch()
832 m = l + (r - l) / 2; in ext4_ext_binsearch()
833 if (block < le32_to_cpu(m->ee_block)) in ext4_ext_binsearch()
834 r = m - 1; in ext4_ext_binsearch()
838 le32_to_cpu(l->ee_block), m, le32_to_cpu(m->ee_block), in ext4_ext_binsearch()
839 r, le32_to_cpu(r->ee_block)); in ext4_ext_binsearch()
842 path->p_ext = l - 1; in ext4_ext_binsearch()
843 ext_debug(inode, " -> %d:%llu:[%d]%d ", in ext4_ext_binsearch()
844 le32_to_cpu(path->p_ext->ee_block), in ext4_ext_binsearch()
845 ext4_ext_pblock(path->p_ext), in ext4_ext_binsearch()
846 ext4_ext_is_unwritten(path->p_ext), in ext4_ext_binsearch()
847 ext4_ext_get_actual_len(path->p_ext)); in ext4_ext_binsearch()
855 for (k = 0; k < le16_to_cpu(eh->eh_entries); k++, ex++) { in ext4_ext_binsearch()
856 BUG_ON(k && le32_to_cpu(ex->ee_block) in ext4_ext_binsearch()
857 <= le32_to_cpu(ex[-1].ee_block)); in ext4_ext_binsearch()
858 if (block < le32_to_cpu(ex->ee_block)) in ext4_ext_binsearch()
862 BUG_ON(chex != path->p_ext); in ext4_ext_binsearch()
873 eh->eh_depth = 0; in ext4_ext_tree_init()
874 eh->eh_entries = 0; in ext4_ext_tree_init()
875 eh->eh_magic = EXT4_EXT_MAGIC; in ext4_ext_tree_init()
876 eh->eh_max = cpu_to_le16(ext4_ext_space_root(inode, 0)); in ext4_ext_tree_init()
877 eh->eh_generation = 0; in ext4_ext_tree_init()
888 short int depth, i, ppos = 0; in ext4_find_extent() local
896 depth = ext_depth(inode); in ext4_find_extent()
897 if (depth < 0 || depth > EXT4_MAX_EXTENT_DEPTH) { in ext4_find_extent()
898 EXT4_ERROR_INODE(inode, "inode has invalid extent depth: %d", in ext4_find_extent()
899 depth); in ext4_find_extent()
900 ret = -EFSCORRUPTED; in ext4_find_extent()
906 if (depth > path[0].p_maxdepth) { in ext4_find_extent()
912 /* account possible depth increase */ in ext4_find_extent()
913 path = kcalloc(depth + 2, sizeof(struct ext4_ext_path), in ext4_find_extent()
916 return ERR_PTR(-ENOMEM); in ext4_find_extent()
917 path[0].p_maxdepth = depth + 1; in ext4_find_extent()
922 i = depth; in ext4_find_extent()
923 if (!(flags & EXT4_EX_NOCACHE) && depth == 0) in ext4_find_extent()
927 ext_debug(inode, "depth %d: num %d, max %d\n", in ext4_find_extent()
928 ppos, le16_to_cpu(eh->eh_entries), le16_to_cpu(eh->eh_max)); in ext4_find_extent()
935 bh = read_extent_tree_block(inode, path[ppos].p_idx, --i, flags); in ext4_find_extent()
985 if (unlikely(logical == le32_to_cpu(curp->p_idx->ei_block))) { in ext4_ext_insert_index()
988 logical, le32_to_cpu(curp->p_idx->ei_block)); in ext4_ext_insert_index()
989 return -EFSCORRUPTED; in ext4_ext_insert_index()
992 if (unlikely(le16_to_cpu(curp->p_hdr->eh_entries) in ext4_ext_insert_index()
993 >= le16_to_cpu(curp->p_hdr->eh_max))) { in ext4_ext_insert_index()
996 le16_to_cpu(curp->p_hdr->eh_entries), in ext4_ext_insert_index()
997 le16_to_cpu(curp->p_hdr->eh_max)); in ext4_ext_insert_index()
998 return -EFSCORRUPTED; in ext4_ext_insert_index()
1001 if (logical > le32_to_cpu(curp->p_idx->ei_block)) { in ext4_ext_insert_index()
1005 ix = curp->p_idx + 1; in ext4_ext_insert_index()
1010 ix = curp->p_idx; in ext4_ext_insert_index()
1013 len = EXT_LAST_INDEX(curp->p_hdr) - ix + 1; in ext4_ext_insert_index()
1022 if (unlikely(ix > EXT_MAX_INDEX(curp->p_hdr))) { in ext4_ext_insert_index()
1024 return -EFSCORRUPTED; in ext4_ext_insert_index()
1027 ix->ei_block = cpu_to_le32(logical); in ext4_ext_insert_index()
1029 le16_add_cpu(&curp->p_hdr->eh_entries, 1); in ext4_ext_insert_index()
1031 if (unlikely(ix > EXT_LAST_INDEX(curp->p_hdr))) { in ext4_ext_insert_index()
1033 return -EFSCORRUPTED; in ext4_ext_insert_index()
1037 ext4_std_error(inode->i_sb, err); in ext4_ext_insert_index()
1045 * at depth @at:
1046 * - allocates all needed blocks (new leaf and all intermediate index blocks)
1047 * - makes decision where to split
1048 * - moves remaining extents and index entries (right to the split point)
1050 * - initializes subtree
1058 int depth = ext_depth(inode); in ext4_ext_split() local
1077 if (unlikely(path[depth].p_ext > EXT_MAX_EXTENT(path[depth].p_hdr))) { in ext4_ext_split()
1079 return -EFSCORRUPTED; in ext4_ext_split()
1081 if (path[depth].p_ext != EXT_MAX_EXTENT(path[depth].p_hdr)) { in ext4_ext_split()
1082 border = path[depth].p_ext[1].ee_block; in ext4_ext_split()
1087 border = newext->ee_block; in ext4_ext_split()
1095 * and mark filesystem read-only. index won't in ext4_ext_split()
1105 ablocks = kcalloc(depth, sizeof(ext4_fsblk_t), gfp_flags); in ext4_ext_split()
1107 return -ENOMEM; in ext4_ext_split()
1110 ext_debug(inode, "allocate %d blocks for indexes/leaf\n", depth - at); in ext4_ext_split()
1111 for (a = 0; a < depth - at; a++) { in ext4_ext_split()
1120 newblock = ablocks[--a]; in ext4_ext_split()
1123 err = -EFSCORRUPTED; in ext4_ext_split()
1126 bh = sb_getblk_gfp(inode->i_sb, newblock, __GFP_MOVABLE | GFP_NOFS); in ext4_ext_split()
1128 err = -ENOMEM; in ext4_ext_split()
1138 neh->eh_entries = 0; in ext4_ext_split()
1139 neh->eh_max = cpu_to_le16(ext4_ext_space_block(inode, 0)); in ext4_ext_split()
1140 neh->eh_magic = EXT4_EXT_MAGIC; in ext4_ext_split()
1141 neh->eh_depth = 0; in ext4_ext_split()
1142 neh->eh_generation = 0; in ext4_ext_split()
1144 /* move remainder of path[depth] to the new leaf */ in ext4_ext_split()
1145 if (unlikely(path[depth].p_hdr->eh_entries != in ext4_ext_split()
1146 path[depth].p_hdr->eh_max)) { in ext4_ext_split()
1148 path[depth].p_hdr->eh_entries, in ext4_ext_split()
1149 path[depth].p_hdr->eh_max); in ext4_ext_split()
1150 err = -EFSCORRUPTED; in ext4_ext_split()
1154 m = EXT_MAX_EXTENT(path[depth].p_hdr) - path[depth].p_ext++; in ext4_ext_split()
1155 ext4_ext_show_move(inode, path, newblock, depth); in ext4_ext_split()
1159 memmove(ex, path[depth].p_ext, sizeof(struct ext4_extent) * m); in ext4_ext_split()
1160 le16_add_cpu(&neh->eh_entries, m); in ext4_ext_split()
1165 sizeof(struct ext4_extent) * le16_to_cpu(neh->eh_entries); in ext4_ext_split()
1166 memset(bh->b_data + ext_size, 0, inode->i_sb->s_blocksize - ext_size); in ext4_ext_split()
1179 err = ext4_ext_get_access(handle, inode, path + depth); in ext4_ext_split()
1182 le16_add_cpu(&path[depth].p_hdr->eh_entries, -m); in ext4_ext_split()
1183 err = ext4_ext_dirty(handle, inode, path + depth); in ext4_ext_split()
1190 k = depth - at - 1; in ext4_ext_split()
1193 err = -EFSCORRUPTED; in ext4_ext_split()
1199 /* current depth stored in i var */ in ext4_ext_split()
1200 i = depth - 1; in ext4_ext_split()
1201 while (k--) { in ext4_ext_split()
1203 newblock = ablocks[--a]; in ext4_ext_split()
1204 bh = sb_getblk(inode->i_sb, newblock); in ext4_ext_split()
1206 err = -ENOMEM; in ext4_ext_split()
1216 neh->eh_entries = cpu_to_le16(1); in ext4_ext_split()
1217 neh->eh_magic = EXT4_EXT_MAGIC; in ext4_ext_split()
1218 neh->eh_max = cpu_to_le16(ext4_ext_space_block_idx(inode, 0)); in ext4_ext_split()
1219 neh->eh_depth = cpu_to_le16(depth - i); in ext4_ext_split()
1220 neh->eh_generation = 0; in ext4_ext_split()
1222 fidx->ei_block = border; in ext4_ext_split()
1225 ext_debug(inode, "int.index at %d (block %llu): %u -> %llu\n", in ext4_ext_split()
1233 le32_to_cpu(path[i].p_ext->ee_block)); in ext4_ext_split()
1234 err = -EFSCORRUPTED; in ext4_ext_split()
1238 m = EXT_MAX_INDEX(path[i].p_hdr) - path[i].p_idx++; in ext4_ext_split()
1245 le16_add_cpu(&neh->eh_entries, m); in ext4_ext_split()
1249 (sizeof(struct ext4_extent) * le16_to_cpu(neh->eh_entries)); in ext4_ext_split()
1250 memset(bh->b_data + ext_size, 0, in ext4_ext_split()
1251 inode->i_sb->s_blocksize - ext_size); in ext4_ext_split()
1267 le16_add_cpu(&path[i].p_hdr->eh_entries, -m); in ext4_ext_split()
1273 i--; in ext4_ext_split()
1289 for (i = 0; i < depth; i++) { in ext4_ext_split()
1304 * - allocates new block
1305 * - moves top-level data (index block or leaf) into the new block
1306 * - initializes new top-level, creating index that points to the
1315 struct ext4_super_block *es = EXT4_SB(inode->i_sb)->s_es; in ext4_ext_grow_indepth()
1322 if (goal > le32_to_cpu(es->s_first_data_block)) { in ext4_ext_grow_indepth()
1324 goal--; in ext4_ext_grow_indepth()
1332 bh = sb_getblk_gfp(inode->i_sb, newblock, __GFP_MOVABLE | GFP_NOFS); in ext4_ext_grow_indepth()
1334 return -ENOMEM; in ext4_ext_grow_indepth()
1343 ext_size = sizeof(EXT4_I(inode)->i_data); in ext4_ext_grow_indepth()
1344 /* move top-level index/leaf into new block */ in ext4_ext_grow_indepth()
1345 memmove(bh->b_data, EXT4_I(inode)->i_data, ext_size); in ext4_ext_grow_indepth()
1347 memset(bh->b_data + ext_size, 0, inode->i_sb->s_blocksize - ext_size); in ext4_ext_grow_indepth()
1354 neh->eh_max = cpu_to_le16(ext4_ext_space_block_idx(inode, 0)); in ext4_ext_grow_indepth()
1356 neh->eh_max = cpu_to_le16(ext4_ext_space_block(inode, 0)); in ext4_ext_grow_indepth()
1357 neh->eh_magic = EXT4_EXT_MAGIC; in ext4_ext_grow_indepth()
1366 /* Update top-level index: num,max,pointer */ in ext4_ext_grow_indepth()
1368 neh->eh_entries = cpu_to_le16(1); in ext4_ext_grow_indepth()
1370 if (neh->eh_depth == 0) { in ext4_ext_grow_indepth()
1372 neh->eh_max = cpu_to_le16(ext4_ext_space_root_idx(inode, 0)); in ext4_ext_grow_indepth()
1373 EXT_FIRST_INDEX(neh)->ei_block = in ext4_ext_grow_indepth()
1374 EXT_FIRST_EXTENT(neh)->ee_block; in ext4_ext_grow_indepth()
1377 le16_to_cpu(neh->eh_entries), le16_to_cpu(neh->eh_max), in ext4_ext_grow_indepth()
1378 le32_to_cpu(EXT_FIRST_INDEX(neh)->ei_block), in ext4_ext_grow_indepth()
1381 le16_add_cpu(&neh->eh_depth, 1); in ext4_ext_grow_indepth()
1392 * if no free index is found, then it requests in-depth growing.
1402 int depth, i, err = 0; in ext4_ext_create_new_leaf() local
1405 i = depth = ext_depth(inode); in ext4_ext_create_new_leaf()
1408 curp = path + depth; in ext4_ext_create_new_leaf()
1410 i--; in ext4_ext_create_new_leaf()
1411 curp--; in ext4_ext_create_new_leaf()
1425 (ext4_lblk_t)le32_to_cpu(newext->ee_block), in ext4_ext_create_new_leaf()
1430 /* tree is full, time to grow in depth */ in ext4_ext_create_new_leaf()
1437 (ext4_lblk_t)le32_to_cpu(newext->ee_block), in ext4_ext_create_new_leaf()
1445 * only first (depth 0 -> 1) produces free space; in ext4_ext_create_new_leaf()
1448 depth = ext_depth(inode); in ext4_ext_create_new_leaf()
1449 if (path[depth].p_hdr->eh_entries == path[depth].p_hdr->eh_max) { in ext4_ext_create_new_leaf()
1472 int depth, ee_len; in ext4_ext_search_left() local
1476 return -EFSCORRUPTED; in ext4_ext_search_left()
1478 depth = path->p_depth; in ext4_ext_search_left()
1481 if (depth == 0 && path->p_ext == NULL) in ext4_ext_search_left()
1488 ex = path[depth].p_ext; in ext4_ext_search_left()
1490 if (*logical < le32_to_cpu(ex->ee_block)) { in ext4_ext_search_left()
1491 if (unlikely(EXT_FIRST_EXTENT(path[depth].p_hdr) != ex)) { in ext4_ext_search_left()
1494 *logical, le32_to_cpu(ex->ee_block)); in ext4_ext_search_left()
1495 return -EFSCORRUPTED; in ext4_ext_search_left()
1497 while (--depth >= 0) { in ext4_ext_search_left()
1498 ix = path[depth].p_idx; in ext4_ext_search_left()
1499 if (unlikely(ix != EXT_FIRST_INDEX(path[depth].p_hdr))) { in ext4_ext_search_left()
1501 "ix (%d) != EXT_FIRST_INDEX (%d) (depth %d)!", in ext4_ext_search_left()
1502 ix != NULL ? le32_to_cpu(ix->ei_block) : 0, in ext4_ext_search_left()
1503 EXT_FIRST_INDEX(path[depth].p_hdr) != NULL ? in ext4_ext_search_left()
1504 le32_to_cpu(EXT_FIRST_INDEX(path[depth].p_hdr)->ei_block) : 0, in ext4_ext_search_left()
1505 depth); in ext4_ext_search_left()
1506 return -EFSCORRUPTED; in ext4_ext_search_left()
1512 if (unlikely(*logical < (le32_to_cpu(ex->ee_block) + ee_len))) { in ext4_ext_search_left()
1515 *logical, le32_to_cpu(ex->ee_block), ee_len); in ext4_ext_search_left()
1516 return -EFSCORRUPTED; in ext4_ext_search_left()
1519 *logical = le32_to_cpu(ex->ee_block) + ee_len - 1; in ext4_ext_search_left()
1520 *phys = ext4_ext_pblock(ex) + ee_len - 1; in ext4_ext_search_left()
1540 int depth; /* Note, NOT eh_depth; depth from top of tree */ in ext4_ext_search_right() local
1545 return -EFSCORRUPTED; in ext4_ext_search_right()
1547 depth = path->p_depth; in ext4_ext_search_right()
1550 if (depth == 0 && path->p_ext == NULL) in ext4_ext_search_right()
1557 ex = path[depth].p_ext; in ext4_ext_search_right()
1559 if (*logical < le32_to_cpu(ex->ee_block)) { in ext4_ext_search_right()
1560 if (unlikely(EXT_FIRST_EXTENT(path[depth].p_hdr) != ex)) { in ext4_ext_search_right()
1563 depth); in ext4_ext_search_right()
1564 return -EFSCORRUPTED; in ext4_ext_search_right()
1566 while (--depth >= 0) { in ext4_ext_search_right()
1567 ix = path[depth].p_idx; in ext4_ext_search_right()
1568 if (unlikely(ix != EXT_FIRST_INDEX(path[depth].p_hdr))) { in ext4_ext_search_right()
1572 return -EFSCORRUPTED; in ext4_ext_search_right()
1578 if (unlikely(*logical < (le32_to_cpu(ex->ee_block) + ee_len))) { in ext4_ext_search_right()
1581 *logical, le32_to_cpu(ex->ee_block), ee_len); in ext4_ext_search_right()
1582 return -EFSCORRUPTED; in ext4_ext_search_right()
1585 if (ex != EXT_LAST_EXTENT(path[depth].p_hdr)) { in ext4_ext_search_right()
1592 while (--depth >= 0) { in ext4_ext_search_right()
1593 ix = path[depth].p_idx; in ext4_ext_search_right()
1594 if (ix != EXT_LAST_INDEX(path[depth].p_hdr)) in ext4_ext_search_right()
1606 while (++depth < path->p_depth) { in ext4_ext_search_right()
1608 bh = read_extent_tree_block(inode, ix, path->p_depth - depth, 0); in ext4_ext_search_right()
1616 bh = read_extent_tree_block(inode, ix, path->p_depth - depth, 0); in ext4_ext_search_right()
1622 *logical = le32_to_cpu(ex->ee_block); in ext4_ext_search_right()
1641 int depth; in ext4_ext_next_allocated_block() local
1644 depth = path->p_depth; in ext4_ext_next_allocated_block()
1646 if (depth == 0 && path->p_ext == NULL) in ext4_ext_next_allocated_block()
1649 while (depth >= 0) { in ext4_ext_next_allocated_block()
1650 struct ext4_ext_path *p = &path[depth]; in ext4_ext_next_allocated_block()
1652 if (depth == path->p_depth) { in ext4_ext_next_allocated_block()
1654 if (p->p_ext && p->p_ext != EXT_LAST_EXTENT(p->p_hdr)) in ext4_ext_next_allocated_block()
1655 return le32_to_cpu(p->p_ext[1].ee_block); in ext4_ext_next_allocated_block()
1658 if (p->p_idx != EXT_LAST_INDEX(p->p_hdr)) in ext4_ext_next_allocated_block()
1659 return le32_to_cpu(p->p_idx[1].ei_block); in ext4_ext_next_allocated_block()
1661 depth--; in ext4_ext_next_allocated_block()
1673 int depth; in ext4_ext_next_leaf_block() local
1676 depth = path->p_depth; in ext4_ext_next_leaf_block()
1678 /* zero-tree has no leaf blocks at all */ in ext4_ext_next_leaf_block()
1679 if (depth == 0) in ext4_ext_next_leaf_block()
1683 depth--; in ext4_ext_next_leaf_block()
1685 while (depth >= 0) { in ext4_ext_next_leaf_block()
1686 if (path[depth].p_idx != in ext4_ext_next_leaf_block()
1687 EXT_LAST_INDEX(path[depth].p_hdr)) in ext4_ext_next_leaf_block()
1689 le32_to_cpu(path[depth].p_idx[1].ei_block); in ext4_ext_next_leaf_block()
1690 depth--; in ext4_ext_next_leaf_block()
1706 int depth = ext_depth(inode); in ext4_ext_correct_indexes() local
1711 eh = path[depth].p_hdr; in ext4_ext_correct_indexes()
1712 ex = path[depth].p_ext; in ext4_ext_correct_indexes()
1717 return -EFSCORRUPTED; in ext4_ext_correct_indexes()
1720 if (depth == 0) { in ext4_ext_correct_indexes()
1733 k = depth - 1; in ext4_ext_correct_indexes()
1734 border = path[depth].p_ext->ee_block; in ext4_ext_correct_indexes()
1738 path[k].p_idx->ei_block = border; in ext4_ext_correct_indexes()
1743 while (k--) { in ext4_ext_correct_indexes()
1744 /* change all left-side indexes */ in ext4_ext_correct_indexes()
1750 path[k].p_idx->ei_block = border; in ext4_ext_correct_indexes()
1771 if (le32_to_cpu(ex1->ee_block) + ext1_ee_len != in ext4_can_extents_be_merged()
1772 le32_to_cpu(ex2->ee_block)) in ext4_can_extents_be_merged()
1794 * left, pass "ex - 1" as argument instead of "ex".
1803 unsigned int depth, len; in ext4_ext_try_to_merge_right() local
1806 depth = ext_depth(inode); in ext4_ext_try_to_merge_right()
1807 BUG_ON(path[depth].p_hdr == NULL); in ext4_ext_try_to_merge_right()
1808 eh = path[depth].p_hdr; in ext4_ext_try_to_merge_right()
1815 ex->ee_len = cpu_to_le16(ext4_ext_get_actual_len(ex) in ext4_ext_try_to_merge_right()
1821 len = (EXT_LAST_EXTENT(eh) - ex - 1) in ext4_ext_try_to_merge_right()
1825 le16_add_cpu(&eh->eh_entries, -1); in ext4_ext_try_to_merge_right()
1827 WARN_ON(eh->eh_entries == 0); in ext4_ext_try_to_merge_right()
1828 if (!eh->eh_entries) in ext4_ext_try_to_merge_right()
1829 EXT4_ERROR_INODE(inode, "eh->eh_entries = 0!"); in ext4_ext_try_to_merge_right()
1848 (le16_to_cpu(path[0].p_hdr->eh_entries) != 1) || in ext4_ext_try_to_merge_up()
1849 (le16_to_cpu(path[1].p_hdr->eh_entries) > max_root)) in ext4_ext_try_to_merge_up()
1858 ext4_free_metadata_revoke_credits(inode->i_sb, 1))) in ext4_ext_try_to_merge_up()
1865 s = le16_to_cpu(path[1].p_hdr->eh_entries) * in ext4_ext_try_to_merge_up()
1873 (path[1].p_ext - EXT_FIRST_EXTENT(path[1].p_hdr)); in ext4_ext_try_to_merge_up()
1874 path[0].p_hdr->eh_max = cpu_to_le16(max_root); in ext4_ext_try_to_merge_up()
1891 unsigned int depth; in ext4_ext_try_to_merge() local
1894 depth = ext_depth(inode); in ext4_ext_try_to_merge()
1895 BUG_ON(path[depth].p_hdr == NULL); in ext4_ext_try_to_merge()
1896 eh = path[depth].p_hdr; in ext4_ext_try_to_merge()
1899 merge_done = ext4_ext_try_to_merge_right(inode, path, ex - 1); in ext4_ext_try_to_merge()
1921 unsigned int depth, len1; in ext4_ext_check_overlap() local
1924 b1 = le32_to_cpu(newext->ee_block); in ext4_ext_check_overlap()
1926 depth = ext_depth(inode); in ext4_ext_check_overlap()
1927 if (!path[depth].p_ext) in ext4_ext_check_overlap()
1929 b2 = EXT4_LBLK_CMASK(sbi, le32_to_cpu(path[depth].p_ext->ee_block)); in ext4_ext_check_overlap()
1944 len1 = EXT_MAX_BLOCKS - b1; in ext4_ext_check_overlap()
1945 newext->ee_len = cpu_to_le16(len1); in ext4_ext_check_overlap()
1951 newext->ee_len = cpu_to_le16(b2 - b1); in ext4_ext_check_overlap()
1962 * creating new leaf in the no-space case.
1973 int depth, len, err; in ext4_ext_insert_extent() local
1981 return -EFSCORRUPTED; in ext4_ext_insert_extent()
1983 depth = ext_depth(inode); in ext4_ext_insert_extent()
1984 ex = path[depth].p_ext; in ext4_ext_insert_extent()
1985 eh = path[depth].p_hdr; in ext4_ext_insert_extent()
1986 if (unlikely(path[depth].p_hdr == NULL)) { in ext4_ext_insert_extent()
1987 EXT4_ERROR_INODE(inode, "path[%d].p_hdr == NULL", depth); in ext4_ext_insert_extent()
1988 return -EFSCORRUPTED; in ext4_ext_insert_extent()
2002 (le32_to_cpu(ex->ee_block) + in ext4_ext_insert_extent()
2004 le32_to_cpu(newext->ee_block))) { in ext4_ext_insert_extent()
2008 (le32_to_cpu(newext->ee_block) + in ext4_ext_insert_extent()
2010 le32_to_cpu(ex->ee_block))) in ext4_ext_insert_extent()
2011 ex -= 1; in ext4_ext_insert_extent()
2019 le32_to_cpu(ex->ee_block), in ext4_ext_insert_extent()
2024 path + depth); in ext4_ext_insert_extent()
2028 ex->ee_len = cpu_to_le16(ext4_ext_get_actual_len(ex) in ext4_ext_insert_extent()
2032 eh = path[depth].p_hdr; in ext4_ext_insert_extent()
2042 le32_to_cpu(newext->ee_block), in ext4_ext_insert_extent()
2045 le32_to_cpu(ex->ee_block), in ext4_ext_insert_extent()
2050 path + depth); in ext4_ext_insert_extent()
2055 ex->ee_block = newext->ee_block; in ext4_ext_insert_extent()
2057 ex->ee_len = cpu_to_le16(ext4_ext_get_actual_len(ex) in ext4_ext_insert_extent()
2061 eh = path[depth].p_hdr; in ext4_ext_insert_extent()
2067 depth = ext_depth(inode); in ext4_ext_insert_extent()
2068 eh = path[depth].p_hdr; in ext4_ext_insert_extent()
2069 if (le16_to_cpu(eh->eh_entries) < le16_to_cpu(eh->eh_max)) in ext4_ext_insert_extent()
2075 if (le32_to_cpu(newext->ee_block) > le32_to_cpu(fex->ee_block)) in ext4_ext_insert_extent()
2078 ext_debug(inode, "next leaf block - %u\n", next); in ext4_ext_insert_extent()
2083 BUG_ON(npath->p_depth != path->p_depth); in ext4_ext_insert_extent()
2084 eh = npath[depth].p_hdr; in ext4_ext_insert_extent()
2085 if (le16_to_cpu(eh->eh_entries) < le16_to_cpu(eh->eh_max)) { in ext4_ext_insert_extent()
2087 le16_to_cpu(eh->eh_entries)); in ext4_ext_insert_extent()
2092 le16_to_cpu(eh->eh_entries), le16_to_cpu(eh->eh_max)); in ext4_ext_insert_extent()
2105 depth = ext_depth(inode); in ext4_ext_insert_extent()
2106 eh = path[depth].p_hdr; in ext4_ext_insert_extent()
2109 nearex = path[depth].p_ext; in ext4_ext_insert_extent()
2111 err = ext4_ext_get_access(handle, inode, path + depth); in ext4_ext_insert_extent()
2118 le32_to_cpu(newext->ee_block), in ext4_ext_insert_extent()
2124 if (le32_to_cpu(newext->ee_block) in ext4_ext_insert_extent()
2125 > le32_to_cpu(nearex->ee_block)) { in ext4_ext_insert_extent()
2129 le32_to_cpu(newext->ee_block), in ext4_ext_insert_extent()
2137 BUG_ON(newext->ee_block == nearex->ee_block); in ext4_ext_insert_extent()
2140 le32_to_cpu(newext->ee_block), in ext4_ext_insert_extent()
2146 len = EXT_LAST_EXTENT(eh) - nearex + 1; in ext4_ext_insert_extent()
2150 le32_to_cpu(newext->ee_block), in ext4_ext_insert_extent()
2160 le16_add_cpu(&eh->eh_entries, 1); in ext4_ext_insert_extent()
2161 path[depth].p_ext = nearex; in ext4_ext_insert_extent()
2162 nearex->ee_block = newext->ee_block; in ext4_ext_insert_extent()
2164 nearex->ee_len = newext->ee_len; in ext4_ext_insert_extent()
2177 err = ext4_ext_dirty(handle, inode, path + path->p_depth); in ext4_ext_insert_extent()
2189 ext4_lblk_t next, end = block + num - 1; in ext4_fill_es_cache_info()
2191 unsigned char blksize_bits = inode->i_sb->s_blocksize_bits; in ext4_fill_es_cache_info()
2232 * ext4_ext_determine_hole - determine hole around given block
2248 int depth = ext_depth(inode); in ext4_ext_determine_hole() local
2252 ex = path[depth].p_ext; in ext4_ext_determine_hole()
2254 /* there is no extent yet, so gap is [0;-] */ in ext4_ext_determine_hole()
2257 } else if (*lblk < le32_to_cpu(ex->ee_block)) { in ext4_ext_determine_hole()
2258 len = le32_to_cpu(ex->ee_block) - *lblk; in ext4_ext_determine_hole()
2259 } else if (*lblk >= le32_to_cpu(ex->ee_block) in ext4_ext_determine_hole()
2263 *lblk = le32_to_cpu(ex->ee_block) + ext4_ext_get_actual_len(ex); in ext4_ext_determine_hole()
2266 len = next - *lblk; in ext4_ext_determine_hole()
2285 hole_start + hole_len - 1, &es); in ext4_ext_put_gap_in_cache()
2290 hole_len = min(es.es_lblk - hole_start, hole_len); in ext4_ext_put_gap_in_cache()
2292 ext_debug(inode, " -> %u:%u\n", hole_start, hole_len); in ext4_ext_put_gap_in_cache()
2302 struct ext4_ext_path *path, int depth) in ext4_ext_rm_idx() argument
2308 depth--; in ext4_ext_rm_idx()
2309 path = path + depth; in ext4_ext_rm_idx()
2310 leaf = ext4_idx_pblock(path->p_idx); in ext4_ext_rm_idx()
2311 if (unlikely(path->p_hdr->eh_entries == 0)) { in ext4_ext_rm_idx()
2312 EXT4_ERROR_INODE(inode, "path->p_hdr->eh_entries == 0"); in ext4_ext_rm_idx()
2313 return -EFSCORRUPTED; in ext4_ext_rm_idx()
2319 if (path->p_idx != EXT_LAST_INDEX(path->p_hdr)) { in ext4_ext_rm_idx()
2320 int len = EXT_LAST_INDEX(path->p_hdr) - path->p_idx; in ext4_ext_rm_idx()
2322 memmove(path->p_idx, path->p_idx + 1, len); in ext4_ext_rm_idx()
2325 le16_add_cpu(&path->p_hdr->eh_entries, -1); in ext4_ext_rm_idx()
2335 while (--depth >= 0) { in ext4_ext_rm_idx()
2336 if (path->p_idx != EXT_FIRST_INDEX(path->p_hdr)) in ext4_ext_rm_idx()
2338 path--; in ext4_ext_rm_idx()
2342 path->p_idx->ei_block = (path+1)->p_idx->ei_block; in ext4_ext_rm_idx()
2361 int depth = ext_depth(inode); in ext4_ext_calc_credits_for_single_extent() local
2365 if (le16_to_cpu(path[depth].p_hdr->eh_entries) in ext4_ext_calc_credits_for_single_extent()
2366 < le16_to_cpu(path[depth].p_hdr->eh_max)) { in ext4_ext_calc_credits_for_single_extent()
2377 ret = 2 + EXT4_META_TRANS_BLOCKS(inode->i_sb); in ext4_ext_calc_credits_for_single_extent()
2397 int depth; in ext4_ext_index_trans_blocks() local
2403 depth = ext_depth(inode); in ext4_ext_index_trans_blocks()
2406 index = depth * 2; in ext4_ext_index_trans_blocks()
2408 index = depth * 3; in ext4_ext_index_trans_blocks()
2415 if (S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode) || in get_default_free_blocks_flags()
2424 * ext4_rereserve_cluster - increment the reserved cluster count when
2427 * @inode - file containing the cluster
2428 * @lblk - logical block in cluster to be reserved
2440 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_rereserve_cluster()
2445 spin_lock(&ei->i_block_reservation_lock); in ext4_rereserve_cluster()
2446 ei->i_reserved_data_blocks++; in ext4_rereserve_cluster()
2447 percpu_counter_add(&sbi->s_dirtyclusters_counter, 1); in ext4_rereserve_cluster()
2448 spin_unlock(&ei->i_block_reservation_lock); in ext4_rereserve_cluster()
2450 percpu_counter_add(&sbi->s_freeclusters_counter, 1); in ext4_rereserve_cluster()
2459 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_remove_blocks()
2466 if (from < le32_to_cpu(ex->ee_block) || in ext4_remove_blocks()
2467 to != le32_to_cpu(ex->ee_block) + ee_len - 1) { in ext4_remove_blocks()
2468 ext4_error(sbi->s_sb, in ext4_remove_blocks()
2469 "strange request: removal(2) %u-%u from %u:%u", in ext4_remove_blocks()
2470 from, to, le32_to_cpu(ex->ee_block), ee_len); in ext4_remove_blocks()
2475 spin_lock(&sbi->s_ext_stats_lock); in ext4_remove_blocks()
2476 sbi->s_ext_blocks += ee_len; in ext4_remove_blocks()
2477 sbi->s_ext_extents++; in ext4_remove_blocks()
2478 if (ee_len < sbi->s_ext_min) in ext4_remove_blocks()
2479 sbi->s_ext_min = ee_len; in ext4_remove_blocks()
2480 if (ee_len > sbi->s_ext_max) in ext4_remove_blocks()
2481 sbi->s_ext_max = ee_len; in ext4_remove_blocks()
2482 if (ext_depth(inode) > sbi->s_depth_max) in ext4_remove_blocks()
2483 sbi->s_depth_max = ext_depth(inode); in ext4_remove_blocks()
2484 spin_unlock(&sbi->s_ext_stats_lock); in ext4_remove_blocks()
2493 last_pblk = ext4_ext_pblock(ex) + ee_len - 1; in ext4_remove_blocks()
2495 if (partial->state != initial && in ext4_remove_blocks()
2496 partial->pclu != EXT4_B2C(sbi, last_pblk)) { in ext4_remove_blocks()
2497 if (partial->state == tofree) { in ext4_remove_blocks()
2499 if (ext4_is_pending(inode, partial->lblk)) in ext4_remove_blocks()
2502 EXT4_C2B(sbi, partial->pclu), in ext4_remove_blocks()
2503 sbi->s_cluster_ratio, flags); in ext4_remove_blocks()
2505 ext4_rereserve_cluster(inode, partial->lblk); in ext4_remove_blocks()
2507 partial->state = initial; in ext4_remove_blocks()
2510 num = le32_to_cpu(ex->ee_block) + ee_len - from; in ext4_remove_blocks()
2511 pblk = ext4_ext_pblock(ex) + ee_len - num; in ext4_remove_blocks()
2522 if ((EXT4_LBLK_COFF(sbi, to) != sbi->s_cluster_ratio - 1) && in ext4_remove_blocks()
2524 (partial->state != nofree)) { in ext4_remove_blocks()
2529 sbi->s_cluster_ratio, flags); in ext4_remove_blocks()
2532 partial->state = initial; in ext4_remove_blocks()
2548 if (partial->state != initial && partial->pclu != EXT4_B2C(sbi, pblk)) in ext4_remove_blocks()
2549 partial->state = initial; in ext4_remove_blocks()
2558 * cluster - we're either done freeing or the beginning of the in ext4_remove_blocks()
2562 if (partial->state == initial) { in ext4_remove_blocks()
2563 partial->pclu = EXT4_B2C(sbi, pblk); in ext4_remove_blocks()
2564 partial->lblk = from; in ext4_remove_blocks()
2565 partial->state = tofree; in ext4_remove_blocks()
2568 partial->state = initial; in ext4_remove_blocks()
2595 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_ext_rm_leaf()
2597 int depth = ext_depth(inode), credits, revoke_credits; in ext4_ext_rm_leaf() local
2609 if (!path[depth].p_hdr) in ext4_ext_rm_leaf()
2610 path[depth].p_hdr = ext_block_hdr(path[depth].p_bh); in ext4_ext_rm_leaf()
2611 eh = path[depth].p_hdr; in ext4_ext_rm_leaf()
2612 if (unlikely(path[depth].p_hdr == NULL)) { in ext4_ext_rm_leaf()
2613 EXT4_ERROR_INODE(inode, "path[%d].p_hdr == NULL", depth); in ext4_ext_rm_leaf()
2614 return -EFSCORRUPTED; in ext4_ext_rm_leaf()
2617 ex = path[depth].p_ext; in ext4_ext_rm_leaf()
2621 ex_ee_block = le32_to_cpu(ex->ee_block); in ext4_ext_rm_leaf()
2636 path[depth].p_ext = ex; in ext4_ext_rm_leaf()
2639 b = ex_ee_block+ex_ee_len - 1 < end ? in ext4_ext_rm_leaf()
2640 ex_ee_block+ex_ee_len - 1 : end; in ext4_ext_rm_leaf()
2653 if (sbi->s_cluster_ratio > 1) { in ext4_ext_rm_leaf()
2655 partial->pclu = EXT4_B2C(sbi, pblk); in ext4_ext_rm_leaf()
2656 partial->state = nofree; in ext4_ext_rm_leaf()
2658 ex--; in ext4_ext_rm_leaf()
2659 ex_ee_block = le32_to_cpu(ex->ee_block); in ext4_ext_rm_leaf()
2662 } else if (b != ex_ee_block + ex_ee_len - 1) { in ext4_ext_rm_leaf()
2667 ex_ee_block + ex_ee_len - 1); in ext4_ext_rm_leaf()
2668 err = -EFSCORRUPTED; in ext4_ext_rm_leaf()
2672 num = a - ex_ee_block; in ext4_ext_rm_leaf()
2683 credits = 7 + 2*(ex_ee_len/EXT4_BLOCKS_PER_GROUP(inode->i_sb)); in ext4_ext_rm_leaf()
2688 credits += EXT4_MAXQUOTAS_TRANS_BLOCKS(inode->i_sb); in ext4_ext_rm_leaf()
2695 ext4_free_metadata_revoke_credits(inode->i_sb, in ext4_ext_rm_leaf()
2697 ext4_free_data_revoke_credits(inode, b - a + 1); in ext4_ext_rm_leaf()
2703 err = -EAGAIN; in ext4_ext_rm_leaf()
2707 err = ext4_ext_get_access(handle, inode, path + depth); in ext4_ext_rm_leaf()
2719 ex->ee_len = cpu_to_le16(num); in ext4_ext_rm_leaf()
2731 if (end != EXT_MAX_BLOCKS - 1) { in ext4_ext_rm_leaf()
2737 memmove(ex, ex+1, (EXT_LAST_EXTENT(eh) - ex) * in ext4_ext_rm_leaf()
2744 le16_add_cpu(&eh->eh_entries, -1); in ext4_ext_rm_leaf()
2747 err = ext4_ext_dirty(handle, inode, path + depth); in ext4_ext_rm_leaf()
2753 ex--; in ext4_ext_rm_leaf()
2754 ex_ee_block = le32_to_cpu(ex->ee_block); in ext4_ext_rm_leaf()
2758 if (correct_index && eh->eh_entries) in ext4_ext_rm_leaf()
2768 if (partial->state == tofree && ex >= EXT_FIRST_EXTENT(eh)) { in ext4_ext_rm_leaf()
2769 pblk = ext4_ext_pblock(ex) + ex_ee_len - 1; in ext4_ext_rm_leaf()
2770 if (partial->pclu != EXT4_B2C(sbi, pblk)) { in ext4_ext_rm_leaf()
2773 if (ext4_is_pending(inode, partial->lblk)) in ext4_ext_rm_leaf()
2776 EXT4_C2B(sbi, partial->pclu), in ext4_ext_rm_leaf()
2777 sbi->s_cluster_ratio, flags); in ext4_ext_rm_leaf()
2779 ext4_rereserve_cluster(inode, partial->lblk); in ext4_ext_rm_leaf()
2781 partial->state = initial; in ext4_ext_rm_leaf()
2786 if (err == 0 && eh->eh_entries == 0 && path[depth].p_bh != NULL) in ext4_ext_rm_leaf()
2787 err = ext4_ext_rm_idx(handle, inode, path, depth); in ext4_ext_rm_leaf()
2800 BUG_ON(path->p_idx == NULL); in ext4_ext_more_to_rm()
2802 if (path->p_idx < EXT_FIRST_INDEX(path->p_hdr)) in ext4_ext_more_to_rm()
2809 if (le16_to_cpu(path->p_hdr->eh_entries) == path->p_block) in ext4_ext_more_to_rm()
2817 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_ext_remove_space()
2818 int depth = ext_depth(inode); in ext4_ext_remove_space() local
2832 depth + 1, in ext4_ext_remove_space()
2833 ext4_free_metadata_revoke_credits(inode->i_sb, depth)); in ext4_ext_remove_space()
2838 trace_ext4_ext_remove_space(inode, start, end, depth); in ext4_ext_remove_space()
2847 if (end < EXT_MAX_BLOCKS - 1) { in ext4_ext_remove_space()
2859 depth = ext_depth(inode); in ext4_ext_remove_space()
2861 ex = path[depth].p_ext; in ext4_ext_remove_space()
2863 if (depth) { in ext4_ext_remove_space()
2866 depth); in ext4_ext_remove_space()
2867 err = -EFSCORRUPTED; in ext4_ext_remove_space()
2872 ee_block = le32_to_cpu(ex->ee_block); in ext4_ext_remove_space()
2873 ex_end = ee_block + ext4_ext_get_actual_len(ex) - 1; in ext4_ext_remove_space()
2888 if (sbi->s_cluster_ratio > 1) { in ext4_ext_remove_space()
2889 pblk = ext4_ext_pblock(ex) + end - ee_block + 1; in ext4_ext_remove_space()
2905 } else if (sbi->s_cluster_ratio > 1 && end >= ex_end && in ext4_ext_remove_space()
2930 * after i_size and walking into the tree depth-wise. in ext4_ext_remove_space()
2932 depth = ext_depth(inode); in ext4_ext_remove_space()
2934 int k = i = depth; in ext4_ext_remove_space()
2935 while (--k > 0) in ext4_ext_remove_space()
2937 le16_to_cpu(path[k].p_hdr->eh_entries)+1; in ext4_ext_remove_space()
2939 path = kcalloc(depth + 1, sizeof(struct ext4_ext_path), in ext4_ext_remove_space()
2943 return -ENOMEM; in ext4_ext_remove_space()
2945 path[0].p_maxdepth = path[0].p_depth = depth; in ext4_ext_remove_space()
2949 if (ext4_ext_check(inode, path[0].p_hdr, depth, 0)) { in ext4_ext_remove_space()
2950 err = -EFSCORRUPTED; in ext4_ext_remove_space()
2957 if (i == depth) { in ext4_ext_remove_space()
2964 i--; in ext4_ext_remove_space()
2977 path[i].p_block = le16_to_cpu(path[i].p_hdr->eh_entries)+1; in ext4_ext_remove_space()
2980 le16_to_cpu(path[i].p_hdr->eh_entries)); in ext4_ext_remove_space()
2983 path[i].p_idx--; in ext4_ext_remove_space()
2986 ext_debug(inode, "level %d - index, first 0x%p, cur 0x%p\n", in ext4_ext_remove_space()
2996 depth - i - 1, in ext4_ext_remove_space()
3004 * Should be a no-op if we did IO above. */ in ext4_ext_remove_space()
3006 if (WARN_ON(i + 1 > depth)) { in ext4_ext_remove_space()
3007 err = -EFSCORRUPTED; in ext4_ext_remove_space()
3014 path[i].p_block = le16_to_cpu(path[i].p_hdr->eh_entries); in ext4_ext_remove_space()
3018 if (path[i].p_hdr->eh_entries == 0 && i > 0) { in ext4_ext_remove_space()
3027 i--; in ext4_ext_remove_space()
3032 trace_ext4_ext_remove_space_done(inode, start, end, depth, &partial, in ext4_ext_remove_space()
3033 path->p_hdr->eh_entries); in ext4_ext_remove_space()
3046 sbi->s_cluster_ratio, flags); in ext4_ext_remove_space()
3053 if (path->p_hdr->eh_entries == 0) { in ext4_ext_remove_space()
3060 ext_inode_hdr(inode)->eh_depth = 0; in ext4_ext_remove_space()
3061 ext_inode_hdr(inode)->eh_max = in ext4_ext_remove_space()
3070 if (err == -EAGAIN) in ext4_ext_remove_space()
3088 printk(KERN_INFO "EXT4-fs: file extents enabled" in ext4_ext_init()
3101 spin_lock_init(&EXT4_SB(sb)->s_ext_stats_lock); in ext4_ext_init()
3102 EXT4_SB(sb)->s_ext_min = 1 << 30; in ext4_ext_init()
3103 EXT4_SB(sb)->s_ext_max = 0; in ext4_ext_init()
3117 if (EXT4_SB(sb)->s_ext_blocks && EXT4_SB(sb)->s_ext_extents) { in ext4_ext_release()
3119 printk(KERN_ERR "EXT4-fs: %lu blocks in %lu extents (%lu ave)\n", in ext4_ext_release()
3120 sbi->s_ext_blocks, sbi->s_ext_extents, in ext4_ext_release()
3121 sbi->s_ext_blocks / sbi->s_ext_extents); in ext4_ext_release()
3122 printk(KERN_ERR "EXT4-fs: extents: %lu min, %lu max, max depth %lu\n", in ext4_ext_release()
3123 sbi->s_ext_min, sbi->s_ext_max, sbi->s_depth_max); in ext4_ext_release()
3134 ee_block = le32_to_cpu(ex->ee_block); in ext4_zeroout_es()
3145 /* FIXME!! we need to try to merge to left or right after zero-out */
3153 return ext4_issue_zeroout(inode, le32_to_cpu(ex->ee_block), ee_pblock, in ext4_ext_zeroout()
3190 unsigned int ee_len, depth; in ext4_split_extent_at() local
3200 depth = ext_depth(inode); in ext4_split_extent_at()
3201 ex = path[depth].p_ext; in ext4_split_extent_at()
3202 ee_block = le32_to_cpu(ex->ee_block); in ext4_split_extent_at()
3204 newblock = split - ee_block + ext4_ext_pblock(ex); in ext4_split_extent_at()
3212 err = ext4_ext_get_access(handle, inode, path + depth); in ext4_split_extent_at()
3230 err = ext4_ext_dirty(handle, inode, path + path->p_depth); in ext4_split_extent_at()
3236 ex->ee_len = cpu_to_le16(split - ee_block); in ext4_split_extent_at()
3244 err = ext4_ext_dirty(handle, inode, path + depth); in ext4_split_extent_at()
3249 ex2->ee_block = cpu_to_le32(split); in ext4_split_extent_at()
3250 ex2->ee_len = cpu_to_le16(ee_len - (split - ee_block)); in ext4_split_extent_at()
3256 if (err != -ENOSPC && err != -EDQUOT) in ext4_split_extent_at()
3263 zero_ex.ee_block = ex2->ee_block; in ext4_split_extent_at()
3270 zero_ex.ee_block = ex->ee_block; in ext4_split_extent_at()
3287 ex->ee_len = cpu_to_le16(ee_len); in ext4_split_extent_at()
3289 err = ext4_ext_dirty(handle, inode, path + path->p_depth); in ext4_split_extent_at()
3303 ex->ee_len = orig_ex.ee_len; in ext4_split_extent_at()
3306 * and err is a non-zero error code. in ext4_split_extent_at()
3308 ext4_ext_dirty(handle, inode, path + path->p_depth); in ext4_split_extent_at()
3336 unsigned int ee_len, depth; in ext4_split_extent() local
3340 int allocated = map->m_len; in ext4_split_extent()
3342 depth = ext_depth(inode); in ext4_split_extent()
3343 ex = path[depth].p_ext; in ext4_split_extent()
3344 ee_block = le32_to_cpu(ex->ee_block); in ext4_split_extent()
3348 if (map->m_lblk + map->m_len < ee_block + ee_len) { in ext4_split_extent()
3357 map->m_lblk + map->m_len, split_flag1, flags1); in ext4_split_extent()
3361 allocated = ee_len - (map->m_lblk - ee_block); in ext4_split_extent()
3367 path = ext4_find_extent(inode, map->m_lblk, ppath, flags); in ext4_split_extent()
3370 depth = ext_depth(inode); in ext4_split_extent()
3371 ex = path[depth].p_ext; in ext4_split_extent()
3374 (unsigned long) map->m_lblk); in ext4_split_extent()
3375 return -EFSCORRUPTED; in ext4_split_extent()
3380 if (map->m_lblk >= ee_block) { in ext4_split_extent()
3388 map->m_lblk, split_flag1, flags); in ext4_split_extent()
3401 * extent into multiple extents (up to three - one initialized and two
3408 * Pre-conditions:
3409 * - The extent pointed to by 'path' is unwritten.
3410 * - The extent pointed to by 'path' contains a superset
3411 * of the logical span [map->m_lblk, map->m_lblk + map->m_len).
3413 * Post-conditions on success:
3414 * - the returned value is the number of blocks beyond map->l_lblk
3416 * It is guaranteed to be >= map->m_len.
3431 unsigned int ee_len, depth, map_len = map->m_len; in ext4_ext_convert_to_initialized() local
3437 (unsigned long long)map->m_lblk, map_len); in ext4_ext_convert_to_initialized()
3439 sbi = EXT4_SB(inode->i_sb); in ext4_ext_convert_to_initialized()
3440 eof_block = (EXT4_I(inode)->i_disksize + inode->i_sb->s_blocksize - 1) in ext4_ext_convert_to_initialized()
3441 >> inode->i_sb->s_blocksize_bits; in ext4_ext_convert_to_initialized()
3442 if (eof_block < map->m_lblk + map_len) in ext4_ext_convert_to_initialized()
3443 eof_block = map->m_lblk + map_len; in ext4_ext_convert_to_initialized()
3445 depth = ext_depth(inode); in ext4_ext_convert_to_initialized()
3446 eh = path[depth].p_hdr; in ext4_ext_convert_to_initialized()
3447 ex = path[depth].p_ext; in ext4_ext_convert_to_initialized()
3448 ee_block = le32_to_cpu(ex->ee_block); in ext4_ext_convert_to_initialized()
3455 /* Pre-conditions */ in ext4_ext_convert_to_initialized()
3457 BUG_ON(!in_range(map->m_lblk, ee_block, ee_len)); in ext4_ext_convert_to_initialized()
3468 * - L1: we do not deal with writes covering the whole extent. in ext4_ext_convert_to_initialized()
3471 * - L2: we only attempt to merge with an extent stored in the in ext4_ext_convert_to_initialized()
3474 if ((map->m_lblk == ee_block) && in ext4_ext_convert_to_initialized()
3482 abut_ex = ex - 1; in ext4_ext_convert_to_initialized()
3483 prev_lblk = le32_to_cpu(abut_ex->ee_block); in ext4_ext_convert_to_initialized()
3491 * - C1: abut_ex is initialized, in ext4_ext_convert_to_initialized()
3492 * - C2: abut_ex is logically abutting ex, in ext4_ext_convert_to_initialized()
3493 * - C3: abut_ex is physically abutting ex, in ext4_ext_convert_to_initialized()
3494 * - C4: abut_ex can receive the additional blocks without in ext4_ext_convert_to_initialized()
3500 (prev_len < (EXT_INIT_MAX_LEN - map_len))) { /*C4*/ in ext4_ext_convert_to_initialized()
3501 err = ext4_ext_get_access(handle, inode, path + depth); in ext4_ext_convert_to_initialized()
3509 ex->ee_block = cpu_to_le32(ee_block + map_len); in ext4_ext_convert_to_initialized()
3511 ex->ee_len = cpu_to_le16(ee_len - map_len); in ext4_ext_convert_to_initialized()
3515 abut_ex->ee_len = cpu_to_le16(prev_len + map_len); in ext4_ext_convert_to_initialized()
3520 } else if (((map->m_lblk + map_len) == (ee_block + ee_len)) && in ext4_ext_convert_to_initialized()
3529 next_lblk = le32_to_cpu(abut_ex->ee_block); in ext4_ext_convert_to_initialized()
3537 * - C1: abut_ex is initialized, in ext4_ext_convert_to_initialized()
3538 * - C2: abut_ex is logically abutting ex, in ext4_ext_convert_to_initialized()
3539 * - C3: abut_ex is physically abutting ex, in ext4_ext_convert_to_initialized()
3540 * - C4: abut_ex can receive the additional blocks without in ext4_ext_convert_to_initialized()
3544 ((map->m_lblk + map_len) == next_lblk) && /*C2*/ in ext4_ext_convert_to_initialized()
3546 (next_len < (EXT_INIT_MAX_LEN - map_len))) { /*C4*/ in ext4_ext_convert_to_initialized()
3547 err = ext4_ext_get_access(handle, inode, path + depth); in ext4_ext_convert_to_initialized()
3555 abut_ex->ee_block = cpu_to_le32(next_lblk - map_len); in ext4_ext_convert_to_initialized()
3556 ext4_ext_store_pblock(abut_ex, next_pblk - map_len); in ext4_ext_convert_to_initialized()
3557 ex->ee_len = cpu_to_le16(ee_len - map_len); in ext4_ext_convert_to_initialized()
3561 abut_ex->ee_len = cpu_to_le16(next_len + map_len); in ext4_ext_convert_to_initialized()
3569 err = ext4_ext_dirty(handle, inode, path + depth); in ext4_ext_convert_to_initialized()
3572 path[depth].p_ext = abut_ex; in ext4_ext_convert_to_initialized()
3575 allocated = ee_len - (map->m_lblk - ee_block); in ext4_ext_convert_to_initialized()
3577 WARN_ON(map->m_lblk < ee_block); in ext4_ext_convert_to_initialized()
3585 max_zeroout = sbi->s_extent_max_zeroout_kb >> in ext4_ext_convert_to_initialized()
3586 (inode->i_sb->s_blocksize_bits - 10); in ext4_ext_convert_to_initialized()
3599 split_map.m_lblk = map->m_lblk; in ext4_ext_convert_to_initialized()
3600 split_map.m_len = map->m_len; in ext4_ext_convert_to_initialized()
3609 cpu_to_le16(allocated - split_map.m_len); in ext4_ext_convert_to_initialized()
3612 split_map.m_len - ee_block); in ext4_ext_convert_to_initialized()
3618 if (split_map.m_lblk - ee_block + split_map.m_len < in ext4_ext_convert_to_initialized()
3622 zero_ex2.ee_block = ex->ee_block; in ext4_ext_convert_to_initialized()
3623 zero_ex2.ee_len = cpu_to_le16(split_map.m_lblk - in ext4_ext_convert_to_initialized()
3632 split_map.m_len += split_map.m_lblk - ee_block; in ext4_ext_convert_to_initialized()
3634 allocated = map->m_len; in ext4_ext_convert_to_initialized()
3665 * This works the same way in the case of initialized -> unwritten conversion.
3688 int split_flag = 0, depth; in ext4_split_convert_extents() local
3691 (unsigned long long)map->m_lblk, map->m_len); in ext4_split_convert_extents()
3693 eof_block = (EXT4_I(inode)->i_disksize + inode->i_sb->s_blocksize - 1) in ext4_split_convert_extents()
3694 >> inode->i_sb->s_blocksize_bits; in ext4_split_convert_extents()
3695 if (eof_block < map->m_lblk + map->m_len) in ext4_split_convert_extents()
3696 eof_block = map->m_lblk + map->m_len; in ext4_split_convert_extents()
3701 depth = ext_depth(inode); in ext4_split_convert_extents()
3702 ex = path[depth].p_ext; in ext4_split_convert_extents()
3703 ee_block = le32_to_cpu(ex->ee_block); in ext4_split_convert_extents()
3728 int depth; in ext4_convert_unwritten_extents_endio() local
3731 depth = ext_depth(inode); in ext4_convert_unwritten_extents_endio()
3732 ex = path[depth].p_ext; in ext4_convert_unwritten_extents_endio()
3733 ee_block = le32_to_cpu(ex->ee_block); in ext4_convert_unwritten_extents_endio()
3745 if (ee_block != map->m_lblk || ee_len > map->m_len) { in ext4_convert_unwritten_extents_endio()
3747 ext4_warning(inode->i_sb, "Inode (%ld) finished: extent logical block %llu," in ext4_convert_unwritten_extents_endio()
3749 inode->i_ino, (unsigned long long)ee_block, ee_len, in ext4_convert_unwritten_extents_endio()
3750 (unsigned long long)map->m_lblk, map->m_len); in ext4_convert_unwritten_extents_endio()
3756 path = ext4_find_extent(inode, map->m_lblk, ppath, 0); in ext4_convert_unwritten_extents_endio()
3759 depth = ext_depth(inode); in ext4_convert_unwritten_extents_endio()
3760 ex = path[depth].p_ext; in ext4_convert_unwritten_extents_endio()
3763 err = ext4_ext_get_access(handle, inode, path + depth); in ext4_convert_unwritten_extents_endio()
3775 err = ext4_ext_dirty(handle, inode, path + path->p_depth); in ext4_convert_unwritten_extents_endio()
3791 int depth; in convert_initialized_extent() local
3798 if (map->m_len > EXT_UNWRITTEN_MAX_LEN) in convert_initialized_extent()
3799 map->m_len = EXT_UNWRITTEN_MAX_LEN / 2; in convert_initialized_extent()
3801 depth = ext_depth(inode); in convert_initialized_extent()
3802 ex = path[depth].p_ext; in convert_initialized_extent()
3803 ee_block = le32_to_cpu(ex->ee_block); in convert_initialized_extent()
3809 if (ee_block != map->m_lblk || ee_len > map->m_len) { in convert_initialized_extent()
3814 path = ext4_find_extent(inode, map->m_lblk, ppath, 0); in convert_initialized_extent()
3817 depth = ext_depth(inode); in convert_initialized_extent()
3818 ex = path[depth].p_ext; in convert_initialized_extent()
3821 (unsigned long) map->m_lblk); in convert_initialized_extent()
3822 return -EFSCORRUPTED; in convert_initialized_extent()
3826 err = ext4_ext_get_access(handle, inode, path + depth); in convert_initialized_extent()
3838 err = ext4_ext_dirty(handle, inode, path + path->p_depth); in convert_initialized_extent()
3845 map->m_flags |= EXT4_MAP_UNWRITTEN; in convert_initialized_extent()
3846 if (*allocated > map->m_len) in convert_initialized_extent()
3847 *allocated = map->m_len; in convert_initialized_extent()
3848 map->m_len = *allocated; in convert_initialized_extent()
3863 (unsigned long long)map->m_lblk, map->m_len, flags, in ext4_ext_handle_unwritten_extents()
3891 map->m_len); in ext4_ext_handle_unwritten_extents()
3892 err = -EFSCORRUPTED; in ext4_ext_handle_unwritten_extents()
3895 map->m_flags |= EXT4_MAP_UNWRITTEN; in ext4_ext_handle_unwritten_extents()
3913 map->m_flags |= EXT4_MAP_UNWRITTEN; in ext4_ext_handle_unwritten_extents()
3926 map->m_flags |= EXT4_MAP_UNWRITTEN; in ext4_ext_handle_unwritten_extents()
3947 map->m_len); in ext4_ext_handle_unwritten_extents()
3948 err = -EFSCORRUPTED; in ext4_ext_handle_unwritten_extents()
3954 map->m_flags |= EXT4_MAP_NEW; in ext4_ext_handle_unwritten_extents()
3956 map->m_flags |= EXT4_MAP_MAPPED; in ext4_ext_handle_unwritten_extents()
3958 map->m_pblk = newblock; in ext4_ext_handle_unwritten_extents()
3959 if (allocated > map->m_len) in ext4_ext_handle_unwritten_extents()
3960 allocated = map->m_len; in ext4_ext_handle_unwritten_extents()
3961 map->m_len = allocated; in ext4_ext_handle_unwritten_extents()
3968 * get_implied_cluster_alloc - check to see if the requested
3972 * @map The requested lblk->pblk mapping
3982 * |--- cluster # N--|
3983 * |--- extent ---| |---- requested region ---|
3988 * |--------- cluster # N ----------------|
3989 * |--- requested region --| |------- extent ----|
3994 * |------------- cluster # N-------------|
3995 * |----- ex -----| |---- ex_right ----|
3996 * |------ requested region ------|
3999 * In each of the above cases, we need to set the map->m_pblk and
4000 * map->m_len so it corresponds to the return the extent labelled as
4002 * cluster EXT4_B2C(sbi, map->m_lblk). We will then return 1 to
4003 * signal to ext4_ext_map_blocks() that map->m_pblk should be treated
4014 ext4_lblk_t c_offset = EXT4_LBLK_COFF(sbi, map->m_lblk); in get_implied_cluster_alloc()
4017 ext4_lblk_t ee_block = le32_to_cpu(ex->ee_block); in get_implied_cluster_alloc()
4023 ex_cluster_end = EXT4_B2C(sbi, ee_block + ee_len - 1); in get_implied_cluster_alloc()
4026 rr_cluster_start = EXT4_B2C(sbi, map->m_lblk); in get_implied_cluster_alloc()
4031 ee_start += ee_len - 1; in get_implied_cluster_alloc()
4032 map->m_pblk = EXT4_PBLK_CMASK(sbi, ee_start) + c_offset; in get_implied_cluster_alloc()
4033 map->m_len = min(map->m_len, in get_implied_cluster_alloc()
4034 (unsigned) sbi->s_cluster_ratio - c_offset); in get_implied_cluster_alloc()
4038 * |--------- cluster # N-------------| in get_implied_cluster_alloc()
4039 * |------- extent ----| in get_implied_cluster_alloc()
4040 * |--- requested region ---| in get_implied_cluster_alloc()
4044 if (map->m_lblk < ee_block) in get_implied_cluster_alloc()
4045 map->m_len = min(map->m_len, ee_block - map->m_lblk); in get_implied_cluster_alloc()
4051 * |------------- cluster # N-------------| in get_implied_cluster_alloc()
4052 * |----- ex -----| |---- ex_right ----| in get_implied_cluster_alloc()
4053 * |------ requested region ------| in get_implied_cluster_alloc()
4056 if (map->m_lblk > ee_block) { in get_implied_cluster_alloc()
4058 map->m_len = min(map->m_len, next - map->m_lblk); in get_implied_cluster_alloc()
4075 * down_read(&EXT4_I(inode)->i_data_sem) if not allocating file system block
4076 * (ie, create is zero). Otherwise down_write(&EXT4_I(inode)->i_data_sem)
4079 * if create == 0 and these are pre-allocated blocks
4093 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_ext_map_blocks()
4095 int err = 0, depth, ret; in ext4_ext_map_blocks() local
4101 ext_debug(inode, "blocks %u/%u requested\n", map->m_lblk, map->m_len); in ext4_ext_map_blocks()
4102 trace_ext4_ext_map_blocks_enter(inode, map->m_lblk, map->m_len, flags); in ext4_ext_map_blocks()
4105 path = ext4_find_extent(inode, map->m_lblk, NULL, 0); in ext4_ext_map_blocks()
4112 depth = ext_depth(inode); in ext4_ext_map_blocks()
4119 if (unlikely(path[depth].p_ext == NULL && depth != 0)) { in ext4_ext_map_blocks()
4121 "lblock: %lu, depth: %d pblock %lld", in ext4_ext_map_blocks()
4122 (unsigned long) map->m_lblk, depth, in ext4_ext_map_blocks()
4123 path[depth].p_block); in ext4_ext_map_blocks()
4124 err = -EFSCORRUPTED; in ext4_ext_map_blocks()
4128 ex = path[depth].p_ext; in ext4_ext_map_blocks()
4130 ext4_lblk_t ee_block = le32_to_cpu(ex->ee_block); in ext4_ext_map_blocks()
4144 if (in_range(map->m_lblk, ee_block, ee_len)) { in ext4_ext_map_blocks()
4145 newblock = map->m_lblk - ee_block + ee_start; in ext4_ext_map_blocks()
4147 allocated = ee_len - (map->m_lblk - ee_block); in ext4_ext_map_blocks()
4148 ext_debug(inode, "%u fit into %u:%d -> %llu\n", in ext4_ext_map_blocks()
4149 map->m_lblk, ee_block, ee_len, newblock); in ext4_ext_map_blocks()
4161 map->m_flags |= EXT4_MAP_MAPPED; in ext4_ext_map_blocks()
4162 map->m_pblk = newblock; in ext4_ext_map_blocks()
4163 if (allocated > map->m_len) in ext4_ext_map_blocks()
4164 allocated = map->m_len; in ext4_ext_map_blocks()
4165 map->m_len = allocated; in ext4_ext_map_blocks()
4188 hole_start = map->m_lblk; in ext4_ext_map_blocks()
4196 /* Update hole_len to reflect hole size after map->m_lblk */ in ext4_ext_map_blocks()
4197 if (hole_start != map->m_lblk) in ext4_ext_map_blocks()
4198 hole_len -= map->m_lblk - hole_start; in ext4_ext_map_blocks()
4199 map->m_pblk = 0; in ext4_ext_map_blocks()
4200 map->m_len = min_t(unsigned int, map->m_len, hole_len); in ext4_ext_map_blocks()
4208 newex.ee_block = cpu_to_le32(map->m_lblk); in ext4_ext_map_blocks()
4209 cluster_offset = EXT4_LBLK_COFF(sbi, map->m_lblk); in ext4_ext_map_blocks()
4216 get_implied_cluster_alloc(inode->i_sb, map, ex, path)) { in ext4_ext_map_blocks()
4217 ar.len = allocated = map->m_len; in ext4_ext_map_blocks()
4218 newblock = map->m_pblk; in ext4_ext_map_blocks()
4223 ar.lleft = map->m_lblk; in ext4_ext_map_blocks()
4227 ar.lright = map->m_lblk; in ext4_ext_map_blocks()
4234 if ((sbi->s_cluster_ratio > 1) && err && in ext4_ext_map_blocks()
4235 get_implied_cluster_alloc(inode->i_sb, map, &ex2, path)) { in ext4_ext_map_blocks()
4236 ar.len = allocated = map->m_len; in ext4_ext_map_blocks()
4237 newblock = map->m_pblk; in ext4_ext_map_blocks()
4247 if (map->m_len > EXT_INIT_MAX_LEN && in ext4_ext_map_blocks()
4249 map->m_len = EXT_INIT_MAX_LEN; in ext4_ext_map_blocks()
4250 else if (map->m_len > EXT_UNWRITTEN_MAX_LEN && in ext4_ext_map_blocks()
4252 map->m_len = EXT_UNWRITTEN_MAX_LEN; in ext4_ext_map_blocks()
4255 newex.ee_len = cpu_to_le16(map->m_len); in ext4_ext_map_blocks()
4260 allocated = map->m_len; in ext4_ext_map_blocks()
4264 ar.goal = ext4_ext_find_goal(inode, path, map->m_lblk); in ext4_ext_map_blocks()
4265 ar.logical = map->m_lblk; in ext4_ext_map_blocks()
4274 offset = EXT4_LBLK_COFF(sbi, map->m_lblk); in ext4_ext_map_blocks()
4276 ar.goal -= offset; in ext4_ext_map_blocks()
4277 ar.logical -= offset; in ext4_ext_map_blocks()
4278 if (S_ISREG(inode->i_mode)) in ext4_ext_map_blocks()
4281 /* disable in-core preallocation for non-regular files */ in ext4_ext_map_blocks()
4293 ar.len = EXT4_C2B(sbi, ar.len) - offset; in ext4_ext_map_blocks()
4307 map->m_flags |= EXT4_MAP_UNWRITTEN; in ext4_ext_map_blocks()
4336 if (test_opt(inode->i_sb, DELALLOC) && allocated_clusters) { in ext4_ext_map_blocks()
4349 * When allocating non-delayed allocated clusters in ext4_ext_map_blocks()
4359 lblk = EXT4_LBLK_CMASK(sbi, map->m_lblk); in ext4_ext_map_blocks()
4360 len = allocated_clusters << sbi->s_cluster_bits; in ext4_ext_map_blocks()
4376 map->m_flags |= (EXT4_MAP_NEW | EXT4_MAP_MAPPED); in ext4_ext_map_blocks()
4377 map->m_pblk = pblk; in ext4_ext_map_blocks()
4378 map->m_len = ar.len; in ext4_ext_map_blocks()
4379 allocated = map->m_len; in ext4_ext_map_blocks()
4392 struct super_block *sb = inode->i_sb; in ext4_ext_truncate()
4403 EXT4_I(inode)->i_disksize = inode->i_size; in ext4_ext_truncate()
4408 last_block = (inode->i_size + sb->s_blocksize - 1) in ext4_ext_truncate()
4412 EXT_MAX_BLOCKS - last_block); in ext4_ext_truncate()
4413 if (err == -ENOMEM) { in ext4_ext_truncate()
4421 err = ext4_ext_remove_space(inode, last_block, EXT_MAX_BLOCKS - 1); in ext4_ext_truncate()
4422 if (err == -ENOMEM) { in ext4_ext_truncate()
4439 int depth = 0; in ext4_alloc_file_blocks() local
4459 depth = ext_depth(inode); in ext4_alloc_file_blocks()
4464 * Recalculate credits when extent tree depth changes. in ext4_alloc_file_blocks()
4466 if (depth != ext_depth(inode)) { in ext4_alloc_file_blocks()
4468 depth = ext_depth(inode); in ext4_alloc_file_blocks()
4481 inode->i_ino, map.m_lblk, in ext4_alloc_file_blocks()
4488 map.m_len = len = len - ret; in ext4_alloc_file_blocks()
4489 epos = (loff_t)map.m_lblk << inode->i_blkbits; in ext4_alloc_file_blocks()
4490 inode->i_ctime = current_time(inode); in ext4_alloc_file_blocks()
4495 inode->i_mtime = inode->i_ctime; in ext4_alloc_file_blocks()
4504 if (ret == -ENOSPC && in ext4_alloc_file_blocks()
4505 ext4_should_retry_alloc(inode->i_sb, &retries)) { in ext4_alloc_file_blocks()
4530 unsigned int blkbits = inode->i_blkbits; in ext4_zero_range()
4536 ret = ext4_force_commit(inode->i_sb); in ext4_zero_range()
4551 return -EINVAL; in ext4_zero_range()
4552 partial_begin = offset & ((1 << blkbits) - 1); in ext4_zero_range()
4553 partial_end = (offset + len) & ((1 << blkbits) - 1); in ext4_zero_range()
4560 max_blocks -= lblk; in ext4_zero_range()
4568 ret = -EOPNOTSUPP; in ext4_zero_range()
4573 (offset + len > inode->i_size || in ext4_zero_range()
4574 offset + len > EXT4_I(inode)->i_disksize)) { in ext4_zero_range()
4590 (round_up((offset + len), 1 << blkbits) - in ext4_zero_range()
4607 down_write(&EXT4_I(inode)->i_mmap_sem); in ext4_zero_range()
4611 up_write(&EXT4_I(inode)->i_mmap_sem); in ext4_zero_range()
4617 up_write(&EXT4_I(inode)->i_mmap_sem); in ext4_zero_range()
4621 truncate_pagecache_range(inode, start, end - 1); in ext4_zero_range()
4622 inode->i_mtime = inode->i_ctime = current_time(inode); in ext4_zero_range()
4626 up_write(&EXT4_I(inode)->i_mmap_sem); in ext4_zero_range()
4643 ext4_std_error(inode->i_sb, ret); in ext4_zero_range()
4647 inode->i_mtime = inode->i_ctime = current_time(inode); in ext4_zero_range()
4658 if (file->f_flags & O_SYNC) in ext4_zero_range()
4671 * For block-mapped files, posix_fallocate should fall back to the method
4683 unsigned int blkbits = inode->i_blkbits; in ext4_fallocate()
4687 * range since we would need to re-encrypt blocks with a in ext4_fallocate()
4693 return -EOPNOTSUPP; in ext4_fallocate()
4699 return -EOPNOTSUPP; in ext4_fallocate()
4735 * We only support preallocation for extent-based files only in ext4_fallocate()
4738 ret = -EOPNOTSUPP; in ext4_fallocate()
4743 (offset + len > inode->i_size || in ext4_fallocate()
4744 offset + len > EXT4_I(inode)->i_disksize)) { in ext4_fallocate()
4758 if (file->f_flags & O_SYNC && EXT4_SB(inode->i_sb)->s_journal) { in ext4_fallocate()
4759 ret = ext4_fc_commit(EXT4_SB(inode->i_sb)->s_journal, in ext4_fallocate()
4760 EXT4_I(inode)->i_sync_tid); in ext4_fallocate()
4786 unsigned int blkbits = inode->i_blkbits; in ext4_convert_unwritten_extents()
4800 map.m_len = (max_blocks -= ret); in ext4_convert_unwritten_extents()
4812 ext4_warning(inode->i_sb, in ext4_convert_unwritten_extents()
4815 inode->i_ino, map.m_lblk, in ext4_convert_unwritten_extents()
4847 list_for_each_entry(io_end_vec, &io_end->list_vec, list) { in ext4_convert_unwritten_io_end_vec()
4848 ret = ext4_convert_unwritten_extents(handle, io_end->inode, in ext4_convert_unwritten_io_end_vec()
4849 io_end_vec->offset, in ext4_convert_unwritten_io_end_vec()
4850 io_end_vec->size); in ext4_convert_unwritten_io_end_vec()
4865 int blockbits = inode->i_sb->s_blocksize_bits; in ext4_iomap_xattr_fiemap()
4869 /* in-inode? */ in ext4_iomap_xattr_fiemap()
4877 physical = (__u64)iloc.bh->b_blocknr << blockbits; in ext4_iomap_xattr_fiemap()
4879 EXT4_I(inode)->i_extra_isize; in ext4_iomap_xattr_fiemap()
4881 length = EXT4_SB(inode->i_sb)->s_inode_size - offset; in ext4_iomap_xattr_fiemap()
4884 } else if (EXT4_I(inode)->i_file_acl) { /* external block */ in ext4_iomap_xattr_fiemap()
4885 physical = (__u64)EXT4_I(inode)->i_file_acl << blockbits; in ext4_iomap_xattr_fiemap()
4886 length = inode->i_sb->s_blocksize; in ext4_iomap_xattr_fiemap()
4889 /* no in-inode or external block for xattr, so return -ENOENT */ in ext4_iomap_xattr_fiemap()
4890 error = -ENOENT; in ext4_iomap_xattr_fiemap()
4894 iomap->addr = physical; in ext4_iomap_xattr_fiemap()
4895 iomap->offset = 0; in ext4_iomap_xattr_fiemap()
4896 iomap->length = length; in ext4_iomap_xattr_fiemap()
4897 iomap->type = iomap_type; in ext4_iomap_xattr_fiemap()
4898 iomap->flags = 0; in ext4_iomap_xattr_fiemap()
4910 if (error == 0 && (offset >= iomap->length)) in ext4_iomap_xattr_begin()
4911 error = -ENOENT; in ext4_iomap_xattr_begin()
4924 maxbytes = inode->i_sb->s_maxbytes; in ext4_fiemap_check_ranges()
4926 maxbytes = EXT4_SB(inode->i_sb)->s_bitmap_maxbytes; in ext4_fiemap_check_ranges()
4929 return -EINVAL; in ext4_fiemap_check_ranges()
4931 return -EFBIG; in ext4_fiemap_check_ranges()
4936 if (*len > maxbytes || (maxbytes - *len) < start) in ext4_fiemap_check_ranges()
4937 *len = maxbytes - start; in ext4_fiemap_check_ranges()
4946 if (fieinfo->fi_flags & FIEMAP_FLAG_CACHE) { in ext4_fiemap()
4950 fieinfo->fi_flags &= ~FIEMAP_FLAG_CACHE; in ext4_fiemap()
4962 if (fieinfo->fi_flags & FIEMAP_FLAG_XATTR) { in ext4_fiemap()
4963 fieinfo->fi_flags &= ~FIEMAP_FLAG_XATTR; in ext4_fiemap()
4981 down_read(&EXT4_I(inode)->xattr_sem); in ext4_get_es_cache()
4983 up_read(&EXT4_I(inode)->xattr_sem); in ext4_get_es_cache()
4988 if (fieinfo->fi_flags & FIEMAP_FLAG_CACHE) { in ext4_get_es_cache()
4992 fieinfo->fi_flags &= ~FIEMAP_FLAG_CACHE; in ext4_get_es_cache()
5003 start_blk = start >> inode->i_sb->s_blocksize_bits; in ext4_get_es_cache()
5004 last_blk = (start + len - 1) >> inode->i_sb->s_blocksize_bits; in ext4_get_es_cache()
5006 last_blk = EXT_MAX_BLOCKS-1; in ext4_get_es_cache()
5007 len_blks = ((ext4_lblk_t) last_blk) - start_blk + 1; in ext4_get_es_cache()
5018 * Shift the extents of a path structure lying between path[depth].p_ext
5019 * and EXT_LAST_EXTENT(path[depth].p_hdr), by @shift blocks. @SHIFT tells
5027 int depth, err = 0; in ext4_ext_shift_path_extents() local
5031 depth = path->p_depth; in ext4_ext_shift_path_extents()
5033 while (depth >= 0) { in ext4_ext_shift_path_extents()
5034 if (depth == path->p_depth) { in ext4_ext_shift_path_extents()
5035 ex_start = path[depth].p_ext; in ext4_ext_shift_path_extents()
5037 return -EFSCORRUPTED; in ext4_ext_shift_path_extents()
5039 ex_last = EXT_LAST_EXTENT(path[depth].p_hdr); in ext4_ext_shift_path_extents()
5042 if (ex_start == EXT_FIRST_EXTENT(path[depth].p_hdr)) { in ext4_ext_shift_path_extents()
5045 credits = depth + 2; in ext4_ext_shift_path_extents()
5053 err = -EAGAIN; in ext4_ext_shift_path_extents()
5057 err = ext4_ext_get_access(handle, inode, path + depth); in ext4_ext_shift_path_extents()
5063 le32_add_cpu(&ex_start->ee_block, in ext4_ext_shift_path_extents()
5064 -shift); in ext4_ext_shift_path_extents()
5067 EXT_FIRST_EXTENT(path[depth].p_hdr)) in ext4_ext_shift_path_extents()
5070 path, ex_start - 1)) in ext4_ext_shift_path_extents()
5071 ex_last--; in ext4_ext_shift_path_extents()
5075 le32_add_cpu(&ex_last->ee_block, shift); in ext4_ext_shift_path_extents()
5078 ex_last--; in ext4_ext_shift_path_extents()
5081 err = ext4_ext_dirty(handle, inode, path + depth); in ext4_ext_shift_path_extents()
5085 if (--depth < 0 || !update) in ext4_ext_shift_path_extents()
5090 err = ext4_ext_get_access(handle, inode, path + depth); in ext4_ext_shift_path_extents()
5095 le32_add_cpu(&path[depth].p_idx->ei_block, -shift); in ext4_ext_shift_path_extents()
5097 le32_add_cpu(&path[depth].p_idx->ei_block, shift); in ext4_ext_shift_path_extents()
5098 err = ext4_ext_dirty(handle, inode, path + depth); in ext4_ext_shift_path_extents()
5103 if (path[depth].p_idx != EXT_FIRST_INDEX(path[depth].p_hdr)) in ext4_ext_shift_path_extents()
5106 depth--; in ext4_ext_shift_path_extents()
5126 int ret = 0, depth; in ext4_ext_shift_extents() local
5132 path = ext4_find_extent(inode, EXT_MAX_BLOCKS - 1, NULL, in ext4_ext_shift_extents()
5137 depth = path->p_depth; in ext4_ext_shift_extents()
5138 extent = path[depth].p_ext; in ext4_ext_shift_extents()
5142 stop = le32_to_cpu(extent->ee_block); in ext4_ext_shift_extents()
5150 path = ext4_find_extent(inode, start - 1, &path, in ext4_ext_shift_extents()
5154 depth = path->p_depth; in ext4_ext_shift_extents()
5155 extent = path[depth].p_ext; in ext4_ext_shift_extents()
5157 ex_start = le32_to_cpu(extent->ee_block); in ext4_ext_shift_extents()
5158 ex_end = le32_to_cpu(extent->ee_block) + in ext4_ext_shift_extents()
5166 (shift > start - ex_end)) { in ext4_ext_shift_extents()
5167 ret = -EINVAL; in ext4_ext_shift_extents()
5171 if (shift > EXT_MAX_BLOCKS - in ext4_ext_shift_extents()
5173 ret = -EINVAL; in ext4_ext_shift_extents()
5202 depth = path->p_depth; in ext4_ext_shift_extents()
5203 extent = path[depth].p_ext; in ext4_ext_shift_extents()
5207 return -EFSCORRUPTED; in ext4_ext_shift_extents()
5210 le32_to_cpu(extent->ee_block)) { in ext4_ext_shift_extents()
5212 if (extent < EXT_LAST_EXTENT(path[depth].p_hdr)) { in ext4_ext_shift_extents()
5213 path[depth].p_ext++; in ext4_ext_shift_extents()
5222 extent = EXT_LAST_EXTENT(path[depth].p_hdr); in ext4_ext_shift_extents()
5223 *iterator = le32_to_cpu(extent->ee_block) + in ext4_ext_shift_extents()
5226 extent = EXT_FIRST_EXTENT(path[depth].p_hdr); in ext4_ext_shift_extents()
5227 if (le32_to_cpu(extent->ee_block) > 0) in ext4_ext_shift_extents()
5228 *iterator = le32_to_cpu(extent->ee_block) - 1; in ext4_ext_shift_extents()
5233 while (le32_to_cpu(extent->ee_block) < start) in ext4_ext_shift_extents()
5235 path[depth].p_ext = extent; in ext4_ext_shift_extents()
5240 if (ret == -EAGAIN) in ext4_ext_shift_extents()
5254 * Returns: 0 and non-zero on error.
5258 struct super_block *sb = inode->i_sb; in ext4_collapse_range()
5271 return -EOPNOTSUPP; in ext4_collapse_range()
5275 return -EINVAL; in ext4_collapse_range()
5284 ret = ext4_force_commit(inode->i_sb); in ext4_collapse_range()
5294 if (offset + len >= inode->i_size) { in ext4_collapse_range()
5295 ret = -EINVAL; in ext4_collapse_range()
5301 ret = -EOPNOTSUPP; in ext4_collapse_range()
5312 down_write(&EXT4_I(inode)->i_mmap_sem); in ext4_collapse_range()
5327 ret = filemap_write_and_wait_range(inode->i_mapping, ioffset, offset); in ext4_collapse_range()
5335 ret = filemap_write_and_wait_range(inode->i_mapping, offset + len, in ext4_collapse_range()
5349 down_write(&EXT4_I(inode)->i_data_sem); in ext4_collapse_range()
5353 EXT_MAX_BLOCKS - punch_start); in ext4_collapse_range()
5355 up_write(&EXT4_I(inode)->i_data_sem); in ext4_collapse_range()
5359 ret = ext4_ext_remove_space(inode, punch_start, punch_stop - 1); in ext4_collapse_range()
5361 up_write(&EXT4_I(inode)->i_data_sem); in ext4_collapse_range()
5367 punch_stop - punch_start, SHIFT_LEFT); in ext4_collapse_range()
5369 up_write(&EXT4_I(inode)->i_data_sem); in ext4_collapse_range()
5373 new_size = inode->i_size - len; in ext4_collapse_range()
5375 EXT4_I(inode)->i_disksize = new_size; in ext4_collapse_range()
5377 up_write(&EXT4_I(inode)->i_data_sem); in ext4_collapse_range()
5380 inode->i_mtime = inode->i_ctime = current_time(inode); in ext4_collapse_range()
5388 up_write(&EXT4_I(inode)->i_mmap_sem); in ext4_collapse_range()
5404 struct super_block *sb = inode->i_sb; in ext4_insert_range()
5410 int ret = 0, depth, split_flag = 0; in ext4_insert_range() local
5419 return -EOPNOTSUPP; in ext4_insert_range()
5423 return -EINVAL; in ext4_insert_range()
5432 ret = ext4_force_commit(inode->i_sb); in ext4_insert_range()
5440 ret = -EOPNOTSUPP; in ext4_insert_range()
5445 if (len > inode->i_sb->s_maxbytes - inode->i_size) { in ext4_insert_range()
5446 ret = -EFBIG; in ext4_insert_range()
5451 if (offset >= inode->i_size) { in ext4_insert_range()
5452 ret = -EINVAL; in ext4_insert_range()
5463 down_write(&EXT4_I(inode)->i_mmap_sem); in ext4_insert_range()
5475 ret = filemap_write_and_wait_range(inode->i_mapping, ioffset, in ext4_insert_range()
5490 inode->i_size += len; in ext4_insert_range()
5491 EXT4_I(inode)->i_disksize += len; in ext4_insert_range()
5492 inode->i_mtime = inode->i_ctime = current_time(inode); in ext4_insert_range()
5497 down_write(&EXT4_I(inode)->i_data_sem); in ext4_insert_range()
5502 up_write(&EXT4_I(inode)->i_data_sem); in ext4_insert_range()
5506 depth = ext_depth(inode); in ext4_insert_range()
5507 extent = path[depth].p_ext; in ext4_insert_range()
5509 ee_start_lblk = le32_to_cpu(extent->ee_block); in ext4_insert_range()
5531 up_write(&EXT4_I(inode)->i_data_sem); in ext4_insert_range()
5540 EXT_MAX_BLOCKS - offset_lblk); in ext4_insert_range()
5542 up_write(&EXT4_I(inode)->i_data_sem); in ext4_insert_range()
5554 up_write(&EXT4_I(inode)->i_data_sem); in ext4_insert_range()
5564 up_write(&EXT4_I(inode)->i_mmap_sem); in ext4_insert_range()
5571 * ext4_swap_extents() - Swap extents between two inodes
5582 * stuff such as page-cache locking consistency, bh mapping consistency or
5599 BUG_ON(!rwsem_is_locked(&EXT4_I(inode1)->i_data_sem)); in ext4_swap_extents()
5600 BUG_ON(!rwsem_is_locked(&EXT4_I(inode2)->i_data_sem)); in ext4_swap_extents()
5631 ex1 = path1[path1->p_depth].p_ext; in ext4_swap_extents()
5632 ex2 = path2[path2->p_depth].p_ext; in ext4_swap_extents()
5637 e1_blk = le32_to_cpu(ex1->ee_block); in ext4_swap_extents()
5638 e2_blk = le32_to_cpu(ex2->ee_block); in ext4_swap_extents()
5659 len = next1 - lblk1; in ext4_swap_extents()
5660 if (len < next2 - lblk2) in ext4_swap_extents()
5661 len = next2 - lblk2; in ext4_swap_extents()
5666 count -= len; in ext4_swap_extents()
5692 if (len > e1_blk + e1_len - lblk1) in ext4_swap_extents()
5693 len = e1_blk + e1_len - lblk1; in ext4_swap_extents()
5694 if (len > e2_blk + e2_len - lblk2) in ext4_swap_extents()
5695 len = e2_blk + e2_len - lblk2; in ext4_swap_extents()
5717 *erp = ext4_ext_get_access(handle, inode1, path1 + path1->p_depth); in ext4_swap_extents()
5720 *erp = ext4_ext_get_access(handle, inode2, path2 + path2->p_depth); in ext4_swap_extents()
5728 ex1->ee_len = cpu_to_le16(e2_len); in ext4_swap_extents()
5729 ex2->ee_len = cpu_to_le16(e1_len); in ext4_swap_extents()
5738 path2->p_depth); in ext4_swap_extents()
5742 path1->p_depth); in ext4_swap_extents()
5754 count -= len; in ext4_swap_extents()
5767 * ext4_clu_mapped - determine whether any block in a logical cluster has
5770 * @inode - file containing the logical cluster
5771 * @lclu - logical cluster of interest
5780 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_clu_mapped()
5782 int depth, mapped = 0, err = 0; in ext4_clu_mapped() local
5794 depth = ext_depth(inode); in ext4_clu_mapped()
5801 if (unlikely(path[depth].p_ext == NULL && depth != 0)) { in ext4_clu_mapped()
5803 "bad extent address - lblock: %lu, depth: %d, pblock: %lld", in ext4_clu_mapped()
5805 depth, path[depth].p_block); in ext4_clu_mapped()
5806 err = -EFSCORRUPTED; in ext4_clu_mapped()
5810 extent = path[depth].p_ext; in ext4_clu_mapped()
5816 first_lblk = le32_to_cpu(extent->ee_block); in ext4_clu_mapped()
5820 * Three possible outcomes at this point - found extent spanning in ext4_clu_mapped()
5827 ext4_ext_get_actual_len(extent) - 1); in ext4_clu_mapped()
5862 ex = path[path->p_depth].p_ext; in ext4_ext_replay_update_ex()
5864 ret = -EFSCORRUPTED; in ext4_ext_replay_update_ex()
5868 if (le32_to_cpu(ex->ee_block) != start || in ext4_ext_replay_update_ex()
5872 down_write(&EXT4_I(inode)->i_data_sem); in ext4_ext_replay_update_ex()
5874 up_write(&EXT4_I(inode)->i_data_sem); in ext4_ext_replay_update_ex()
5880 return -1; in ext4_ext_replay_update_ex()
5882 ex = path[path->p_depth].p_ext; in ext4_ext_replay_update_ex()
5883 WARN_ON(le32_to_cpu(ex->ee_block) != start); in ext4_ext_replay_update_ex()
5885 down_write(&EXT4_I(inode)->i_data_sem); in ext4_ext_replay_update_ex()
5888 up_write(&EXT4_I(inode)->i_data_sem); in ext4_ext_replay_update_ex()
5894 return -EINVAL; in ext4_ext_replay_update_ex()
5895 ex = path[path->p_depth].p_ext; in ext4_ext_replay_update_ex()
5903 down_write(&EXT4_I(inode)->i_data_sem); in ext4_ext_replay_update_ex()
5904 ret = ext4_ext_dirty(NULL, inode, &path[path->p_depth]); in ext4_ext_replay_update_ex()
5905 up_write(&EXT4_I(inode)->i_data_sem); in ext4_ext_replay_update_ex()
5924 ex = path[path->p_depth].p_ext; in ext4_ext_replay_shrink_inode()
5932 cur = le32_to_cpu(ex->ee_block) + ext4_ext_get_actual_len(ex); in ext4_ext_replay_shrink_inode()
5936 down_write(&EXT4_I(inode)->i_data_sem); in ext4_ext_replay_shrink_inode()
5937 ext4_ext_dirty(NULL, inode, &path[path->p_depth]); in ext4_ext_replay_shrink_inode()
5938 up_write(&EXT4_I(inode)->i_data_sem); in ext4_ext_replay_shrink_inode()
5952 map.m_len = ((inode->i_size) >> inode->i_sb->s_blocksize_bits) - *cur; in skip_hole()
5974 path = ext4_find_extent(inode, EXT_MAX_BLOCKS - 1, NULL, in ext4_ext_replay_set_iblocks()
5978 ex = path[path->p_depth].p_ext; in ext4_ext_replay_set_iblocks()
5984 end = le32_to_cpu(ex->ee_block) + ext4_ext_get_actual_len(ex); in ext4_ext_replay_set_iblocks()
5992 map.m_len = end - cur; in ext4_ext_replay_set_iblocks()
6015 numblks += path->p_depth; in ext4_ext_replay_set_iblocks()
6022 ex = path[path->p_depth].p_ext; in ext4_ext_replay_set_iblocks()
6028 cur = max(cur + 1, le32_to_cpu(ex->ee_block) + in ext4_ext_replay_set_iblocks()
6042 ex = path2[path2->p_depth].p_ext; in ext4_ext_replay_set_iblocks()
6043 for (i = 0; i <= max(path->p_depth, path2->p_depth); i++) { in ext4_ext_replay_set_iblocks()
6045 if (i <= path->p_depth) in ext4_ext_replay_set_iblocks()
6047 path[i].p_bh->b_blocknr : 0; in ext4_ext_replay_set_iblocks()
6048 if (i <= path2->p_depth) in ext4_ext_replay_set_iblocks()
6050 path2[i].p_bh->b_blocknr : 0; in ext4_ext_replay_set_iblocks()
6061 inode->i_blocks = numblks << (inode->i_sb->s_blocksize_bits - 9); in ext4_ext_replay_set_iblocks()
6075 path = ext4_find_extent(inode, EXT_MAX_BLOCKS - 1, NULL, in ext4_ext_clear_bb()
6079 ex = path[path->p_depth].p_ext; in ext4_ext_clear_bb()
6085 end = le32_to_cpu(ex->ee_block) + ext4_ext_get_actual_len(ex); in ext4_ext_clear_bb()
6092 map.m_len = end - cur; in ext4_ext_clear_bb()
6099 for (j = 0; j < path->p_depth; j++) { in ext4_ext_clear_bb()
6101 ext4_mb_mark_bb(inode->i_sb, in ext4_ext_clear_bb()
6107 ext4_mb_mark_bb(inode->i_sb, map.m_pblk, map.m_len, 0); in ext4_ext_clear_bb()