Lines Matching refs:inode

51 static __u32 ext4_inode_csum(struct inode *inode, struct ext4_inode *raw,  in ext4_inode_csum()  argument
54 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_inode_csum()
66 if (EXT4_INODE_SIZE(inode->i_sb) > EXT4_GOOD_OLD_INODE_SIZE) { in ext4_inode_csum()
77 EXT4_INODE_SIZE(inode->i_sb) - offset); in ext4_inode_csum()
83 static int ext4_inode_csum_verify(struct inode *inode, struct ext4_inode *raw, in ext4_inode_csum_verify() argument
88 if (EXT4_SB(inode->i_sb)->s_es->s_creator_os != in ext4_inode_csum_verify()
90 !ext4_has_metadata_csum(inode->i_sb)) in ext4_inode_csum_verify()
94 calculated = ext4_inode_csum(inode, raw, ei); in ext4_inode_csum_verify()
95 if (EXT4_INODE_SIZE(inode->i_sb) > EXT4_GOOD_OLD_INODE_SIZE && in ext4_inode_csum_verify()
104 void ext4_inode_csum_set(struct inode *inode, struct ext4_inode *raw, in ext4_inode_csum_set() argument
109 if (EXT4_SB(inode->i_sb)->s_es->s_creator_os != in ext4_inode_csum_set()
111 !ext4_has_metadata_csum(inode->i_sb)) in ext4_inode_csum_set()
114 csum = ext4_inode_csum(inode, raw, ei); in ext4_inode_csum_set()
116 if (EXT4_INODE_SIZE(inode->i_sb) > EXT4_GOOD_OLD_INODE_SIZE && in ext4_inode_csum_set()
121 static inline int ext4_begin_ordered_truncate(struct inode *inode, in ext4_begin_ordered_truncate() argument
124 trace_ext4_begin_ordered_truncate(inode, new_size); in ext4_begin_ordered_truncate()
131 if (!EXT4_I(inode)->jinode) in ext4_begin_ordered_truncate()
133 return jbd2_journal_begin_ordered_truncate(EXT4_JOURNAL(inode), in ext4_begin_ordered_truncate()
134 EXT4_I(inode)->jinode, in ext4_begin_ordered_truncate()
142 static int ext4_meta_trans_blocks(struct inode *inode, int lblocks,
149 int ext4_inode_is_fast_symlink(struct inode *inode) in ext4_inode_is_fast_symlink() argument
151 if (!(EXT4_I(inode)->i_flags & EXT4_EA_INODE_FL)) { in ext4_inode_is_fast_symlink()
152 int ea_blocks = EXT4_I(inode)->i_file_acl ? in ext4_inode_is_fast_symlink()
153 EXT4_CLUSTER_SIZE(inode->i_sb) >> 9 : 0; in ext4_inode_is_fast_symlink()
155 if (ext4_has_inline_data(inode)) in ext4_inode_is_fast_symlink()
158 return (S_ISLNK(inode->i_mode) && inode->i_blocks - ea_blocks == 0); in ext4_inode_is_fast_symlink()
160 return S_ISLNK(inode->i_mode) && inode->i_size && in ext4_inode_is_fast_symlink()
161 (inode->i_size < EXT4_N_BLOCKS * 4); in ext4_inode_is_fast_symlink()
167 void ext4_evict_inode(struct inode *inode) in ext4_evict_inode() argument
179 trace_ext4_evict_inode(inode); in ext4_evict_inode()
181 if (inode->i_nlink) { in ext4_evict_inode()
200 if (inode->i_ino != EXT4_JOURNAL_INO && in ext4_evict_inode()
201 ext4_should_journal_data(inode) && in ext4_evict_inode()
202 (S_ISLNK(inode->i_mode) || S_ISREG(inode->i_mode)) && in ext4_evict_inode()
203 inode->i_data.nrpages) { in ext4_evict_inode()
204 journal_t *journal = EXT4_SB(inode->i_sb)->s_journal; in ext4_evict_inode()
205 tid_t commit_tid = EXT4_I(inode)->i_datasync_tid; in ext4_evict_inode()
208 filemap_write_and_wait(&inode->i_data); in ext4_evict_inode()
210 truncate_inode_pages_final(&inode->i_data); in ext4_evict_inode()
215 if (is_bad_inode(inode)) in ext4_evict_inode()
217 dquot_initialize(inode); in ext4_evict_inode()
219 if (ext4_should_order_data(inode)) in ext4_evict_inode()
220 ext4_begin_ordered_truncate(inode, 0); in ext4_evict_inode()
221 truncate_inode_pages_final(&inode->i_data); in ext4_evict_inode()
228 if (!list_empty_careful(&inode->i_io_list)) { in ext4_evict_inode()
229 WARN_ON_ONCE(!ext4_should_journal_data(inode)); in ext4_evict_inode()
230 inode_io_list_del(inode); in ext4_evict_inode()
237 sb_start_intwrite(inode->i_sb); in ext4_evict_inode()
239 if (!IS_NOQUOTA(inode)) in ext4_evict_inode()
240 extra_credits += EXT4_MAXQUOTAS_DEL_BLOCKS(inode->i_sb); in ext4_evict_inode()
246 handle = ext4_journal_start(inode, EXT4_HT_TRUNCATE, in ext4_evict_inode()
247 ext4_blocks_for_truncate(inode) + extra_credits - 3); in ext4_evict_inode()
249 ext4_std_error(inode->i_sb, PTR_ERR(handle)); in ext4_evict_inode()
255 ext4_orphan_del(NULL, inode); in ext4_evict_inode()
256 sb_end_intwrite(inode->i_sb); in ext4_evict_inode()
260 if (IS_SYNC(inode)) in ext4_evict_inode()
270 if (ext4_inode_is_fast_symlink(inode)) in ext4_evict_inode()
271 memset(EXT4_I(inode)->i_data, 0, sizeof(EXT4_I(inode)->i_data)); in ext4_evict_inode()
272 inode->i_size = 0; in ext4_evict_inode()
273 err = ext4_mark_inode_dirty(handle, inode); in ext4_evict_inode()
275 ext4_warning(inode->i_sb, in ext4_evict_inode()
279 if (inode->i_blocks) { in ext4_evict_inode()
280 err = ext4_truncate(inode); in ext4_evict_inode()
282 ext4_error_err(inode->i_sb, -err, in ext4_evict_inode()
284 inode->i_ino, err); in ext4_evict_inode()
290 err = ext4_xattr_delete_inode(handle, inode, &ea_inode_array, in ext4_evict_inode()
293 ext4_warning(inode->i_sb, "xattr delete (err %d)", err); in ext4_evict_inode()
296 ext4_orphan_del(NULL, inode); in ext4_evict_inode()
297 sb_end_intwrite(inode->i_sb); in ext4_evict_inode()
310 ext4_orphan_del(handle, inode); in ext4_evict_inode()
311 EXT4_I(inode)->i_dtime = (__u32)ktime_get_real_seconds(); in ext4_evict_inode()
320 if (ext4_mark_inode_dirty(handle, inode)) in ext4_evict_inode()
322 ext4_clear_inode(inode); in ext4_evict_inode()
324 ext4_free_inode(handle, inode); in ext4_evict_inode()
326 sb_end_intwrite(inode->i_sb); in ext4_evict_inode()
330 if (!list_empty(&EXT4_I(inode)->i_fc_list)) in ext4_evict_inode()
331 ext4_fc_mark_ineligible(inode->i_sb, EXT4_FC_REASON_NOMEM); in ext4_evict_inode()
332 ext4_clear_inode(inode); /* We must guarantee clearing of inode... */ in ext4_evict_inode()
336 qsize_t *ext4_get_reserved_space(struct inode *inode) in ext4_get_reserved_space() argument
338 return &EXT4_I(inode)->i_reserved_quota; in ext4_get_reserved_space()
346 void ext4_da_update_reserve_space(struct inode *inode, in ext4_da_update_reserve_space() argument
349 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_da_update_reserve_space()
350 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_da_update_reserve_space()
353 trace_ext4_da_update_reserve_space(inode, used, quota_claim); in ext4_da_update_reserve_space()
355 ext4_warning(inode->i_sb, "%s: ino %lu, used %d " in ext4_da_update_reserve_space()
357 __func__, inode->i_ino, used, in ext4_da_update_reserve_space()
367 spin_unlock(&EXT4_I(inode)->i_block_reservation_lock); in ext4_da_update_reserve_space()
371 dquot_claim_block(inode, EXT4_C2B(sbi, used)); in ext4_da_update_reserve_space()
378 dquot_release_reservation_block(inode, EXT4_C2B(sbi, used)); in ext4_da_update_reserve_space()
387 !inode_is_open_for_write(inode)) in ext4_da_update_reserve_space()
388 ext4_discard_preallocations(inode, 0); in ext4_da_update_reserve_space()
391 static int __check_block_validity(struct inode *inode, const char *func, in __check_block_validity() argument
395 if (ext4_has_feature_journal(inode->i_sb) && in __check_block_validity()
396 (inode->i_ino == in __check_block_validity()
397 le32_to_cpu(EXT4_SB(inode->i_sb)->s_es->s_journal_inum))) in __check_block_validity()
399 if (!ext4_inode_block_valid(inode, map->m_pblk, map->m_len)) { in __check_block_validity()
400 ext4_error_inode(inode, func, line, map->m_pblk, in __check_block_validity()
409 int ext4_issue_zeroout(struct inode *inode, ext4_lblk_t lblk, ext4_fsblk_t pblk, in ext4_issue_zeroout() argument
414 if (IS_ENCRYPTED(inode) && S_ISREG(inode->i_mode)) in ext4_issue_zeroout()
415 return fscrypt_zeroout_range(inode, lblk, pblk, len); in ext4_issue_zeroout()
417 ret = sb_issue_zeroout(inode->i_sb, pblk, len, GFP_NOFS); in ext4_issue_zeroout()
424 #define check_block_validity(inode, map) \ argument
425 __check_block_validity((inode), __func__, __LINE__, (map))
429 struct inode *inode, in ext4_map_blocks_es_recheck() argument
444 down_read(&EXT4_I(inode)->i_data_sem); in ext4_map_blocks_es_recheck()
445 if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) { in ext4_map_blocks_es_recheck()
446 retval = ext4_ext_map_blocks(handle, inode, map, 0); in ext4_map_blocks_es_recheck()
448 retval = ext4_ind_map_blocks(handle, inode, map, 0); in ext4_map_blocks_es_recheck()
450 up_read((&EXT4_I(inode)->i_data_sem)); in ext4_map_blocks_es_recheck()
462 inode->i_ino, es_map->m_lblk, es_map->m_len, in ext4_map_blocks_es_recheck()
492 int ext4_map_blocks(handle_t *handle, struct inode *inode, in ext4_map_blocks() argument
505 ext_debug(inode, "flag 0x%x, max_blocks %u, logical block %lu\n", in ext4_map_blocks()
519 if (!(EXT4_SB(inode->i_sb)->s_mount_state & EXT4_FC_REPLAY) && in ext4_map_blocks()
520 ext4_es_lookup_extent(inode, map->m_lblk, NULL, &es)) { in ext4_map_blocks()
541 ext4_map_blocks_es_recheck(handle, inode, map, in ext4_map_blocks()
551 down_read(&EXT4_I(inode)->i_data_sem); in ext4_map_blocks()
552 if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) { in ext4_map_blocks()
553 retval = ext4_ext_map_blocks(handle, inode, map, 0); in ext4_map_blocks()
555 retval = ext4_ind_map_blocks(handle, inode, map, 0); in ext4_map_blocks()
561 ext4_warning(inode->i_sb, in ext4_map_blocks()
564 inode->i_ino, retval, map->m_len); in ext4_map_blocks()
572 ext4_es_scan_range(inode, &ext4_es_is_delayed, map->m_lblk, in ext4_map_blocks()
575 ret = ext4_es_insert_extent(inode, map->m_lblk, in ext4_map_blocks()
580 up_read((&EXT4_I(inode)->i_data_sem)); in ext4_map_blocks()
584 ret = check_block_validity(inode, map); in ext4_map_blocks()
621 down_write(&EXT4_I(inode)->i_data_sem); in ext4_map_blocks()
627 if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) { in ext4_map_blocks()
628 retval = ext4_ext_map_blocks(handle, inode, map, flags); in ext4_map_blocks()
630 retval = ext4_ind_map_blocks(handle, inode, map, flags); in ext4_map_blocks()
638 ext4_clear_inode_state(inode, EXT4_STATE_EXT_MIGRATE); in ext4_map_blocks()
649 ext4_da_update_reserve_space(inode, retval, 1); in ext4_map_blocks()
656 ext4_warning(inode->i_sb, in ext4_map_blocks()
659 inode->i_ino, retval, map->m_len); in ext4_map_blocks()
673 ret = ext4_issue_zeroout(inode, map->m_lblk, in ext4_map_blocks()
686 ext4_es_lookup_extent(inode, map->m_lblk, NULL, &es)) { in ext4_map_blocks()
694 ext4_es_scan_range(inode, &ext4_es_is_delayed, map->m_lblk, in ext4_map_blocks()
697 ret = ext4_es_insert_extent(inode, map->m_lblk, map->m_len, in ext4_map_blocks()
706 up_write((&EXT4_I(inode)->i_data_sem)); in ext4_map_blocks()
708 ret = check_block_validity(inode, map); in ext4_map_blocks()
720 !ext4_is_quota_file(inode) && in ext4_map_blocks()
721 ext4_should_order_data(inode)) { in ext4_map_blocks()
723 (loff_t)map->m_lblk << inode->i_blkbits; in ext4_map_blocks()
724 loff_t length = (loff_t)map->m_len << inode->i_blkbits; in ext4_map_blocks()
727 ret = ext4_jbd2_inode_add_wait(handle, inode, in ext4_map_blocks()
730 ret = ext4_jbd2_inode_add_write(handle, inode, in ext4_map_blocks()
735 ext4_fc_track_range(handle, inode, map->m_lblk, in ext4_map_blocks()
740 ext_debug(inode, "failed with err %d\n", retval); in ext4_map_blocks()
772 static int _ext4_get_block(struct inode *inode, sector_t iblock, in _ext4_get_block() argument
778 if (ext4_has_inline_data(inode)) in _ext4_get_block()
782 map.m_len = bh->b_size >> inode->i_blkbits; in _ext4_get_block()
784 ret = ext4_map_blocks(ext4_journal_current_handle(), inode, &map, in _ext4_get_block()
787 map_bh(bh, inode->i_sb, map.m_pblk); in _ext4_get_block()
789 bh->b_size = inode->i_sb->s_blocksize * map.m_len; in _ext4_get_block()
793 bh->b_size = inode->i_sb->s_blocksize * map.m_len; in _ext4_get_block()
798 int ext4_get_block(struct inode *inode, sector_t iblock, in ext4_get_block() argument
801 return _ext4_get_block(inode, iblock, bh, in ext4_get_block()
810 int ext4_get_block_unwritten(struct inode *inode, sector_t iblock, in ext4_get_block_unwritten() argument
814 inode->i_ino, create); in ext4_get_block_unwritten()
815 return _ext4_get_block(inode, iblock, bh_result, in ext4_get_block_unwritten()
825 struct buffer_head *ext4_getblk(handle_t *handle, struct inode *inode, in ext4_getblk() argument
833 J_ASSERT((EXT4_SB(inode->i_sb)->s_mount_state & EXT4_FC_REPLAY) in ext4_getblk()
838 err = ext4_map_blocks(handle, inode, &map, map_flags); in ext4_getblk()
845 bh = sb_getblk(inode->i_sb, map.m_pblk); in ext4_getblk()
850 J_ASSERT((EXT4_SB(inode->i_sb)->s_mount_state & EXT4_FC_REPLAY) in ext4_getblk()
868 memset(bh->b_data, 0, inode->i_sb->s_blocksize); in ext4_getblk()
873 err = ext4_handle_dirty_metadata(handle, inode, bh); in ext4_getblk()
884 struct buffer_head *ext4_bread(handle_t *handle, struct inode *inode, in ext4_bread() argument
890 bh = ext4_getblk(handle, inode, block, map_flags); in ext4_bread()
905 int ext4_bread_batch(struct inode *inode, ext4_lblk_t block, int bh_count, in ext4_bread_batch() argument
911 bhs[i] = ext4_getblk(NULL, inode, block + i, 0 /* map_flags */); in ext4_bread_batch()
1033 struct inode *inode = page->mapping->host; in ext4_block_write_begin() local
1037 unsigned blocksize = inode->i_sb->s_blocksize; in ext4_block_write_begin()
1068 err = get_block(inode, block, bh, 1); in ext4_block_write_begin()
1106 } else if (fscrypt_inode_uses_fs_layer_crypto(inode)) { in ext4_block_write_begin()
1127 struct inode *inode = mapping->host; in ext4_write_begin() local
1135 if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb)))) in ext4_write_begin()
1138 trace_ext4_write_begin(inode, pos, len, flags); in ext4_write_begin()
1143 needed_blocks = ext4_writepage_trans_blocks(inode) + 1; in ext4_write_begin()
1148 if (ext4_test_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA)) { in ext4_write_begin()
1149 ret = ext4_try_to_write_inline_data(mapping, inode, pos, len, in ext4_write_begin()
1171 handle = ext4_journal_start(inode, EXT4_HT_WRITE_PAGE, needed_blocks); in ext4_write_begin()
1189 if (ext4_should_dioread_nolock(inode)) in ext4_write_begin()
1196 if (ext4_should_dioread_nolock(inode)) in ext4_write_begin()
1202 if (!ret && ext4_should_journal_data(inode)) { in ext4_write_begin()
1209 bool extended = (pos + len > inode->i_size) && in ext4_write_begin()
1210 !ext4_verity_in_progress(inode); in ext4_write_begin()
1221 if (extended && ext4_can_truncate(inode)) in ext4_write_begin()
1222 ext4_orphan_add(handle, inode); in ext4_write_begin()
1226 ext4_truncate_failed_write(inode); in ext4_write_begin()
1233 if (inode->i_nlink) in ext4_write_begin()
1234 ext4_orphan_del(NULL, inode); in ext4_write_begin()
1238 ext4_should_retry_alloc(inode->i_sb, &retries)) in ext4_write_begin()
1273 struct inode *inode = mapping->host; in ext4_write_end() local
1274 loff_t old_size = inode->i_size; in ext4_write_end()
1277 int inline_data = ext4_has_inline_data(inode); in ext4_write_end()
1278 bool verity = ext4_verity_in_progress(inode); in ext4_write_end()
1280 trace_ext4_write_end(inode, pos, len, copied); in ext4_write_end()
1282 ret = ext4_write_inline_data_end(inode, pos, len, in ext4_write_end()
1301 i_size_changed = ext4_update_inode_size(inode, pos + copied); in ext4_write_end()
1306 pagecache_isize_extended(inode, old_size, pos); in ext4_write_end()
1314 ret = ext4_mark_inode_dirty(handle, inode); in ext4_write_end()
1316 if (pos + len > inode->i_size && !verity && ext4_can_truncate(inode)) in ext4_write_end()
1321 ext4_orphan_add(handle, inode); in ext4_write_end()
1327 if (pos + len > inode->i_size && !verity) { in ext4_write_end()
1328 ext4_truncate_failed_write(inode); in ext4_write_end()
1334 if (inode->i_nlink) in ext4_write_end()
1335 ext4_orphan_del(NULL, inode); in ext4_write_end()
1381 struct inode *inode = mapping->host; in ext4_journalled_write_end() local
1382 loff_t old_size = inode->i_size; in ext4_journalled_write_end()
1387 int inline_data = ext4_has_inline_data(inode); in ext4_journalled_write_end()
1388 bool verity = ext4_verity_in_progress(inode); in ext4_journalled_write_end()
1390 trace_ext4_journalled_write_end(inode, pos, len, copied); in ext4_journalled_write_end()
1397 ret = ext4_write_inline_data_end(inode, pos, len, in ext4_journalled_write_end()
1419 size_changed = ext4_update_inode_size(inode, pos + copied); in ext4_journalled_write_end()
1420 ext4_set_inode_state(inode, EXT4_STATE_JDATA); in ext4_journalled_write_end()
1421 EXT4_I(inode)->i_datasync_tid = handle->h_transaction->t_tid; in ext4_journalled_write_end()
1426 pagecache_isize_extended(inode, old_size, pos); in ext4_journalled_write_end()
1429 ret2 = ext4_mark_inode_dirty(handle, inode); in ext4_journalled_write_end()
1434 if (pos + len > inode->i_size && !verity && ext4_can_truncate(inode)) in ext4_journalled_write_end()
1439 ext4_orphan_add(handle, inode); in ext4_journalled_write_end()
1445 if (pos + len > inode->i_size && !verity) { in ext4_journalled_write_end()
1446 ext4_truncate_failed_write(inode); in ext4_journalled_write_end()
1452 if (inode->i_nlink) in ext4_journalled_write_end()
1453 ext4_orphan_del(NULL, inode); in ext4_journalled_write_end()
1462 static int ext4_da_reserve_space(struct inode *inode) in ext4_da_reserve_space() argument
1464 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_da_reserve_space()
1465 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_da_reserve_space()
1473 ret = dquot_reserve_block(inode, EXT4_C2B(sbi, 1)); in ext4_da_reserve_space()
1480 dquot_release_reservation_block(inode, EXT4_C2B(sbi, 1)); in ext4_da_reserve_space()
1484 trace_ext4_da_reserve_space(inode); in ext4_da_reserve_space()
1490 void ext4_da_release_space(struct inode *inode, int to_free) in ext4_da_release_space() argument
1492 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_da_release_space()
1493 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_da_release_space()
1498 spin_lock(&EXT4_I(inode)->i_block_reservation_lock); in ext4_da_release_space()
1500 trace_ext4_da_release_space(inode, to_free); in ext4_da_release_space()
1508 ext4_warning(inode->i_sb, "ext4_da_release_space: " in ext4_da_release_space()
1510 "data blocks", inode->i_ino, to_free, in ext4_da_release_space()
1520 spin_unlock(&EXT4_I(inode)->i_block_reservation_lock); in ext4_da_release_space()
1522 dquot_release_reservation_block(inode, EXT4_C2B(sbi, to_free)); in ext4_da_release_space()
1530 struct inode *inode; member
1553 struct inode *inode = mpd->inode; in mpage_release_unused_pages() local
1554 struct address_space *mapping = inode->i_mapping; in mpage_release_unused_pages()
1565 start = index << (PAGE_SHIFT - inode->i_blkbits); in mpage_release_unused_pages()
1566 last = end << (PAGE_SHIFT - inode->i_blkbits); in mpage_release_unused_pages()
1567 ext4_es_remove_extent(inode, start, last - start + 1); in mpage_release_unused_pages()
1592 static void ext4_print_free_blocks(struct inode *inode) in ext4_print_free_blocks() argument
1594 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_print_free_blocks()
1595 struct super_block *sb = inode->i_sb; in ext4_print_free_blocks()
1596 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_print_free_blocks()
1599 EXT4_C2B(EXT4_SB(inode->i_sb), in ext4_print_free_blocks()
1630 static int ext4_insert_delayed_block(struct inode *inode, ext4_lblk_t lblk) in ext4_insert_delayed_block() argument
1632 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_insert_delayed_block()
1648 ret = ext4_da_reserve_space(inode); in ext4_insert_delayed_block()
1652 if (!ext4_es_scan_clu(inode, &ext4_es_is_delonly, lblk)) { in ext4_insert_delayed_block()
1653 if (!ext4_es_scan_clu(inode, in ext4_insert_delayed_block()
1655 ret = ext4_clu_mapped(inode, in ext4_insert_delayed_block()
1660 ret = ext4_da_reserve_space(inode); in ext4_insert_delayed_block()
1672 ret = ext4_es_insert_delayed_block(inode, lblk, allocated); in ext4_insert_delayed_block()
1684 static int ext4_da_map_blocks(struct inode *inode, sector_t iblock, in ext4_da_map_blocks() argument
1697 if (invalid_block < ext4_blocks_count(EXT4_SB(inode->i_sb)->s_es)) in ext4_da_map_blocks()
1701 ext_debug(inode, "max_blocks %u, logical block %lu\n", map->m_len, in ext4_da_map_blocks()
1705 if (ext4_es_lookup_extent(inode, iblock, NULL, &es)) { in ext4_da_map_blocks()
1708 down_read(&EXT4_I(inode)->i_data_sem); in ext4_da_map_blocks()
1717 map_bh(bh, inode->i_sb, invalid_block); in ext4_da_map_blocks()
1736 ext4_map_blocks_es_recheck(NULL, inode, map, &orig_map, 0); in ext4_da_map_blocks()
1745 down_read(&EXT4_I(inode)->i_data_sem); in ext4_da_map_blocks()
1746 if (ext4_has_inline_data(inode)) in ext4_da_map_blocks()
1748 else if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) in ext4_da_map_blocks()
1749 retval = ext4_ext_map_blocks(NULL, inode, map, 0); in ext4_da_map_blocks()
1751 retval = ext4_ind_map_blocks(NULL, inode, map, 0); in ext4_da_map_blocks()
1762 ret = ext4_insert_delayed_block(inode, map->m_lblk); in ext4_da_map_blocks()
1768 map_bh(bh, inode->i_sb, invalid_block); in ext4_da_map_blocks()
1776 ext4_warning(inode->i_sb, in ext4_da_map_blocks()
1779 inode->i_ino, retval, map->m_len); in ext4_da_map_blocks()
1785 ret = ext4_es_insert_extent(inode, map->m_lblk, map->m_len, in ext4_da_map_blocks()
1792 up_read((&EXT4_I(inode)->i_data_sem)); in ext4_da_map_blocks()
1809 int ext4_da_get_block_prep(struct inode *inode, sector_t iblock, in ext4_da_get_block_prep() argument
1816 BUG_ON(bh->b_size != inode->i_sb->s_blocksize); in ext4_da_get_block_prep()
1826 ret = ext4_da_map_blocks(inode, iblock, &map, bh); in ext4_da_get_block_prep()
1830 map_bh(bh, inode->i_sb, map.m_pblk); in ext4_da_get_block_prep()
1862 struct inode *inode = mapping->host; in __ext4_journalled_writepage() local
1866 int inline_data = ext4_has_inline_data(inode); in __ext4_journalled_writepage()
1873 BUG_ON(len > ext4_get_max_inline_size(inode)); in __ext4_journalled_writepage()
1874 inode_bh = ext4_journalled_write_inline_data(inode, len, page); in __ext4_journalled_writepage()
1894 handle = ext4_journal_start(inode, EXT4_HT_WRITE_PAGE, in __ext4_journalled_writepage()
1895 ext4_writepage_trans_blocks(inode)); in __ext4_journalled_writepage()
1913 ret = ext4_mark_inode_dirty(handle, inode); in __ext4_journalled_writepage()
1923 err = ext4_jbd2_inode_add_write(handle, inode, page_offset(page), len); in __ext4_journalled_writepage()
1926 EXT4_I(inode)->i_datasync_tid = handle->h_transaction->t_tid; in __ext4_journalled_writepage()
1931 if (!ext4_has_inline_data(inode)) in __ext4_journalled_writepage()
1934 ext4_set_inode_state(inode, EXT4_STATE_JDATA); in __ext4_journalled_writepage()
1990 struct inode *inode = page->mapping->host; in ext4_writepage() local
1994 if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb)))) { in ext4_writepage()
1995 inode->i_mapping->a_ops->invalidatepage(page, 0, PAGE_SIZE); in ext4_writepage()
2001 size = i_size_read(inode); in ext4_writepage()
2003 !ext4_verity_in_progress(inode)) in ext4_writepage()
2030 (inode->i_sb->s_blocksize == PAGE_SIZE)) { in ext4_writepage()
2044 if (PageChecked(page) && ext4_should_journal_data(inode)) in ext4_writepage()
2052 io_submit.io_end = ext4_init_io_end(inode, GFP_NOFS); in ext4_writepage()
2086 size = i_size_read(mpd->inode); in mpage_submit_page()
2088 !ext4_verity_in_progress(mpd->inode)) in mpage_submit_page()
2182 struct inode *inode = mpd->inode; in mpage_process_page_bufs() local
2184 ext4_lblk_t blocks = (i_size_read(inode) + i_blocksize(inode) - 1) in mpage_process_page_bufs()
2185 >> inode->i_blkbits; in mpage_process_page_bufs()
2187 if (ext4_verity_in_progress(inode)) in mpage_process_page_bufs()
2241 int blkbits = mpd->inode->i_blkbits; in mpage_process_page()
2308 struct inode *inode = mpd->inode; in mpage_map_and_submit_buffers() local
2309 int bpp_bits = PAGE_SHIFT - inode->i_blkbits; in mpage_map_and_submit_buffers()
2323 nr_pages = pagevec_lookup_range(&pvec, inode->i_mapping, in mpage_map_and_submit_buffers()
2357 struct inode *inode = mpd->inode; in mpage_map_one_extent() local
2362 trace_ext4_da_write_pages_extent(inode, map); in mpage_map_one_extent()
2381 dioread_nolock = ext4_should_dioread_nolock(inode); in mpage_map_one_extent()
2387 err = ext4_map_blocks(handle, inode, map, get_blocks_flags); in mpage_map_one_extent()
2396 ext4_set_io_unwritten_flag(inode, mpd->io_submit.io_end); in mpage_map_one_extent()
2427 struct inode *inode = mpd->inode; in mpage_map_and_submit_extent() local
2438 io_end_vec->offset = ((loff_t)map->m_lblk) << inode->i_blkbits; in mpage_map_and_submit_extent()
2442 struct super_block *sb = inode->i_sb; in mpage_map_and_submit_extent()
2462 inode->i_ino, in mpage_map_and_submit_extent()
2469 ext4_print_free_blocks(inode); in mpage_map_and_submit_extent()
2490 if (disksize > READ_ONCE(EXT4_I(inode)->i_disksize)) { in mpage_map_and_submit_extent()
2494 down_write(&EXT4_I(inode)->i_data_sem); in mpage_map_and_submit_extent()
2495 i_size = i_size_read(inode); in mpage_map_and_submit_extent()
2498 if (disksize > EXT4_I(inode)->i_disksize) in mpage_map_and_submit_extent()
2499 EXT4_I(inode)->i_disksize = disksize; in mpage_map_and_submit_extent()
2500 up_write(&EXT4_I(inode)->i_data_sem); in mpage_map_and_submit_extent()
2501 err2 = ext4_mark_inode_dirty(handle, inode); in mpage_map_and_submit_extent()
2503 ext4_error_err(inode->i_sb, -err2, in mpage_map_and_submit_extent()
2505 inode->i_ino); in mpage_map_and_submit_extent()
2520 static int ext4_da_writepages_trans_blocks(struct inode *inode) in ext4_da_writepages_trans_blocks() argument
2522 int bpp = ext4_journal_blocks_per_page(inode); in ext4_da_writepages_trans_blocks()
2524 return ext4_meta_trans_blocks(inode, in ext4_da_writepages_trans_blocks()
2548 struct address_space *mapping = mpd->inode->i_mapping; in mpage_prepare_extent_to_map()
2556 int blkbits = mpd->inode->i_blkbits; in mpage_prepare_extent_to_map()
2643 struct inode *inode = mapping->host; in ext4_writepages() local
2649 if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb)))) in ext4_writepages()
2653 trace_ext4_writepages(inode, wbc); in ext4_writepages()
2663 if (ext4_should_journal_data(inode)) { in ext4_writepages()
2679 ext4_test_mount_flag(inode->i_sb, EXT4_MF_FS_ABORTED))) { in ext4_writepages()
2689 if (ext4_has_inline_data(inode)) { in ext4_writepages()
2691 handle = ext4_journal_start(inode, EXT4_HT_INODE, 1); in ext4_writepages()
2696 BUG_ON(ext4_test_inode_state(inode, in ext4_writepages()
2698 ext4_destroy_inline_data(handle, inode); in ext4_writepages()
2702 if (ext4_should_dioread_nolock(inode)) { in ext4_writepages()
2707 rsv_blocks = 1 + ext4_chunk_trans_blocks(inode, in ext4_writepages()
2708 PAGE_SIZE >> inode->i_blkbits); in ext4_writepages()
2725 mpd.inode = inode; in ext4_writepages()
2741 mpd.io_submit.io_end = ext4_init_io_end(inode, GFP_KERNEL); in ext4_writepages()
2758 mpd.io_submit.io_end = ext4_init_io_end(inode, GFP_KERNEL); in ext4_writepages()
2771 BUG_ON(ext4_should_journal_data(inode)); in ext4_writepages()
2772 needed_blocks = ext4_da_writepages_trans_blocks(inode); in ext4_writepages()
2775 handle = ext4_journal_start_with_reserve(inode, in ext4_writepages()
2779 ext4_msg(inode->i_sb, KERN_CRIT, "%s: jbd2_start: " in ext4_writepages()
2781 wbc->nr_to_write, inode->i_ino, ret); in ext4_writepages()
2789 trace_ext4_da_write_pages(inode, mpd.first_page, mpd.wbc); in ext4_writepages()
2860 trace_ext4_writepages_result(inode, wbc, ret, in ext4_writepages()
2871 struct inode *inode = mapping->host; in ext4_dax_writepages() local
2874 if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb)))) in ext4_dax_writepages()
2878 trace_ext4_writepages(inode, wbc); in ext4_dax_writepages()
2881 trace_ext4_writepages_result(inode, wbc, ret, in ext4_dax_writepages()
2922 static int ext4_da_write_credits(struct inode *inode, loff_t pos, unsigned len) in ext4_da_write_credits() argument
2924 if (likely(ext4_has_feature_large_file(inode->i_sb))) in ext4_da_write_credits()
2941 struct inode *inode = mapping->host; in ext4_da_write_begin() local
2944 if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb)))) in ext4_da_write_begin()
2949 if (ext4_nonda_switch(inode->i_sb) || S_ISLNK(inode->i_mode) || in ext4_da_write_begin()
2950 ext4_verity_in_progress(inode)) { in ext4_da_write_begin()
2956 trace_ext4_da_write_begin(inode, pos, len, flags); in ext4_da_write_begin()
2958 if (ext4_test_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA)) { in ext4_da_write_begin()
2959 ret = ext4_da_write_inline_data_begin(mapping, inode, in ext4_da_write_begin()
2988 handle = ext4_journal_start(inode, EXT4_HT_WRITE_PAGE, in ext4_da_write_begin()
2989 ext4_da_write_credits(inode, pos, len)); in ext4_da_write_begin()
3020 if (pos + len > inode->i_size) in ext4_da_write_begin()
3021 ext4_truncate_failed_write(inode); in ext4_da_write_begin()
3024 ext4_should_retry_alloc(inode->i_sb, &retries)) in ext4_da_write_begin()
3043 struct inode *inode = page->mapping->host; in ext4_da_should_update_i_disksize() local
3048 idx = offset >> inode->i_blkbits; in ext4_da_should_update_i_disksize()
3063 struct inode *inode = mapping->host; in ext4_da_write_end() local
3074 trace_ext4_da_write_end(inode, pos, len, copied); in ext4_da_write_end()
3084 if (copied && new_i_size > EXT4_I(inode)->i_disksize) { in ext4_da_write_end()
3085 if (ext4_has_inline_data(inode) || in ext4_da_write_end()
3087 ext4_update_i_disksize(inode, new_i_size); in ext4_da_write_end()
3092 ret = ext4_mark_inode_dirty(handle, inode); in ext4_da_write_end()
3097 ext4_test_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA) && in ext4_da_write_end()
3098 ext4_has_inline_data(inode)) in ext4_da_write_end()
3099 ret2 = ext4_da_write_inline_data_end(inode, pos, len, copied, in ext4_da_write_end()
3118 int ext4_alloc_da_blocks(struct inode *inode) in ext4_alloc_da_blocks() argument
3120 trace_ext4_alloc_da_blocks(inode); in ext4_alloc_da_blocks()
3122 if (!EXT4_I(inode)->i_reserved_data_blocks) in ext4_alloc_da_blocks()
3156 return filemap_flush(inode->i_mapping); in ext4_alloc_da_blocks()
3175 struct inode *inode = mapping->host; in ext4_bmap() local
3182 if (ext4_has_inline_data(inode)) in ext4_bmap()
3186 test_opt(inode->i_sb, DELALLOC)) { in ext4_bmap()
3195 if (EXT4_JOURNAL(inode) && in ext4_bmap()
3196 ext4_test_inode_state(inode, EXT4_STATE_JDATA)) { in ext4_bmap()
3215 ext4_clear_inode_state(inode, EXT4_STATE_JDATA); in ext4_bmap()
3216 journal = EXT4_JOURNAL(inode); in ext4_bmap()
3231 struct inode *inode = page->mapping->host; in ext4_readpage() local
3235 if (ext4_has_inline_data(inode)) in ext4_readpage()
3236 ret = ext4_readpage_inline(inode, page); in ext4_readpage()
3239 return ext4_mpage_readpages(inode, NULL, page); in ext4_readpage()
3246 struct inode *inode = rac->mapping->host; in ext4_readahead() local
3249 if (ext4_has_inline_data(inode)) in ext4_readahead()
3252 ext4_mpage_readpages(inode, rac, NULL); in ext4_readahead()
3306 static bool ext4_inode_datasync_dirty(struct inode *inode) in ext4_inode_datasync_dirty() argument
3308 journal_t *journal = EXT4_SB(inode->i_sb)->s_journal; in ext4_inode_datasync_dirty()
3312 EXT4_I(inode)->i_datasync_tid)) in ext4_inode_datasync_dirty()
3314 if (test_opt2(inode->i_sb, JOURNAL_FAST_COMMIT)) in ext4_inode_datasync_dirty()
3315 return !list_empty(&EXT4_I(inode)->i_fc_list); in ext4_inode_datasync_dirty()
3320 if (!list_empty(&inode->i_mapping->private_list)) in ext4_inode_datasync_dirty()
3322 return inode->i_state & I_DIRTY_DATASYNC; in ext4_inode_datasync_dirty()
3325 static void ext4_set_iomap(struct inode *inode, struct iomap *iomap, in ext4_set_iomap() argument
3329 u8 blkbits = inode->i_blkbits; in ext4_set_iomap()
3337 if (ext4_inode_datasync_dirty(inode) || in ext4_set_iomap()
3338 offset + length > i_size_read(inode)) in ext4_set_iomap()
3344 iomap->bdev = inode->i_sb->s_bdev; in ext4_set_iomap()
3345 iomap->dax_dev = EXT4_SB(inode->i_sb)->s_daxdev; in ext4_set_iomap()
3350 !ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) in ext4_set_iomap()
3374 static int ext4_iomap_alloc(struct inode *inode, struct ext4_map_blocks *map, in ext4_iomap_alloc() argument
3378 u8 blkbits = inode->i_blkbits; in ext4_iomap_alloc()
3387 dio_credits = ext4_chunk_trans_blocks(inode, map->m_len); in ext4_iomap_alloc()
3396 handle = ext4_journal_start(inode, EXT4_HT_MAP_BLOCKS, dio_credits); in ext4_iomap_alloc()
3404 WARN_ON(!IS_DAX(inode) && !(flags & IOMAP_DIRECT)); in ext4_iomap_alloc()
3405 if (IS_DAX(inode)) in ext4_iomap_alloc()
3413 else if ((map->m_lblk * (1 << blkbits)) >= i_size_read(inode)) in ext4_iomap_alloc()
3415 else if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) in ext4_iomap_alloc()
3418 ret = ext4_map_blocks(handle, inode, map, m_flags); in ext4_iomap_alloc()
3429 if (ret == -ENOSPC && ext4_should_retry_alloc(inode->i_sb, &retries)) in ext4_iomap_alloc()
3436 static int ext4_iomap_begin(struct inode *inode, loff_t offset, loff_t length, in ext4_iomap_begin() argument
3441 u8 blkbits = inode->i_blkbits; in ext4_iomap_begin()
3446 if (WARN_ON_ONCE(ext4_has_inline_data(inode))) in ext4_iomap_begin()
3463 if (offset + length <= i_size_read(inode)) { in ext4_iomap_begin()
3464 ret = ext4_map_blocks(NULL, inode, &map, 0); in ext4_iomap_begin()
3468 ret = ext4_iomap_alloc(inode, &map, flags); in ext4_iomap_begin()
3470 ret = ext4_map_blocks(NULL, inode, &map, 0); in ext4_iomap_begin()
3476 ext4_set_iomap(inode, iomap, &map, offset, length); in ext4_iomap_begin()
3481 static int ext4_iomap_overwrite_begin(struct inode *inode, loff_t offset, in ext4_iomap_overwrite_begin() argument
3492 ret = ext4_iomap_begin(inode, offset, length, flags, iomap, srcmap); in ext4_iomap_overwrite_begin()
3497 static int ext4_iomap_end(struct inode *inode, loff_t offset, loff_t length, in ext4_iomap_end() argument
3523 static bool ext4_iomap_is_delalloc(struct inode *inode, in ext4_iomap_is_delalloc() argument
3529 ext4_es_find_extent_range(inode, &ext4_es_is_delayed, in ext4_iomap_is_delalloc()
3546 static int ext4_iomap_begin_report(struct inode *inode, loff_t offset, in ext4_iomap_begin_report() argument
3553 u8 blkbits = inode->i_blkbits; in ext4_iomap_begin_report()
3558 if (ext4_has_inline_data(inode)) { in ext4_iomap_begin_report()
3559 ret = ext4_inline_data_iomap(inode, iomap); in ext4_iomap_begin_report()
3580 if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) { in ext4_iomap_begin_report()
3581 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_iomap_begin_report()
3589 ret = ext4_map_blocks(NULL, inode, &map, 0); in ext4_iomap_begin_report()
3593 delalloc = ext4_iomap_is_delalloc(inode, &map); in ext4_iomap_begin_report()
3596 ext4_set_iomap(inode, iomap, &map, offset, length); in ext4_iomap_begin_report()
3702 void ext4_set_aops(struct inode *inode) in ext4_set_aops() argument
3704 switch (ext4_inode_journal_mode(inode)) { in ext4_set_aops()
3709 inode->i_mapping->a_ops = &ext4_journalled_aops; in ext4_set_aops()
3714 if (IS_DAX(inode)) in ext4_set_aops()
3715 inode->i_mapping->a_ops = &ext4_dax_aops; in ext4_set_aops()
3716 else if (test_opt(inode->i_sb, DELALLOC)) in ext4_set_aops()
3717 inode->i_mapping->a_ops = &ext4_da_aops; in ext4_set_aops()
3719 inode->i_mapping->a_ops = &ext4_aops; in ext4_set_aops()
3729 struct inode *inode = mapping->host; in __ext4_block_zero_page_range() local
3739 blocksize = inode->i_sb->s_blocksize; in __ext4_block_zero_page_range()
3741 iblock = index << (PAGE_SHIFT - inode->i_sb->s_blocksize_bits); in __ext4_block_zero_page_range()
3760 ext4_get_block(inode, iblock, bh, 0); in __ext4_block_zero_page_range()
3776 if (fscrypt_inode_uses_fs_layer_crypto(inode)) { in __ext4_block_zero_page_range()
3778 BUG_ON(!fscrypt_has_encryption_key(inode)); in __ext4_block_zero_page_range()
3787 if (ext4_should_journal_data(inode)) { in __ext4_block_zero_page_range()
3796 if (ext4_should_journal_data(inode)) { in __ext4_block_zero_page_range()
3797 err = ext4_handle_dirty_metadata(handle, inode, bh); in __ext4_block_zero_page_range()
3801 if (ext4_should_order_data(inode)) in __ext4_block_zero_page_range()
3802 err = ext4_jbd2_inode_add_write(handle, inode, from, in __ext4_block_zero_page_range()
3822 struct inode *inode = mapping->host; in ext4_block_zero_page_range() local
3824 unsigned blocksize = inode->i_sb->s_blocksize; in ext4_block_zero_page_range()
3834 if (IS_DAX(inode)) { in ext4_block_zero_page_range()
3835 return iomap_zero_range(inode, from, length, NULL, in ext4_block_zero_page_range()
3853 struct inode *inode = mapping->host; in ext4_block_truncate_page() local
3856 if (IS_ENCRYPTED(inode) && !fscrypt_has_encryption_key(inode)) in ext4_block_truncate_page()
3859 blocksize = inode->i_sb->s_blocksize; in ext4_block_truncate_page()
3865 int ext4_zero_partial_blocks(handle_t *handle, struct inode *inode, in ext4_zero_partial_blocks() argument
3868 struct super_block *sb = inode->i_sb; in ext4_zero_partial_blocks()
3869 struct address_space *mapping = inode->i_mapping; in ext4_zero_partial_blocks()
3903 int ext4_can_truncate(struct inode *inode) in ext4_can_truncate() argument
3905 if (S_ISREG(inode->i_mode)) in ext4_can_truncate()
3907 if (S_ISDIR(inode->i_mode)) in ext4_can_truncate()
3909 if (S_ISLNK(inode->i_mode)) in ext4_can_truncate()
3910 return !ext4_inode_is_fast_symlink(inode); in ext4_can_truncate()
3920 int ext4_update_disksize_before_punch(struct inode *inode, loff_t offset, in ext4_update_disksize_before_punch() argument
3926 loff_t size = i_size_read(inode); in ext4_update_disksize_before_punch()
3928 WARN_ON(!inode_is_locked(inode)); in ext4_update_disksize_before_punch()
3932 if (EXT4_I(inode)->i_disksize >= size) in ext4_update_disksize_before_punch()
3935 handle = ext4_journal_start(inode, EXT4_HT_MISC, 1); in ext4_update_disksize_before_punch()
3938 ext4_update_i_disksize(inode, size); in ext4_update_disksize_before_punch()
3939 ret = ext4_mark_inode_dirty(handle, inode); in ext4_update_disksize_before_punch()
3952 int ext4_break_layouts(struct inode *inode) in ext4_break_layouts() argument
3954 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_break_layouts()
3962 page = dax_layout_busy_page(inode->i_mapping); in ext4_break_layouts()
3986 int ext4_punch_hole(struct inode *inode, loff_t offset, loff_t length) in ext4_punch_hole() argument
3988 struct super_block *sb = inode->i_sb; in ext4_punch_hole()
3990 struct address_space *mapping = inode->i_mapping; in ext4_punch_hole()
3996 trace_ext4_punch_hole(inode, offset, length, 0); in ext4_punch_hole()
3998 ext4_clear_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA); in ext4_punch_hole()
3999 if (ext4_has_inline_data(inode)) { in ext4_punch_hole()
4000 down_write(&EXT4_I(inode)->i_mmap_sem); in ext4_punch_hole()
4001 ret = ext4_convert_inline_data(inode); in ext4_punch_hole()
4002 up_write(&EXT4_I(inode)->i_mmap_sem); in ext4_punch_hole()
4018 inode_lock(inode); in ext4_punch_hole()
4021 if (offset >= inode->i_size) in ext4_punch_hole()
4028 if (offset + length > inode->i_size) { in ext4_punch_hole()
4029 length = inode->i_size + in ext4_punch_hole()
4030 PAGE_SIZE - (inode->i_size & (PAGE_SIZE - 1)) - in ext4_punch_hole()
4040 ret = ext4_inode_attach_jinode(inode); in ext4_punch_hole()
4047 inode_dio_wait(inode); in ext4_punch_hole()
4053 down_write(&EXT4_I(inode)->i_mmap_sem); in ext4_punch_hole()
4055 ret = ext4_break_layouts(inode); in ext4_punch_hole()
4064 ret = ext4_update_disksize_before_punch(inode, offset, length); in ext4_punch_hole()
4067 truncate_pagecache_range(inode, first_block_offset, in ext4_punch_hole()
4071 if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) in ext4_punch_hole()
4072 credits = ext4_writepage_trans_blocks(inode); in ext4_punch_hole()
4074 credits = ext4_blocks_for_truncate(inode); in ext4_punch_hole()
4075 handle = ext4_journal_start(inode, EXT4_HT_TRUNCATE, credits); in ext4_punch_hole()
4082 ret = ext4_zero_partial_blocks(handle, inode, offset, in ext4_punch_hole()
4094 down_write(&EXT4_I(inode)->i_data_sem); in ext4_punch_hole()
4095 ext4_discard_preallocations(inode, 0); in ext4_punch_hole()
4097 ret = ext4_es_remove_extent(inode, first_block, in ext4_punch_hole()
4100 up_write(&EXT4_I(inode)->i_data_sem); in ext4_punch_hole()
4104 if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) in ext4_punch_hole()
4105 ret = ext4_ext_remove_space(inode, first_block, in ext4_punch_hole()
4108 ret = ext4_ind_remove_space(handle, inode, first_block, in ext4_punch_hole()
4111 up_write(&EXT4_I(inode)->i_data_sem); in ext4_punch_hole()
4113 ext4_fc_track_range(handle, inode, first_block, stop_block); in ext4_punch_hole()
4114 if (IS_SYNC(inode)) in ext4_punch_hole()
4117 inode->i_mtime = inode->i_ctime = current_time(inode); in ext4_punch_hole()
4118 ret2 = ext4_mark_inode_dirty(handle, inode); in ext4_punch_hole()
4122 ext4_update_inode_fsync_trans(handle, inode, 1); in ext4_punch_hole()
4126 up_write(&EXT4_I(inode)->i_mmap_sem); in ext4_punch_hole()
4128 inode_unlock(inode); in ext4_punch_hole()
4132 int ext4_inode_attach_jinode(struct inode *inode) in ext4_inode_attach_jinode() argument
4134 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_inode_attach_jinode()
4137 if (ei->jinode || !EXT4_SB(inode->i_sb)->s_journal) in ext4_inode_attach_jinode()
4141 spin_lock(&inode->i_lock); in ext4_inode_attach_jinode()
4144 spin_unlock(&inode->i_lock); in ext4_inode_attach_jinode()
4148 jbd2_journal_init_jbd_inode(ei->jinode, inode); in ext4_inode_attach_jinode()
4151 spin_unlock(&inode->i_lock); in ext4_inode_attach_jinode()
4185 int ext4_truncate(struct inode *inode) in ext4_truncate() argument
4187 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_truncate()
4191 struct address_space *mapping = inode->i_mapping; in ext4_truncate()
4198 if (!(inode->i_state & (I_NEW|I_FREEING))) in ext4_truncate()
4199 WARN_ON(!inode_is_locked(inode)); in ext4_truncate()
4200 trace_ext4_truncate_enter(inode); in ext4_truncate()
4202 if (!ext4_can_truncate(inode)) in ext4_truncate()
4205 if (inode->i_size == 0 && !test_opt(inode->i_sb, NO_AUTO_DA_ALLOC)) in ext4_truncate()
4206 ext4_set_inode_state(inode, EXT4_STATE_DA_ALLOC_CLOSE); in ext4_truncate()
4208 if (ext4_has_inline_data(inode)) { in ext4_truncate()
4211 err = ext4_inline_data_truncate(inode, &has_inline); in ext4_truncate()
4217 if (inode->i_size & (inode->i_sb->s_blocksize - 1)) { in ext4_truncate()
4218 if (ext4_inode_attach_jinode(inode) < 0) in ext4_truncate()
4222 if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) in ext4_truncate()
4223 credits = ext4_writepage_trans_blocks(inode); in ext4_truncate()
4225 credits = ext4_blocks_for_truncate(inode); in ext4_truncate()
4227 handle = ext4_journal_start(inode, EXT4_HT_TRUNCATE, credits); in ext4_truncate()
4233 if (inode->i_size & (inode->i_sb->s_blocksize - 1)) in ext4_truncate()
4234 ext4_block_truncate_page(handle, mapping, inode->i_size); in ext4_truncate()
4245 err = ext4_orphan_add(handle, inode); in ext4_truncate()
4249 down_write(&EXT4_I(inode)->i_data_sem); in ext4_truncate()
4251 ext4_discard_preallocations(inode, 0); in ext4_truncate()
4253 if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) in ext4_truncate()
4254 err = ext4_ext_truncate(handle, inode); in ext4_truncate()
4256 ext4_ind_truncate(handle, inode); in ext4_truncate()
4262 if (IS_SYNC(inode)) in ext4_truncate()
4273 if (inode->i_nlink) in ext4_truncate()
4274 ext4_orphan_del(handle, inode); in ext4_truncate()
4276 inode->i_mtime = inode->i_ctime = current_time(inode); in ext4_truncate()
4277 err2 = ext4_mark_inode_dirty(handle, inode); in ext4_truncate()
4283 trace_ext4_truncate_exit(inode); in ext4_truncate()
4426 static int __ext4_get_inode_loc_noinmem(struct inode *inode, in __ext4_get_inode_loc_noinmem() argument
4432 ret = __ext4_get_inode_loc(inode->i_sb, inode->i_ino, iloc, 0, in __ext4_get_inode_loc_noinmem()
4436 ext4_error_inode_block(inode, err_blk, EIO, in __ext4_get_inode_loc_noinmem()
4442 int ext4_get_inode_loc(struct inode *inode, struct ext4_iloc *iloc) in ext4_get_inode_loc() argument
4448 ret = __ext4_get_inode_loc(inode->i_sb, inode->i_ino, iloc, in ext4_get_inode_loc()
4449 !ext4_test_inode_state(inode, EXT4_STATE_XATTR), &err_blk); in ext4_get_inode_loc()
4452 ext4_error_inode_block(inode, err_blk, EIO, in ext4_get_inode_loc()
4465 static bool ext4_should_enable_dax(struct inode *inode) in ext4_should_enable_dax() argument
4467 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_should_enable_dax()
4469 if (test_opt2(inode->i_sb, DAX_NEVER)) in ext4_should_enable_dax()
4471 if (!S_ISREG(inode->i_mode)) in ext4_should_enable_dax()
4473 if (ext4_should_journal_data(inode)) in ext4_should_enable_dax()
4475 if (ext4_has_inline_data(inode)) in ext4_should_enable_dax()
4477 if (ext4_test_inode_flag(inode, EXT4_INODE_ENCRYPT)) in ext4_should_enable_dax()
4479 if (ext4_test_inode_flag(inode, EXT4_INODE_VERITY)) in ext4_should_enable_dax()
4483 if (test_opt(inode->i_sb, DAX_ALWAYS)) in ext4_should_enable_dax()
4486 return ext4_test_inode_flag(inode, EXT4_INODE_DAX); in ext4_should_enable_dax()
4489 void ext4_set_inode_flags(struct inode *inode, bool init) in ext4_set_inode_flags() argument
4491 unsigned int flags = EXT4_I(inode)->i_flags; in ext4_set_inode_flags()
4494 WARN_ON_ONCE(IS_DAX(inode) && init); in ext4_set_inode_flags()
4509 new_fl |= (inode->i_flags & S_DAX); in ext4_set_inode_flags()
4510 if (init && ext4_should_enable_dax(inode)) in ext4_set_inode_flags()
4519 inode_set_flags(inode, new_fl, in ext4_set_inode_flags()
4528 struct inode *inode = &(ei->vfs_inode); in ext4_inode_blocks() local
4529 struct super_block *sb = inode->i_sb; in ext4_inode_blocks()
4535 if (ext4_test_inode_flag(inode, EXT4_INODE_HUGE_FILE)) { in ext4_inode_blocks()
4537 return i_blocks << (inode->i_blkbits - 9); in ext4_inode_blocks()
4546 static inline int ext4_iget_extra_inode(struct inode *inode, in ext4_iget_extra_inode() argument
4554 EXT4_INODE_SIZE(inode->i_sb) && in ext4_iget_extra_inode()
4556 ext4_set_inode_state(inode, EXT4_STATE_XATTR); in ext4_iget_extra_inode()
4557 return ext4_find_inline_data_nolock(inode); in ext4_iget_extra_inode()
4559 EXT4_I(inode)->i_inline_off = 0; in ext4_iget_extra_inode()
4563 int ext4_get_projid(struct inode *inode, kprojid_t *projid) in ext4_get_projid() argument
4565 if (!ext4_has_feature_project(inode->i_sb)) in ext4_get_projid()
4567 *projid = EXT4_I(inode)->i_projid; in ext4_get_projid()
4576 static inline void ext4_inode_set_iversion_queried(struct inode *inode, u64 val) in ext4_inode_set_iversion_queried() argument
4578 if (unlikely(EXT4_I(inode)->i_flags & EXT4_EA_INODE_FL)) in ext4_inode_set_iversion_queried()
4579 inode_set_iversion_raw(inode, val); in ext4_inode_set_iversion_queried()
4581 inode_set_iversion_queried(inode, val); in ext4_inode_set_iversion_queried()
4583 static inline u64 ext4_inode_peek_iversion(const struct inode *inode) in ext4_inode_peek_iversion() argument
4585 if (unlikely(EXT4_I(inode)->i_flags & EXT4_EA_INODE_FL)) in ext4_inode_peek_iversion()
4586 return inode_peek_iversion_raw(inode); in ext4_inode_peek_iversion()
4588 return inode_peek_iversion(inode); in ext4_inode_peek_iversion()
4591 struct inode *__ext4_iget(struct super_block *sb, unsigned long ino, in __ext4_iget()
4598 struct inode *inode; in __ext4_iget() local
4619 inode = iget_locked(sb, ino); in __ext4_iget()
4620 if (!inode) in __ext4_iget()
4622 if (!(inode->i_state & I_NEW)) in __ext4_iget()
4623 return inode; in __ext4_iget()
4625 ei = EXT4_I(inode); in __ext4_iget()
4628 ret = __ext4_get_inode_loc_noinmem(inode, &iloc); in __ext4_iget()
4634 ext4_error_inode(inode, function, line, 0, in __ext4_iget()
4646 if (EXT4_INODE_SIZE(inode->i_sb) > EXT4_GOOD_OLD_INODE_SIZE) { in __ext4_iget()
4649 EXT4_INODE_SIZE(inode->i_sb) || in __ext4_iget()
4651 ext4_error_inode(inode, function, line, 0, in __ext4_iget()
4655 EXT4_INODE_SIZE(inode->i_sb)); in __ext4_iget()
4664 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in __ext4_iget()
4666 __le32 inum = cpu_to_le32(inode->i_ino); in __ext4_iget()
4674 if ((!ext4_inode_csum_verify(inode, raw_inode, ei) || in __ext4_iget()
4677 ext4_error_inode_err(inode, function, line, 0, in __ext4_iget()
4683 inode->i_mode = le16_to_cpu(raw_inode->i_mode); in __ext4_iget()
4693 if (!(test_opt(inode->i_sb, NO_UID32))) { in __ext4_iget()
4697 i_uid_write(inode, i_uid); in __ext4_iget()
4698 i_gid_write(inode, i_gid); in __ext4_iget()
4700 set_nlink(inode, le16_to_cpu(raw_inode->i_links_count)); in __ext4_iget()
4711 if (inode->i_nlink == 0) { in __ext4_iget()
4712 if ((inode->i_mode == 0 || in __ext4_iget()
4713 !(EXT4_SB(inode->i_sb)->s_mount_state & EXT4_ORPHAN_FS)) && in __ext4_iget()
4727 ext4_set_inode_flags(inode, true); in __ext4_iget()
4728 inode->i_blocks = ext4_inode_blocks(raw_inode, ei); in __ext4_iget()
4733 inode->i_size = ext4_isize(sb, raw_inode); in __ext4_iget()
4734 if ((size = i_size_read(inode)) < 0) { in __ext4_iget()
4735 ext4_error_inode(inode, function, line, 0, in __ext4_iget()
4746 ext4_test_inode_flag(inode, EXT4_INODE_INDEX)) { in __ext4_iget()
4747 ext4_error_inode(inode, function, line, 0, in __ext4_iget()
4752 ei->i_disksize = inode->i_size; in __ext4_iget()
4756 inode->i_generation = le32_to_cpu(raw_inode->i_generation); in __ext4_iget()
4793 if (EXT4_INODE_SIZE(inode->i_sb) > EXT4_GOOD_OLD_INODE_SIZE) { in __ext4_iget()
4800 ret = ext4_iget_extra_inode(inode, raw_inode, ei); in __ext4_iget()
4806 EXT4_INODE_GET_XTIME(i_ctime, inode, raw_inode); in __ext4_iget()
4807 EXT4_INODE_GET_XTIME(i_mtime, inode, raw_inode); in __ext4_iget()
4808 EXT4_INODE_GET_XTIME(i_atime, inode, raw_inode); in __ext4_iget()
4811 if (likely(!test_opt2(inode->i_sb, HURD_COMPAT))) { in __ext4_iget()
4814 if (EXT4_INODE_SIZE(inode->i_sb) > EXT4_GOOD_OLD_INODE_SIZE) { in __ext4_iget()
4819 ext4_inode_set_iversion_queried(inode, ivers); in __ext4_iget()
4824 !ext4_inode_block_valid(inode, ei->i_file_acl, 1)) { in __ext4_iget()
4825 ext4_error_inode(inode, function, line, 0, in __ext4_iget()
4830 } else if (!ext4_has_inline_data(inode)) { in __ext4_iget()
4833 (S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || in __ext4_iget()
4834 (S_ISLNK(inode->i_mode) && in __ext4_iget()
4835 !ext4_inode_is_fast_symlink(inode)))) { in __ext4_iget()
4836 if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) in __ext4_iget()
4837 ret = ext4_ext_check_inode(inode); in __ext4_iget()
4839 ret = ext4_ind_check_inode(inode); in __ext4_iget()
4845 if (S_ISREG(inode->i_mode)) { in __ext4_iget()
4846 inode->i_op = &ext4_file_inode_operations; in __ext4_iget()
4847 inode->i_fop = &ext4_file_operations; in __ext4_iget()
4848 ext4_set_aops(inode); in __ext4_iget()
4849 } else if (S_ISDIR(inode->i_mode)) { in __ext4_iget()
4850 inode->i_op = &ext4_dir_inode_operations; in __ext4_iget()
4851 inode->i_fop = &ext4_dir_operations; in __ext4_iget()
4852 } else if (S_ISLNK(inode->i_mode)) { in __ext4_iget()
4854 if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) { in __ext4_iget()
4855 ext4_error_inode(inode, function, line, 0, in __ext4_iget()
4861 if (IS_ENCRYPTED(inode)) { in __ext4_iget()
4862 inode->i_op = &ext4_encrypted_symlink_inode_operations; in __ext4_iget()
4863 ext4_set_aops(inode); in __ext4_iget()
4864 } else if (ext4_inode_is_fast_symlink(inode)) { in __ext4_iget()
4865 inode->i_link = (char *)ei->i_data; in __ext4_iget()
4866 inode->i_op = &ext4_fast_symlink_inode_operations; in __ext4_iget()
4867 nd_terminate_link(ei->i_data, inode->i_size, in __ext4_iget()
4870 inode->i_op = &ext4_symlink_inode_operations; in __ext4_iget()
4871 ext4_set_aops(inode); in __ext4_iget()
4873 inode_nohighmem(inode); in __ext4_iget()
4874 } else if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode) || in __ext4_iget()
4875 S_ISFIFO(inode->i_mode) || S_ISSOCK(inode->i_mode)) { in __ext4_iget()
4876 inode->i_op = &ext4_special_inode_operations; in __ext4_iget()
4878 init_special_inode(inode, inode->i_mode, in __ext4_iget()
4881 init_special_inode(inode, inode->i_mode, in __ext4_iget()
4884 make_bad_inode(inode); in __ext4_iget()
4887 ext4_error_inode(inode, function, line, 0, in __ext4_iget()
4888 "iget: bogus i_mode (%o)", inode->i_mode); in __ext4_iget()
4891 if (IS_CASEFOLDED(inode) && !ext4_has_feature_casefold(inode->i_sb)) in __ext4_iget()
4892 ext4_error_inode(inode, function, line, 0, in __ext4_iget()
4896 unlock_new_inode(inode); in __ext4_iget()
4897 return inode; in __ext4_iget()
4901 iget_failed(inode); in __ext4_iget()
4909 struct inode *inode = &(ei->vfs_inode); in ext4_inode_blocks_set() local
4910 u64 i_blocks = READ_ONCE(inode->i_blocks); in ext4_inode_blocks_set()
4911 struct super_block *sb = inode->i_sb; in ext4_inode_blocks_set()
4920 ext4_clear_inode_flag(inode, EXT4_INODE_HUGE_FILE); in ext4_inode_blocks_set()
4933 ext4_clear_inode_flag(inode, EXT4_INODE_HUGE_FILE); in ext4_inode_blocks_set()
4935 ext4_set_inode_flag(inode, EXT4_INODE_HUGE_FILE); in ext4_inode_blocks_set()
4937 i_blocks = i_blocks >> (inode->i_blkbits - 9); in ext4_inode_blocks_set()
4949 struct inode *inode; in __ext4_update_other_inode_time() local
4951 inode = find_inode_by_ino_rcu(sb, ino); in __ext4_update_other_inode_time()
4952 if (!inode) in __ext4_update_other_inode_time()
4955 if ((inode->i_state & (I_FREEING | I_WILL_FREE | I_NEW | in __ext4_update_other_inode_time()
4957 ((inode->i_state & I_DIRTY_TIME) == 0)) in __ext4_update_other_inode_time()
4960 spin_lock(&inode->i_lock); in __ext4_update_other_inode_time()
4961 if (((inode->i_state & (I_FREEING | I_WILL_FREE | I_NEW | in __ext4_update_other_inode_time()
4963 (inode->i_state & I_DIRTY_TIME)) { in __ext4_update_other_inode_time()
4964 struct ext4_inode_info *ei = EXT4_I(inode); in __ext4_update_other_inode_time()
4966 inode->i_state &= ~I_DIRTY_TIME; in __ext4_update_other_inode_time()
4967 spin_unlock(&inode->i_lock); in __ext4_update_other_inode_time()
4970 EXT4_INODE_SET_XTIME(i_ctime, inode, raw_inode); in __ext4_update_other_inode_time()
4971 EXT4_INODE_SET_XTIME(i_mtime, inode, raw_inode); in __ext4_update_other_inode_time()
4972 EXT4_INODE_SET_XTIME(i_atime, inode, raw_inode); in __ext4_update_other_inode_time()
4973 ext4_inode_csum_set(inode, raw_inode, ei); in __ext4_update_other_inode_time()
4975 trace_ext4_other_inode_update_time(inode, orig_ino); in __ext4_update_other_inode_time()
4978 spin_unlock(&inode->i_lock); in __ext4_update_other_inode_time()
5016 struct inode *inode, in ext4_do_update_inode() argument
5020 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_do_update_inode()
5022 struct super_block *sb = inode->i_sb; in ext4_do_update_inode()
5033 if (ext4_test_inode_state(inode, EXT4_STATE_NEW)) in ext4_do_update_inode()
5034 memset(raw_inode, 0, EXT4_SB(inode->i_sb)->s_inode_size); in ext4_do_update_inode()
5042 raw_inode->i_mode = cpu_to_le16(inode->i_mode); in ext4_do_update_inode()
5043 i_uid = i_uid_read(inode); in ext4_do_update_inode()
5044 i_gid = i_gid_read(inode); in ext4_do_update_inode()
5046 if (!(test_opt(inode->i_sb, NO_UID32))) { in ext4_do_update_inode()
5068 raw_inode->i_links_count = cpu_to_le16(inode->i_nlink); in ext4_do_update_inode()
5070 EXT4_INODE_SET_XTIME(i_ctime, inode, raw_inode); in ext4_do_update_inode()
5071 EXT4_INODE_SET_XTIME(i_mtime, inode, raw_inode); in ext4_do_update_inode()
5072 EXT4_INODE_SET_XTIME(i_atime, inode, raw_inode); in ext4_do_update_inode()
5077 if (likely(!test_opt2(inode->i_sb, HURD_COMPAT))) in ext4_do_update_inode()
5081 if (READ_ONCE(ei->i_disksize) != ext4_isize(inode->i_sb, raw_inode)) { in ext4_do_update_inode()
5091 raw_inode->i_generation = cpu_to_le32(inode->i_generation); in ext4_do_update_inode()
5092 if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) { in ext4_do_update_inode()
5093 if (old_valid_dev(inode->i_rdev)) { in ext4_do_update_inode()
5095 cpu_to_le32(old_encode_dev(inode->i_rdev)); in ext4_do_update_inode()
5100 cpu_to_le32(new_encode_dev(inode->i_rdev)); in ext4_do_update_inode()
5103 } else if (!ext4_has_inline_data(inode)) { in ext4_do_update_inode()
5108 if (likely(!test_opt2(inode->i_sb, HURD_COMPAT))) { in ext4_do_update_inode()
5109 u64 ivers = ext4_inode_peek_iversion(inode); in ext4_do_update_inode()
5121 BUG_ON(!ext4_has_feature_project(inode->i_sb) && in ext4_do_update_inode()
5124 if (EXT4_INODE_SIZE(inode->i_sb) > EXT4_GOOD_OLD_INODE_SIZE && in ext4_do_update_inode()
5128 ext4_inode_csum_set(inode, raw_inode, ei); in ext4_do_update_inode()
5130 if (inode->i_sb->s_flags & SB_LAZYTIME) in ext4_do_update_inode()
5131 ext4_update_other_inodes_time(inode->i_sb, inode->i_ino, in ext4_do_update_inode()
5138 ext4_clear_inode_state(inode, EXT4_STATE_NEW); in ext4_do_update_inode()
5148 ext4_update_inode_fsync_trans(handle, inode, need_datasync); in ext4_do_update_inode()
5151 ext4_std_error(inode->i_sb, err); in ext4_do_update_inode()
5189 int ext4_write_inode(struct inode *inode, struct writeback_control *wbc) in ext4_write_inode() argument
5194 sb_rdonly(inode->i_sb)) in ext4_write_inode()
5197 if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb)))) in ext4_write_inode()
5200 if (EXT4_SB(inode->i_sb)->s_journal) { in ext4_write_inode()
5215 err = ext4_fc_commit(EXT4_SB(inode->i_sb)->s_journal, in ext4_write_inode()
5216 EXT4_I(inode)->i_sync_tid); in ext4_write_inode()
5220 err = __ext4_get_inode_loc_noinmem(inode, &iloc); in ext4_write_inode()
5230 ext4_error_inode_block(inode, iloc.bh->b_blocknr, EIO, in ext4_write_inode()
5244 static void ext4_wait_for_tail_page_commit(struct inode *inode) in ext4_wait_for_tail_page_commit() argument
5248 journal_t *journal = EXT4_SB(inode->i_sb)->s_journal; in ext4_wait_for_tail_page_commit()
5252 offset = inode->i_size & (PAGE_SIZE - 1); in ext4_wait_for_tail_page_commit()
5262 if (!offset || offset > (PAGE_SIZE - i_blocksize(inode))) in ext4_wait_for_tail_page_commit()
5265 page = find_lock_page(inode->i_mapping, in ext4_wait_for_tail_page_commit()
5266 inode->i_size >> PAGE_SHIFT); in ext4_wait_for_tail_page_commit()
5311 struct inode *inode = d_inode(dentry); in ext4_setattr() local
5316 if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb)))) in ext4_setattr()
5319 if (unlikely(IS_IMMUTABLE(inode))) in ext4_setattr()
5322 if (unlikely(IS_APPEND(inode) && in ext4_setattr()
5339 if (is_quota_modification(inode, attr)) { in ext4_setattr()
5340 error = dquot_initialize(inode); in ext4_setattr()
5344 ext4_fc_start_update(inode); in ext4_setattr()
5345 if ((ia_valid & ATTR_UID && !uid_eq(attr->ia_uid, inode->i_uid)) || in ext4_setattr()
5346 (ia_valid & ATTR_GID && !gid_eq(attr->ia_gid, inode->i_gid))) { in ext4_setattr()
5351 handle = ext4_journal_start(inode, EXT4_HT_QUOTA, in ext4_setattr()
5352 (EXT4_MAXQUOTAS_INIT_BLOCKS(inode->i_sb) + in ext4_setattr()
5353 EXT4_MAXQUOTAS_DEL_BLOCKS(inode->i_sb)) + 3); in ext4_setattr()
5362 down_read(&EXT4_I(inode)->xattr_sem); in ext4_setattr()
5363 error = dquot_transfer(inode, attr); in ext4_setattr()
5364 up_read(&EXT4_I(inode)->xattr_sem); in ext4_setattr()
5368 ext4_fc_stop_update(inode); in ext4_setattr()
5374 inode->i_uid = attr->ia_uid; in ext4_setattr()
5376 inode->i_gid = attr->ia_gid; in ext4_setattr()
5377 error = ext4_mark_inode_dirty(handle, inode); in ext4_setattr()
5385 loff_t oldsize = inode->i_size; in ext4_setattr()
5386 int shrink = (attr->ia_size < inode->i_size); in ext4_setattr()
5388 if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) { in ext4_setattr()
5389 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_setattr()
5392 ext4_fc_stop_update(inode); in ext4_setattr()
5396 if (!S_ISREG(inode->i_mode)) { in ext4_setattr()
5397 ext4_fc_stop_update(inode); in ext4_setattr()
5401 if (IS_I_VERSION(inode) && attr->ia_size != inode->i_size) in ext4_setattr()
5402 inode_inc_iversion(inode); in ext4_setattr()
5405 if (ext4_should_order_data(inode)) { in ext4_setattr()
5406 error = ext4_begin_ordered_truncate(inode, in ext4_setattr()
5415 inode_dio_wait(inode); in ext4_setattr()
5418 down_write(&EXT4_I(inode)->i_mmap_sem); in ext4_setattr()
5420 rc = ext4_break_layouts(inode); in ext4_setattr()
5422 up_write(&EXT4_I(inode)->i_mmap_sem); in ext4_setattr()
5426 if (attr->ia_size != inode->i_size) { in ext4_setattr()
5427 handle = ext4_journal_start(inode, EXT4_HT_INODE, 3); in ext4_setattr()
5433 error = ext4_orphan_add(handle, inode); in ext4_setattr()
5441 inode->i_mtime = current_time(inode); in ext4_setattr()
5442 inode->i_ctime = inode->i_mtime; in ext4_setattr()
5446 ext4_fc_track_range(handle, inode, in ext4_setattr()
5448 inode->i_sb->s_blocksize_bits, in ext4_setattr()
5450 inode->i_sb->s_blocksize_bits); in ext4_setattr()
5453 handle, inode, in ext4_setattr()
5455 inode->i_sb->s_blocksize_bits, in ext4_setattr()
5457 inode->i_sb->s_blocksize_bits); in ext4_setattr()
5459 down_write(&EXT4_I(inode)->i_data_sem); in ext4_setattr()
5460 EXT4_I(inode)->i_disksize = attr->ia_size; in ext4_setattr()
5461 rc = ext4_mark_inode_dirty(handle, inode); in ext4_setattr()
5470 i_size_write(inode, attr->ia_size); in ext4_setattr()
5471 up_write(&EXT4_I(inode)->i_data_sem); in ext4_setattr()
5476 pagecache_isize_extended(inode, oldsize, in ext4_setattr()
5477 inode->i_size); in ext4_setattr()
5478 } else if (ext4_should_journal_data(inode)) { in ext4_setattr()
5479 ext4_wait_for_tail_page_commit(inode); in ext4_setattr()
5487 truncate_pagecache(inode, inode->i_size); in ext4_setattr()
5493 rc = ext4_truncate(inode); in ext4_setattr()
5498 up_write(&EXT4_I(inode)->i_mmap_sem); in ext4_setattr()
5502 setattr_copy(inode, attr); in ext4_setattr()
5503 mark_inode_dirty(inode); in ext4_setattr()
5510 if (orphan && inode->i_nlink) in ext4_setattr()
5511 ext4_orphan_del(NULL, inode); in ext4_setattr()
5514 rc = posix_acl_chmod(inode, inode->i_mode); in ext4_setattr()
5518 ext4_std_error(inode->i_sb, error); in ext4_setattr()
5521 ext4_fc_stop_update(inode); in ext4_setattr()
5528 struct inode *inode = d_inode(path->dentry); in ext4_getattr() local
5530 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_getattr()
5561 generic_fillattr(inode, stat); in ext4_getattr()
5568 struct inode *inode = d_inode(path->dentry); in ext4_file_getattr() local
5579 if (unlikely(ext4_has_inline_data(inode))) in ext4_file_getattr()
5592 delalloc_blocks = EXT4_C2B(EXT4_SB(inode->i_sb), in ext4_file_getattr()
5593 EXT4_I(inode)->i_reserved_data_blocks); in ext4_file_getattr()
5594 stat->blocks += delalloc_blocks << (inode->i_sb->s_blocksize_bits - 9); in ext4_file_getattr()
5598 static int ext4_index_trans_blocks(struct inode *inode, int lblocks, in ext4_index_trans_blocks() argument
5601 if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) in ext4_index_trans_blocks()
5602 return ext4_ind_trans_blocks(inode, lblocks); in ext4_index_trans_blocks()
5603 return ext4_ext_index_trans_blocks(inode, pextents); in ext4_index_trans_blocks()
5617 static int ext4_meta_trans_blocks(struct inode *inode, int lblocks, in ext4_meta_trans_blocks() argument
5620 ext4_group_t groups, ngroups = ext4_get_groups_count(inode->i_sb); in ext4_meta_trans_blocks()
5629 idxblocks = ext4_index_trans_blocks(inode, lblocks, pextents); in ext4_meta_trans_blocks()
5641 if (groups > EXT4_SB(inode->i_sb)->s_gdb_count) in ext4_meta_trans_blocks()
5642 gdpblocks = EXT4_SB(inode->i_sb)->s_gdb_count; in ext4_meta_trans_blocks()
5648 ret += EXT4_META_TRANS_BLOCKS(inode->i_sb); in ext4_meta_trans_blocks()
5663 int ext4_writepage_trans_blocks(struct inode *inode) in ext4_writepage_trans_blocks() argument
5665 int bpp = ext4_journal_blocks_per_page(inode); in ext4_writepage_trans_blocks()
5668 ret = ext4_meta_trans_blocks(inode, bpp, bpp); in ext4_writepage_trans_blocks()
5671 if (ext4_should_journal_data(inode)) in ext4_writepage_trans_blocks()
5685 int ext4_chunk_trans_blocks(struct inode *inode, int nrblocks) in ext4_chunk_trans_blocks() argument
5687 return ext4_meta_trans_blocks(inode, nrblocks, 1); in ext4_chunk_trans_blocks()
5695 struct inode *inode, struct ext4_iloc *iloc) in ext4_mark_iloc_dirty() argument
5699 if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb)))) { in ext4_mark_iloc_dirty()
5703 ext4_fc_track_inode(handle, inode); in ext4_mark_iloc_dirty()
5705 if (IS_I_VERSION(inode)) in ext4_mark_iloc_dirty()
5706 inode_inc_iversion(inode); in ext4_mark_iloc_dirty()
5712 err = ext4_do_update_inode(handle, inode, iloc); in ext4_mark_iloc_dirty()
5723 ext4_reserve_inode_write(handle_t *handle, struct inode *inode, in ext4_reserve_inode_write() argument
5728 if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb)))) in ext4_reserve_inode_write()
5731 err = ext4_get_inode_loc(inode, iloc); in ext4_reserve_inode_write()
5740 ext4_std_error(inode->i_sb, err); in ext4_reserve_inode_write()
5744 static int __ext4_expand_extra_isize(struct inode *inode, in __ext4_expand_extra_isize() argument
5751 unsigned int inode_size = EXT4_INODE_SIZE(inode->i_sb); in __ext4_expand_extra_isize()
5752 struct ext4_inode_info *ei = EXT4_I(inode); in __ext4_expand_extra_isize()
5758 EXT4_ERROR_INODE(inode, "bad extra_isize %u (inode size %u)", in __ext4_expand_extra_isize()
5760 EXT4_INODE_SIZE(inode->i_sb)); in __ext4_expand_extra_isize()
5770 header = IHDR(inode, raw_inode); in __ext4_expand_extra_isize()
5773 if (!ext4_test_inode_state(inode, EXT4_STATE_XATTR) || in __ext4_expand_extra_isize()
5776 EXT4_I(inode)->i_extra_isize, 0, in __ext4_expand_extra_isize()
5777 new_extra_isize - EXT4_I(inode)->i_extra_isize); in __ext4_expand_extra_isize()
5778 EXT4_I(inode)->i_extra_isize = new_extra_isize; in __ext4_expand_extra_isize()
5783 error = ext4_expand_extra_isize_ea(inode, new_extra_isize, in __ext4_expand_extra_isize()
5799 static int ext4_try_to_expand_extra_isize(struct inode *inode, in ext4_try_to_expand_extra_isize() argument
5807 if (ext4_test_inode_state(inode, EXT4_STATE_NO_EXPAND)) in ext4_try_to_expand_extra_isize()
5820 EXT4_DATA_TRANS_BLOCKS(inode->i_sb), 0) != 0) in ext4_try_to_expand_extra_isize()
5823 if (ext4_write_trylock_xattr(inode, &no_expand) == 0) in ext4_try_to_expand_extra_isize()
5826 error = __ext4_expand_extra_isize(inode, new_extra_isize, &iloc, in ext4_try_to_expand_extra_isize()
5828 ext4_write_unlock_xattr(inode, &no_expand); in ext4_try_to_expand_extra_isize()
5833 int ext4_expand_extra_isize(struct inode *inode, in ext4_expand_extra_isize() argument
5841 if (ext4_test_inode_state(inode, EXT4_STATE_NO_EXPAND)) { in ext4_expand_extra_isize()
5846 handle = ext4_journal_start(inode, EXT4_HT_INODE, in ext4_expand_extra_isize()
5847 EXT4_DATA_TRANS_BLOCKS(inode->i_sb)); in ext4_expand_extra_isize()
5854 ext4_write_lock_xattr(inode, &no_expand); in ext4_expand_extra_isize()
5863 error = __ext4_expand_extra_isize(inode, new_extra_isize, iloc, in ext4_expand_extra_isize()
5866 rc = ext4_mark_iloc_dirty(handle, inode, iloc); in ext4_expand_extra_isize()
5871 ext4_write_unlock_xattr(inode, &no_expand); in ext4_expand_extra_isize()
5889 int __ext4_mark_inode_dirty(handle_t *handle, struct inode *inode, in __ext4_mark_inode_dirty() argument
5893 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in __ext4_mark_inode_dirty()
5897 trace_ext4_mark_inode_dirty(inode, _RET_IP_); in __ext4_mark_inode_dirty()
5898 err = ext4_reserve_inode_write(handle, inode, &iloc); in __ext4_mark_inode_dirty()
5902 if (EXT4_I(inode)->i_extra_isize < sbi->s_want_extra_isize) in __ext4_mark_inode_dirty()
5903 ext4_try_to_expand_extra_isize(inode, sbi->s_want_extra_isize, in __ext4_mark_inode_dirty()
5906 err = ext4_mark_iloc_dirty(handle, inode, &iloc); in __ext4_mark_inode_dirty()
5909 ext4_error_inode_err(inode, func, line, 0, err, in __ext4_mark_inode_dirty()
5932 void ext4_dirty_inode(struct inode *inode, int flags) in ext4_dirty_inode() argument
5938 handle = ext4_journal_start(inode, EXT4_HT_INODE, 2); in ext4_dirty_inode()
5942 ext4_mark_inode_dirty(handle, inode); in ext4_dirty_inode()
5949 int ext4_change_inode_journal_flag(struct inode *inode, int val) in ext4_change_inode_journal_flag() argument
5954 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_change_inode_journal_flag()
5966 journal = EXT4_JOURNAL(inode); in ext4_change_inode_journal_flag()
5973 inode_dio_wait(inode); in ext4_change_inode_journal_flag()
5984 down_write(&EXT4_I(inode)->i_mmap_sem); in ext4_change_inode_journal_flag()
5985 err = filemap_write_and_wait(inode->i_mapping); in ext4_change_inode_journal_flag()
5987 up_write(&EXT4_I(inode)->i_mmap_sem); in ext4_change_inode_journal_flag()
6004 ext4_set_inode_flag(inode, EXT4_INODE_JOURNAL_DATA); in ext4_change_inode_journal_flag()
6012 ext4_clear_inode_flag(inode, EXT4_INODE_JOURNAL_DATA); in ext4_change_inode_journal_flag()
6014 ext4_set_aops(inode); in ext4_change_inode_journal_flag()
6020 up_write(&EXT4_I(inode)->i_mmap_sem); in ext4_change_inode_journal_flag()
6024 handle = ext4_journal_start(inode, EXT4_HT_INODE, 1); in ext4_change_inode_journal_flag()
6028 ext4_fc_mark_ineligible(inode->i_sb, in ext4_change_inode_journal_flag()
6030 err = ext4_mark_inode_dirty(handle, inode); in ext4_change_inode_journal_flag()
6033 ext4_std_error(inode->i_sb, err); in ext4_change_inode_journal_flag()
6052 struct inode *inode = file_inode(file); in ext4_page_mkwrite() local
6053 struct address_space *mapping = inode->i_mapping; in ext4_page_mkwrite()
6058 if (unlikely(IS_IMMUTABLE(inode))) in ext4_page_mkwrite()
6061 sb_start_pagefault(inode->i_sb); in ext4_page_mkwrite()
6064 down_read(&EXT4_I(inode)->i_mmap_sem); in ext4_page_mkwrite()
6066 err = ext4_convert_inline_data(inode); in ext4_page_mkwrite()
6076 if (ext4_should_journal_data(inode)) in ext4_page_mkwrite()
6080 if (test_opt(inode->i_sb, DELALLOC) && in ext4_page_mkwrite()
6081 !ext4_nonda_switch(inode->i_sb)) { in ext4_page_mkwrite()
6086 ext4_should_retry_alloc(inode->i_sb, &retries)); in ext4_page_mkwrite()
6091 size = i_size_read(inode); in ext4_page_mkwrite()
6122 if (ext4_should_dioread_nolock(inode)) in ext4_page_mkwrite()
6127 handle = ext4_journal_start(inode, EXT4_HT_WRITE_PAGE, in ext4_page_mkwrite()
6128 ext4_writepage_trans_blocks(inode)); in ext4_page_mkwrite()
6138 if (!ext4_should_journal_data(inode)) { in ext4_page_mkwrite()
6142 size = i_size_read(inode); in ext4_page_mkwrite()
6163 if (ext4_jbd2_inode_add_write(handle, inode, in ext4_page_mkwrite()
6166 ext4_set_inode_state(inode, EXT4_STATE_JDATA); in ext4_page_mkwrite()
6172 if (err == -ENOSPC && ext4_should_retry_alloc(inode->i_sb, &retries)) in ext4_page_mkwrite()
6177 up_read(&EXT4_I(inode)->i_mmap_sem); in ext4_page_mkwrite()
6178 sb_end_pagefault(inode->i_sb); in ext4_page_mkwrite()
6188 struct inode *inode = file_inode(vmf->vma->vm_file); in ext4_filemap_fault() local
6191 down_read(&EXT4_I(inode)->i_mmap_sem); in ext4_filemap_fault()
6193 up_read(&EXT4_I(inode)->i_mmap_sem); in ext4_filemap_fault()