Lines Matching refs:inode
73 static int ext4_block_to_path(struct inode *inode, in ext4_block_to_path() argument
77 int ptrs = EXT4_ADDR_PER_BLOCK(inode->i_sb); in ext4_block_to_path()
78 int ptrs_bits = EXT4_ADDR_PER_BLOCK_BITS(inode->i_sb); in ext4_block_to_path()
104 ext4_warning(inode->i_sb, "block %lu > max in inode %lu", in ext4_block_to_path()
106 indirect_blocks + double_blocks, inode->i_ino); in ext4_block_to_path()
143 static Indirect *ext4_get_branch(struct inode *inode, int depth, in ext4_get_branch() argument
147 struct super_block *sb = inode->i_sb; in ext4_get_branch()
154 add_chain(chain, NULL, EXT4_I(inode)->i_data + *offsets); in ext4_get_branch()
170 if (ext4_check_indirect_blockref(inode, bh)) { in ext4_get_branch()
209 static ext4_fsblk_t ext4_find_near(struct inode *inode, Indirect *ind) in ext4_find_near() argument
211 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_find_near()
229 return ext4_inode_to_goal_block(inode); in ext4_find_near()
243 static ext4_fsblk_t ext4_find_goal(struct inode *inode, ext4_lblk_t block, in ext4_find_goal() argument
252 goal = ext4_find_near(inode, partial); in ext4_find_goal()
337 ar->inode, ar->goal, in ext4_alloc_branch()
348 bh = branch[i].bh = sb_getblk(ar->inode->i_sb, new_blocks[i-1]); in ext4_alloc_branch()
375 err = ext4_handle_dirty_metadata(handle, ar->inode, bh); in ext4_alloc_branch()
389 ext4_forget(handle, 1, ar->inode, branch[i].bh, in ext4_alloc_branch()
391 ext4_free_blocks(handle, ar->inode, NULL, new_blocks[i], in ext4_alloc_branch()
458 err = ext4_handle_dirty_metadata(handle, ar->inode, where->bh); in ext4_splice_branch()
465 ext4_mark_inode_dirty(handle, ar->inode); in ext4_splice_branch()
477 ext4_free_blocks(handle, ar->inode, where[i].bh, 0, 1, in ext4_splice_branch()
480 ext4_free_blocks(handle, ar->inode, NULL, le32_to_cpu(where[num].key), in ext4_splice_branch()
514 int ext4_ind_map_blocks(handle_t *handle, struct inode *inode, in ext4_ind_map_blocks() argument
529 trace_ext4_ind_map_blocks_enter(inode, map->m_lblk, map->m_len, flags); in ext4_ind_map_blocks()
530 J_ASSERT(!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))); in ext4_ind_map_blocks()
532 depth = ext4_block_to_path(inode, map->m_lblk, offsets, in ext4_ind_map_blocks()
538 partial = ext4_get_branch(inode, depth, offsets, chain, &err); in ext4_ind_map_blocks()
565 if (ext4_has_feature_bigalloc(inode->i_sb)) { in ext4_ind_map_blocks()
566 EXT4_ERROR_INODE(inode, "Can't allocate blocks for " in ext4_ind_map_blocks()
573 ar.inode = inode; in ext4_ind_map_blocks()
575 if (S_ISREG(inode->i_mode)) in ext4_ind_map_blocks()
582 ar.goal = ext4_find_goal(inode, map->m_lblk, partial); in ext4_ind_map_blocks()
614 ext4_update_inode_fsync_trans(handle, inode, 1); in ext4_ind_map_blocks()
632 trace_ext4_ind_map_blocks_exit(inode, flags, map, err); in ext4_ind_map_blocks()
651 struct inode *inode = file->f_mapping->host; in ext4_ind_direct_IO() local
652 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_ind_direct_IO()
662 if (final_size > inode->i_size) { in ext4_ind_direct_IO()
664 handle = ext4_journal_start(inode, EXT4_HT_INODE, 2); in ext4_ind_direct_IO()
669 ret = ext4_orphan_add(handle, inode); in ext4_ind_direct_IO()
675 ei->i_disksize = inode->i_size; in ext4_ind_direct_IO()
681 if (iov_iter_rw(iter) == READ && ext4_should_dioread_nolock(inode)) { in ext4_ind_direct_IO()
687 inode_dio_begin(inode); in ext4_ind_direct_IO()
689 if (unlikely(ext4_test_inode_state(inode, in ext4_ind_direct_IO()
691 inode_dio_end(inode); in ext4_ind_direct_IO()
694 if (IS_DAX(inode)) in ext4_ind_direct_IO()
695 ret = dax_do_io(iocb, inode, iter, offset, in ext4_ind_direct_IO()
698 ret = __blockdev_direct_IO(iocb, inode, in ext4_ind_direct_IO()
699 inode->i_sb->s_bdev, iter, in ext4_ind_direct_IO()
702 inode_dio_end(inode); in ext4_ind_direct_IO()
705 if (IS_DAX(inode)) in ext4_ind_direct_IO()
706 ret = dax_do_io(iocb, inode, iter, offset, in ext4_ind_direct_IO()
709 ret = blockdev_direct_IO(iocb, inode, iter, offset, in ext4_ind_direct_IO()
713 loff_t isize = i_size_read(inode); in ext4_ind_direct_IO()
717 ext4_truncate_failed_write(inode); in ext4_ind_direct_IO()
720 if (ret == -ENOSPC && ext4_should_retry_alloc(inode->i_sb, &retries)) in ext4_ind_direct_IO()
727 handle = ext4_journal_start(inode, EXT4_HT_INODE, 2); in ext4_ind_direct_IO()
733 if (inode->i_nlink) in ext4_ind_direct_IO()
734 ext4_orphan_del(NULL, inode); in ext4_ind_direct_IO()
738 if (inode->i_nlink) in ext4_ind_direct_IO()
739 ext4_orphan_del(handle, inode); in ext4_ind_direct_IO()
742 if (end > inode->i_size) { in ext4_ind_direct_IO()
744 i_size_write(inode, end); in ext4_ind_direct_IO()
752 ext4_mark_inode_dirty(handle, inode); in ext4_ind_direct_IO()
767 int ext4_ind_calc_metadata_amount(struct inode *inode, sector_t lblock) in ext4_ind_calc_metadata_amount() argument
769 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_ind_calc_metadata_amount()
770 sector_t dind_mask = ~((sector_t)EXT4_ADDR_PER_BLOCK(inode->i_sb) - 1); in ext4_ind_calc_metadata_amount()
786 return (blk_bits / EXT4_ADDR_PER_BLOCK_BITS(inode->i_sb)) + 1; in ext4_ind_calc_metadata_amount()
793 int ext4_ind_trans_blocks(struct inode *inode, int nrblocks) in ext4_ind_trans_blocks() argument
800 return DIV_ROUND_UP(nrblocks, EXT4_ADDR_PER_BLOCK(inode->i_sb)) + 4; in ext4_ind_trans_blocks()
815 static int try_to_extend_transaction(handle_t *handle, struct inode *inode) in try_to_extend_transaction() argument
821 if (!ext4_journal_extend(handle, ext4_blocks_for_truncate(inode))) in try_to_extend_transaction()
874 static Indirect *ext4_find_shared(struct inode *inode, int depth, in ext4_find_shared() argument
885 partial = ext4_get_branch(inode, k, offsets, chain, &err); in ext4_find_shared()
934 static int ext4_clear_blocks(handle_t *handle, struct inode *inode, in ext4_clear_blocks() argument
944 if (S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode)) in ext4_clear_blocks()
946 else if (ext4_should_journal_data(inode)) in ext4_clear_blocks()
949 if (!ext4_data_block_valid(EXT4_SB(inode->i_sb), block_to_free, in ext4_clear_blocks()
951 EXT4_ERROR_INODE(inode, "attempt to clear invalid " in ext4_clear_blocks()
957 if (try_to_extend_transaction(handle, inode)) { in ext4_clear_blocks()
960 err = ext4_handle_dirty_metadata(handle, inode, bh); in ext4_clear_blocks()
964 err = ext4_mark_inode_dirty(handle, inode); in ext4_clear_blocks()
967 err = ext4_truncate_restart_trans(handle, inode, in ext4_clear_blocks()
968 ext4_blocks_for_truncate(inode)); in ext4_clear_blocks()
982 ext4_free_blocks(handle, inode, NULL, block_to_free, count, flags); in ext4_clear_blocks()
985 ext4_std_error(inode->i_sb, err); in ext4_clear_blocks()
1008 static void ext4_free_data(handle_t *handle, struct inode *inode, in ext4_free_data() argument
1042 err = ext4_clear_blocks(handle, inode, this_bh, in ext4_free_data()
1055 err = ext4_clear_blocks(handle, inode, this_bh, block_to_free, in ext4_free_data()
1070 if ((EXT4_JOURNAL(inode) == NULL) || bh2jh(this_bh)) in ext4_free_data()
1071 ext4_handle_dirty_metadata(handle, inode, this_bh); in ext4_free_data()
1073 EXT4_ERROR_INODE(inode, in ext4_free_data()
1093 static void ext4_free_branches(handle_t *handle, struct inode *inode, in ext4_free_branches() argument
1105 int addr_per_block = EXT4_ADDR_PER_BLOCK(inode->i_sb); in ext4_free_branches()
1112 if (!ext4_data_block_valid(EXT4_SB(inode->i_sb), in ext4_free_branches()
1114 EXT4_ERROR_INODE(inode, in ext4_free_branches()
1122 bh = sb_bread(inode->i_sb, nr); in ext4_free_branches()
1129 EXT4_ERROR_INODE_BLOCK(inode, nr, in ext4_free_branches()
1136 ext4_free_branches(handle, inode, bh, in ext4_free_branches()
1160 if (try_to_extend_transaction(handle, inode)) { in ext4_free_branches()
1161 ext4_mark_inode_dirty(handle, inode); in ext4_free_branches()
1162 ext4_truncate_restart_trans(handle, inode, in ext4_free_branches()
1163 ext4_blocks_for_truncate(inode)); in ext4_free_branches()
1177 ext4_free_blocks(handle, inode, NULL, nr, 1, in ext4_free_branches()
1193 inode, in ext4_free_branches()
1201 ext4_free_data(handle, inode, parent_bh, first, last); in ext4_free_branches()
1205 void ext4_ind_truncate(handle_t *handle, struct inode *inode) in ext4_ind_truncate() argument
1207 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_ind_truncate()
1209 int addr_per_block = EXT4_ADDR_PER_BLOCK(inode->i_sb); in ext4_ind_truncate()
1216 unsigned blocksize = inode->i_sb->s_blocksize; in ext4_ind_truncate()
1218 last_block = (inode->i_size + blocksize-1) in ext4_ind_truncate()
1219 >> EXT4_BLOCK_SIZE_BITS(inode->i_sb); in ext4_ind_truncate()
1220 max_block = (EXT4_SB(inode->i_sb)->s_bitmap_maxbytes + blocksize-1) in ext4_ind_truncate()
1221 >> EXT4_BLOCK_SIZE_BITS(inode->i_sb); in ext4_ind_truncate()
1224 n = ext4_block_to_path(inode, last_block, offsets, NULL); in ext4_ind_truncate()
1229 ext4_es_remove_extent(inode, last_block, EXT_MAX_BLOCKS - last_block); in ext4_ind_truncate()
1238 ei->i_disksize = inode->i_size; in ext4_ind_truncate()
1247 ext4_free_data(handle, inode, NULL, i_data+offsets[0], in ext4_ind_truncate()
1252 partial = ext4_find_shared(inode, n, offsets, chain, &nr); in ext4_ind_truncate()
1257 ext4_free_branches(handle, inode, NULL, in ext4_ind_truncate()
1267 ext4_free_branches(handle, inode, partial->bh, in ext4_ind_truncate()
1274 ext4_free_branches(handle, inode, partial->bh, partial->p + 1, in ext4_ind_truncate()
1287 ext4_free_branches(handle, inode, NULL, &nr, &nr+1, 1); in ext4_ind_truncate()
1293 ext4_free_branches(handle, inode, NULL, &nr, &nr+1, 2); in ext4_ind_truncate()
1299 ext4_free_branches(handle, inode, NULL, &nr, &nr+1, 3); in ext4_ind_truncate()
1317 int ext4_ind_remove_space(handle_t *handle, struct inode *inode, in ext4_ind_remove_space() argument
1320 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_ind_remove_space()
1322 int addr_per_block = EXT4_ADDR_PER_BLOCK(inode->i_sb); in ext4_ind_remove_space()
1329 unsigned blocksize = inode->i_sb->s_blocksize; in ext4_ind_remove_space()
1331 max_block = (EXT4_SB(inode->i_sb)->s_bitmap_maxbytes + blocksize-1) in ext4_ind_remove_space()
1332 >> EXT4_BLOCK_SIZE_BITS(inode->i_sb); in ext4_ind_remove_space()
1338 n = ext4_block_to_path(inode, start, offsets, NULL); in ext4_ind_remove_space()
1339 n2 = ext4_block_to_path(inode, end, offsets2, NULL); in ext4_ind_remove_space()
1345 ext4_free_data(handle, inode, NULL, i_data + offsets[0], in ext4_ind_remove_space()
1361 ext4_free_data(handle, inode, NULL, i_data + offsets[0], in ext4_ind_remove_space()
1367 partial = ext4_find_shared(inode, n, offsets, chain, &nr); in ext4_ind_remove_space()
1371 ext4_free_branches(handle, inode, NULL, in ext4_ind_remove_space()
1377 ext4_free_branches(handle, inode, partial->bh, in ext4_ind_remove_space()
1388 ext4_free_branches(handle, inode, partial->bh, in ext4_ind_remove_space()
1398 partial2 = ext4_find_shared(inode, n2, offsets2, chain2, &nr2); in ext4_ind_remove_space()
1424 ext4_free_branches(handle, inode, partial2->bh, in ext4_ind_remove_space()
1436 partial = ext4_find_shared(inode, n, offsets, chain, &nr); in ext4_ind_remove_space()
1437 partial2 = ext4_find_shared(inode, n2, offsets2, chain2, &nr2); in ext4_ind_remove_space()
1455 ext4_free_branches(handle, inode, NULL, in ext4_ind_remove_space()
1462 ext4_free_branches(handle, inode, partial->bh, in ext4_ind_remove_space()
1490 ext4_free_branches(handle, inode, partial->bh, in ext4_ind_remove_space()
1509 ext4_free_branches(handle, inode, partial->bh, in ext4_ind_remove_space()
1518 ext4_free_branches(handle, inode, partial2->bh, in ext4_ind_remove_space()
1537 ext4_free_branches(handle, inode, NULL, &nr, &nr+1, 1); in ext4_ind_remove_space()
1545 ext4_free_branches(handle, inode, NULL, &nr, &nr+1, 2); in ext4_ind_remove_space()
1553 ext4_free_branches(handle, inode, NULL, &nr, &nr+1, 3); in ext4_ind_remove_space()