Lines Matching refs:inode

52 static __u32 ext4_inode_csum(struct inode *inode, struct ext4_inode *raw,  in ext4_inode_csum()  argument
55 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_inode_csum()
67 if (EXT4_INODE_SIZE(inode->i_sb) > EXT4_GOOD_OLD_INODE_SIZE) { in ext4_inode_csum()
78 EXT4_INODE_SIZE(inode->i_sb) - offset); in ext4_inode_csum()
84 static int ext4_inode_csum_verify(struct inode *inode, struct ext4_inode *raw, in ext4_inode_csum_verify() argument
89 if (EXT4_SB(inode->i_sb)->s_es->s_creator_os != in ext4_inode_csum_verify()
91 !ext4_has_metadata_csum(inode->i_sb)) in ext4_inode_csum_verify()
95 calculated = ext4_inode_csum(inode, raw, ei); in ext4_inode_csum_verify()
96 if (EXT4_INODE_SIZE(inode->i_sb) > EXT4_GOOD_OLD_INODE_SIZE && in ext4_inode_csum_verify()
105 void ext4_inode_csum_set(struct inode *inode, struct ext4_inode *raw, in ext4_inode_csum_set() argument
110 if (EXT4_SB(inode->i_sb)->s_es->s_creator_os != in ext4_inode_csum_set()
112 !ext4_has_metadata_csum(inode->i_sb)) in ext4_inode_csum_set()
115 csum = ext4_inode_csum(inode, raw, ei); in ext4_inode_csum_set()
117 if (EXT4_INODE_SIZE(inode->i_sb) > EXT4_GOOD_OLD_INODE_SIZE && in ext4_inode_csum_set()
122 static inline int ext4_begin_ordered_truncate(struct inode *inode, in ext4_begin_ordered_truncate() argument
125 trace_ext4_begin_ordered_truncate(inode, new_size); in ext4_begin_ordered_truncate()
132 if (!EXT4_I(inode)->jinode) in ext4_begin_ordered_truncate()
134 return jbd2_journal_begin_ordered_truncate(EXT4_JOURNAL(inode), in ext4_begin_ordered_truncate()
135 EXT4_I(inode)->jinode, in ext4_begin_ordered_truncate()
143 static int ext4_meta_trans_blocks(struct inode *inode, int lblocks,
150 int ext4_inode_is_fast_symlink(struct inode *inode) in ext4_inode_is_fast_symlink() argument
152 if (!(EXT4_I(inode)->i_flags & EXT4_EA_INODE_FL)) { in ext4_inode_is_fast_symlink()
153 int ea_blocks = EXT4_I(inode)->i_file_acl ? in ext4_inode_is_fast_symlink()
154 EXT4_CLUSTER_SIZE(inode->i_sb) >> 9 : 0; in ext4_inode_is_fast_symlink()
156 if (ext4_has_inline_data(inode)) in ext4_inode_is_fast_symlink()
159 return (S_ISLNK(inode->i_mode) && inode->i_blocks - ea_blocks == 0); in ext4_inode_is_fast_symlink()
161 return S_ISLNK(inode->i_mode) && inode->i_size && in ext4_inode_is_fast_symlink()
162 (inode->i_size < EXT4_N_BLOCKS * 4); in ext4_inode_is_fast_symlink()
168 void ext4_evict_inode(struct inode *inode) in ext4_evict_inode() argument
181 trace_ext4_evict_inode(inode); in ext4_evict_inode()
183 if (inode->i_nlink) { in ext4_evict_inode()
202 if (inode->i_ino != EXT4_JOURNAL_INO && in ext4_evict_inode()
203 ext4_should_journal_data(inode) && in ext4_evict_inode()
204 (S_ISLNK(inode->i_mode) || S_ISREG(inode->i_mode)) && in ext4_evict_inode()
205 inode->i_data.nrpages) { in ext4_evict_inode()
206 journal_t *journal = EXT4_SB(inode->i_sb)->s_journal; in ext4_evict_inode()
207 tid_t commit_tid = EXT4_I(inode)->i_datasync_tid; in ext4_evict_inode()
210 filemap_write_and_wait(&inode->i_data); in ext4_evict_inode()
212 truncate_inode_pages_final(&inode->i_data); in ext4_evict_inode()
217 if (is_bad_inode(inode)) in ext4_evict_inode()
219 dquot_initialize(inode); in ext4_evict_inode()
221 if (ext4_should_order_data(inode)) in ext4_evict_inode()
222 ext4_begin_ordered_truncate(inode, 0); in ext4_evict_inode()
223 truncate_inode_pages_final(&inode->i_data); in ext4_evict_inode()
230 if (!list_empty_careful(&inode->i_io_list)) { in ext4_evict_inode()
231 WARN_ON_ONCE(!ext4_should_journal_data(inode)); in ext4_evict_inode()
232 inode_io_list_del(inode); in ext4_evict_inode()
242 sb_start_intwrite(inode->i_sb); in ext4_evict_inode()
246 if (!IS_NOQUOTA(inode)) in ext4_evict_inode()
247 extra_credits += EXT4_MAXQUOTAS_DEL_BLOCKS(inode->i_sb); in ext4_evict_inode()
253 handle = ext4_journal_start(inode, EXT4_HT_TRUNCATE, in ext4_evict_inode()
254 ext4_blocks_for_truncate(inode) + extra_credits - 3); in ext4_evict_inode()
256 ext4_std_error(inode->i_sb, PTR_ERR(handle)); in ext4_evict_inode()
262 ext4_orphan_del(NULL, inode); in ext4_evict_inode()
264 sb_end_intwrite(inode->i_sb); in ext4_evict_inode()
268 if (IS_SYNC(inode)) in ext4_evict_inode()
278 if (ext4_inode_is_fast_symlink(inode)) in ext4_evict_inode()
279 memset(EXT4_I(inode)->i_data, 0, sizeof(EXT4_I(inode)->i_data)); in ext4_evict_inode()
280 inode->i_size = 0; in ext4_evict_inode()
281 err = ext4_mark_inode_dirty(handle, inode); in ext4_evict_inode()
283 ext4_warning(inode->i_sb, in ext4_evict_inode()
287 if (inode->i_blocks) { in ext4_evict_inode()
288 err = ext4_truncate(inode); in ext4_evict_inode()
290 ext4_error_err(inode->i_sb, -err, in ext4_evict_inode()
292 inode->i_ino, err); in ext4_evict_inode()
298 err = ext4_xattr_delete_inode(handle, inode, &ea_inode_array, in ext4_evict_inode()
301 ext4_warning(inode->i_sb, "xattr delete (err %d)", err); in ext4_evict_inode()
304 ext4_orphan_del(NULL, inode); in ext4_evict_inode()
306 sb_end_intwrite(inode->i_sb); in ext4_evict_inode()
319 ext4_orphan_del(handle, inode); in ext4_evict_inode()
320 EXT4_I(inode)->i_dtime = (__u32)ktime_get_real_seconds(); in ext4_evict_inode()
329 if (ext4_mark_inode_dirty(handle, inode)) in ext4_evict_inode()
331 ext4_clear_inode(inode); in ext4_evict_inode()
333 ext4_free_inode(handle, inode); in ext4_evict_inode()
336 sb_end_intwrite(inode->i_sb); in ext4_evict_inode()
340 if (!list_empty(&EXT4_I(inode)->i_fc_list)) in ext4_evict_inode()
341 ext4_fc_mark_ineligible(inode->i_sb, EXT4_FC_REASON_NOMEM); in ext4_evict_inode()
342 ext4_clear_inode(inode); /* We must guarantee clearing of inode... */ in ext4_evict_inode()
346 qsize_t *ext4_get_reserved_space(struct inode *inode) in ext4_get_reserved_space() argument
348 return &EXT4_I(inode)->i_reserved_quota; in ext4_get_reserved_space()
356 void ext4_da_update_reserve_space(struct inode *inode, in ext4_da_update_reserve_space() argument
359 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_da_update_reserve_space()
360 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_da_update_reserve_space()
363 trace_ext4_da_update_reserve_space(inode, used, quota_claim); in ext4_da_update_reserve_space()
365 ext4_warning(inode->i_sb, "%s: ino %lu, used %d " in ext4_da_update_reserve_space()
367 __func__, inode->i_ino, used, in ext4_da_update_reserve_space()
377 spin_unlock(&EXT4_I(inode)->i_block_reservation_lock); in ext4_da_update_reserve_space()
381 dquot_claim_block(inode, EXT4_C2B(sbi, used)); in ext4_da_update_reserve_space()
388 dquot_release_reservation_block(inode, EXT4_C2B(sbi, used)); in ext4_da_update_reserve_space()
397 !inode_is_open_for_write(inode)) in ext4_da_update_reserve_space()
398 ext4_discard_preallocations(inode, 0); in ext4_da_update_reserve_space()
401 static int __check_block_validity(struct inode *inode, const char *func, in __check_block_validity() argument
405 if (ext4_has_feature_journal(inode->i_sb) && in __check_block_validity()
406 (inode->i_ino == in __check_block_validity()
407 le32_to_cpu(EXT4_SB(inode->i_sb)->s_es->s_journal_inum))) in __check_block_validity()
409 if (!ext4_inode_block_valid(inode, map->m_pblk, map->m_len)) { in __check_block_validity()
410 ext4_error_inode(inode, func, line, map->m_pblk, in __check_block_validity()
419 int ext4_issue_zeroout(struct inode *inode, ext4_lblk_t lblk, ext4_fsblk_t pblk, in ext4_issue_zeroout() argument
424 if (IS_ENCRYPTED(inode) && S_ISREG(inode->i_mode)) in ext4_issue_zeroout()
425 return fscrypt_zeroout_range(inode, lblk, pblk, len); in ext4_issue_zeroout()
427 ret = sb_issue_zeroout(inode->i_sb, pblk, len, GFP_NOFS); in ext4_issue_zeroout()
434 #define check_block_validity(inode, map) \ argument
435 __check_block_validity((inode), __func__, __LINE__, (map))
439 struct inode *inode, in ext4_map_blocks_es_recheck() argument
454 down_read(&EXT4_I(inode)->i_data_sem); in ext4_map_blocks_es_recheck()
455 if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) { in ext4_map_blocks_es_recheck()
456 retval = ext4_ext_map_blocks(handle, inode, map, 0); in ext4_map_blocks_es_recheck()
458 retval = ext4_ind_map_blocks(handle, inode, map, 0); in ext4_map_blocks_es_recheck()
460 up_read((&EXT4_I(inode)->i_data_sem)); in ext4_map_blocks_es_recheck()
472 inode->i_ino, es_map->m_lblk, es_map->m_len, in ext4_map_blocks_es_recheck()
502 int ext4_map_blocks(handle_t *handle, struct inode *inode, in ext4_map_blocks() argument
515 ext_debug(inode, "flag 0x%x, max_blocks %u, logical block %lu\n", in ext4_map_blocks()
529 if (!(EXT4_SB(inode->i_sb)->s_mount_state & EXT4_FC_REPLAY) && in ext4_map_blocks()
530 ext4_es_lookup_extent(inode, map->m_lblk, NULL, &es)) { in ext4_map_blocks()
551 ext4_map_blocks_es_recheck(handle, inode, map, in ext4_map_blocks()
561 down_read(&EXT4_I(inode)->i_data_sem); in ext4_map_blocks()
562 if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) { in ext4_map_blocks()
563 retval = ext4_ext_map_blocks(handle, inode, map, 0); in ext4_map_blocks()
565 retval = ext4_ind_map_blocks(handle, inode, map, 0); in ext4_map_blocks()
571 ext4_warning(inode->i_sb, in ext4_map_blocks()
574 inode->i_ino, retval, map->m_len); in ext4_map_blocks()
582 ext4_es_scan_range(inode, &ext4_es_is_delayed, map->m_lblk, in ext4_map_blocks()
585 ret = ext4_es_insert_extent(inode, map->m_lblk, in ext4_map_blocks()
590 up_read((&EXT4_I(inode)->i_data_sem)); in ext4_map_blocks()
594 ret = check_block_validity(inode, map); in ext4_map_blocks()
631 down_write(&EXT4_I(inode)->i_data_sem); in ext4_map_blocks()
637 if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) { in ext4_map_blocks()
638 retval = ext4_ext_map_blocks(handle, inode, map, flags); in ext4_map_blocks()
640 retval = ext4_ind_map_blocks(handle, inode, map, flags); in ext4_map_blocks()
648 ext4_clear_inode_state(inode, EXT4_STATE_EXT_MIGRATE); in ext4_map_blocks()
659 ext4_da_update_reserve_space(inode, retval, 1); in ext4_map_blocks()
666 ext4_warning(inode->i_sb, in ext4_map_blocks()
669 inode->i_ino, retval, map->m_len); in ext4_map_blocks()
683 ret = ext4_issue_zeroout(inode, map->m_lblk, in ext4_map_blocks()
696 ext4_es_lookup_extent(inode, map->m_lblk, NULL, &es)) { in ext4_map_blocks()
704 ext4_es_scan_range(inode, &ext4_es_is_delayed, map->m_lblk, in ext4_map_blocks()
707 ret = ext4_es_insert_extent(inode, map->m_lblk, map->m_len, in ext4_map_blocks()
716 up_write((&EXT4_I(inode)->i_data_sem)); in ext4_map_blocks()
718 ret = check_block_validity(inode, map); in ext4_map_blocks()
730 !ext4_is_quota_file(inode) && in ext4_map_blocks()
731 ext4_should_order_data(inode)) { in ext4_map_blocks()
733 (loff_t)map->m_lblk << inode->i_blkbits; in ext4_map_blocks()
734 loff_t length = (loff_t)map->m_len << inode->i_blkbits; in ext4_map_blocks()
737 ret = ext4_jbd2_inode_add_wait(handle, inode, in ext4_map_blocks()
740 ret = ext4_jbd2_inode_add_write(handle, inode, in ext4_map_blocks()
748 ext4_fc_track_range(handle, inode, map->m_lblk, in ext4_map_blocks()
751 ext_debug(inode, "failed with err %d\n", retval); in ext4_map_blocks()
783 static int _ext4_get_block(struct inode *inode, sector_t iblock, in _ext4_get_block() argument
789 if (ext4_has_inline_data(inode)) in _ext4_get_block()
793 map.m_len = bh->b_size >> inode->i_blkbits; in _ext4_get_block()
795 ret = ext4_map_blocks(ext4_journal_current_handle(), inode, &map, in _ext4_get_block()
798 map_bh(bh, inode->i_sb, map.m_pblk); in _ext4_get_block()
800 bh->b_size = inode->i_sb->s_blocksize * map.m_len; in _ext4_get_block()
804 bh->b_size = inode->i_sb->s_blocksize * map.m_len; in _ext4_get_block()
809 int ext4_get_block(struct inode *inode, sector_t iblock, in ext4_get_block() argument
812 return _ext4_get_block(inode, iblock, bh, in ext4_get_block()
821 int ext4_get_block_unwritten(struct inode *inode, sector_t iblock, in ext4_get_block_unwritten() argument
825 inode->i_ino, create); in ext4_get_block_unwritten()
826 return _ext4_get_block(inode, iblock, bh_result, in ext4_get_block_unwritten()
836 struct buffer_head *ext4_getblk(handle_t *handle, struct inode *inode, in ext4_getblk() argument
844 J_ASSERT((EXT4_SB(inode->i_sb)->s_mount_state & EXT4_FC_REPLAY) in ext4_getblk()
849 err = ext4_map_blocks(handle, inode, &map, map_flags); in ext4_getblk()
856 bh = sb_getblk(inode->i_sb, map.m_pblk); in ext4_getblk()
861 J_ASSERT((EXT4_SB(inode->i_sb)->s_mount_state & EXT4_FC_REPLAY) in ext4_getblk()
879 memset(bh->b_data, 0, inode->i_sb->s_blocksize); in ext4_getblk()
884 err = ext4_handle_dirty_metadata(handle, inode, bh); in ext4_getblk()
895 struct buffer_head *ext4_bread(handle_t *handle, struct inode *inode, in ext4_bread() argument
901 bh = ext4_getblk(handle, inode, block, map_flags); in ext4_bread()
916 int ext4_bread_batch(struct inode *inode, ext4_lblk_t block, int bh_count, in ext4_bread_batch() argument
922 bhs[i] = ext4_getblk(NULL, inode, block + i, 0 /* map_flags */); in ext4_bread_batch()
1044 struct inode *inode = page->mapping->host; in ext4_block_write_begin() local
1048 unsigned blocksize = inode->i_sb->s_blocksize; in ext4_block_write_begin()
1079 err = get_block(inode, block, bh, 1); in ext4_block_write_begin()
1117 } else if (fscrypt_inode_uses_fs_layer_crypto(inode)) { in ext4_block_write_begin()
1138 struct inode *inode = mapping->host; in ext4_write_begin() local
1146 if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb)))) in ext4_write_begin()
1154 inode); in ext4_write_begin()
1155 trace_android_fs_datawrite_start(inode, pos, len, in ext4_write_begin()
1159 trace_ext4_write_begin(inode, pos, len, flags); in ext4_write_begin()
1164 needed_blocks = ext4_writepage_trans_blocks(inode) + 1; in ext4_write_begin()
1169 if (ext4_test_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA)) { in ext4_write_begin()
1170 ret = ext4_try_to_write_inline_data(mapping, inode, pos, len, in ext4_write_begin()
1194 create_empty_buffers(page, inode->i_sb->s_blocksize, 0); in ext4_write_begin()
1199 handle = ext4_journal_start(inode, EXT4_HT_WRITE_PAGE, needed_blocks); in ext4_write_begin()
1217 if (ext4_should_dioread_nolock(inode)) in ext4_write_begin()
1224 if (ext4_should_dioread_nolock(inode)) in ext4_write_begin()
1230 if (!ret && ext4_should_journal_data(inode)) { in ext4_write_begin()
1237 bool extended = (pos + len > inode->i_size) && in ext4_write_begin()
1238 !ext4_verity_in_progress(inode); in ext4_write_begin()
1249 if (extended && ext4_can_truncate(inode)) in ext4_write_begin()
1250 ext4_orphan_add(handle, inode); in ext4_write_begin()
1254 ext4_truncate_failed_write(inode); in ext4_write_begin()
1261 if (inode->i_nlink) in ext4_write_begin()
1262 ext4_orphan_del(NULL, inode); in ext4_write_begin()
1266 ext4_should_retry_alloc(inode->i_sb, &retries)) in ext4_write_begin()
1301 struct inode *inode = mapping->host; in ext4_write_end() local
1302 loff_t old_size = inode->i_size; in ext4_write_end()
1305 int inline_data = ext4_has_inline_data(inode); in ext4_write_end()
1306 bool verity = ext4_verity_in_progress(inode); in ext4_write_end()
1308 trace_android_fs_datawrite_end(inode, pos, len); in ext4_write_end()
1309 trace_ext4_write_end(inode, pos, len, copied); in ext4_write_end()
1311 ret = ext4_write_inline_data_end(inode, pos, len, in ext4_write_end()
1331 i_size_changed = ext4_update_inode_size(inode, pos + copied); in ext4_write_end()
1336 pagecache_isize_extended(inode, old_size, pos); in ext4_write_end()
1344 ret = ext4_mark_inode_dirty(handle, inode); in ext4_write_end()
1347 if (pos + len > inode->i_size && !verity && ext4_can_truncate(inode)) in ext4_write_end()
1352 ext4_orphan_add(handle, inode); in ext4_write_end()
1358 if (pos + len > inode->i_size && !verity) { in ext4_write_end()
1359 ext4_truncate_failed_write(inode); in ext4_write_end()
1365 if (inode->i_nlink) in ext4_write_end()
1366 ext4_orphan_del(NULL, inode); in ext4_write_end()
1412 struct inode *inode = mapping->host; in ext4_journalled_write_end() local
1413 loff_t old_size = inode->i_size; in ext4_journalled_write_end()
1418 int inline_data = ext4_has_inline_data(inode); in ext4_journalled_write_end()
1419 bool verity = ext4_verity_in_progress(inode); in ext4_journalled_write_end()
1421 trace_android_fs_datawrite_end(inode, pos, len); in ext4_journalled_write_end()
1422 trace_ext4_journalled_write_end(inode, pos, len, copied); in ext4_journalled_write_end()
1429 ret = ext4_write_inline_data_end(inode, pos, len, in ext4_journalled_write_end()
1452 size_changed = ext4_update_inode_size(inode, pos + copied); in ext4_journalled_write_end()
1453 ext4_set_inode_state(inode, EXT4_STATE_JDATA); in ext4_journalled_write_end()
1454 EXT4_I(inode)->i_datasync_tid = handle->h_transaction->t_tid; in ext4_journalled_write_end()
1459 pagecache_isize_extended(inode, old_size, pos); in ext4_journalled_write_end()
1462 ret2 = ext4_mark_inode_dirty(handle, inode); in ext4_journalled_write_end()
1468 if (pos + len > inode->i_size && !verity && ext4_can_truncate(inode)) in ext4_journalled_write_end()
1473 ext4_orphan_add(handle, inode); in ext4_journalled_write_end()
1478 if (pos + len > inode->i_size && !verity) { in ext4_journalled_write_end()
1479 ext4_truncate_failed_write(inode); in ext4_journalled_write_end()
1485 if (inode->i_nlink) in ext4_journalled_write_end()
1486 ext4_orphan_del(NULL, inode); in ext4_journalled_write_end()
1495 static int ext4_da_reserve_space(struct inode *inode) in ext4_da_reserve_space() argument
1497 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_da_reserve_space()
1498 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_da_reserve_space()
1506 ret = dquot_reserve_block(inode, EXT4_C2B(sbi, 1)); in ext4_da_reserve_space()
1513 dquot_release_reservation_block(inode, EXT4_C2B(sbi, 1)); in ext4_da_reserve_space()
1517 trace_ext4_da_reserve_space(inode); in ext4_da_reserve_space()
1523 void ext4_da_release_space(struct inode *inode, int to_free) in ext4_da_release_space() argument
1525 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_da_release_space()
1526 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_da_release_space()
1531 spin_lock(&EXT4_I(inode)->i_block_reservation_lock); in ext4_da_release_space()
1533 trace_ext4_da_release_space(inode, to_free); in ext4_da_release_space()
1541 ext4_warning(inode->i_sb, "ext4_da_release_space: " in ext4_da_release_space()
1543 "data blocks", inode->i_ino, to_free, in ext4_da_release_space()
1553 spin_unlock(&EXT4_I(inode)->i_block_reservation_lock); in ext4_da_release_space()
1555 dquot_release_reservation_block(inode, EXT4_C2B(sbi, to_free)); in ext4_da_release_space()
1563 struct inode *inode; member
1586 struct inode *inode = mpd->inode; in mpage_release_unused_pages() local
1587 struct address_space *mapping = inode->i_mapping; in mpage_release_unused_pages()
1598 start = index << (PAGE_SHIFT - inode->i_blkbits); in mpage_release_unused_pages()
1599 last = end << (PAGE_SHIFT - inode->i_blkbits); in mpage_release_unused_pages()
1605 down_write(&EXT4_I(inode)->i_data_sem); in mpage_release_unused_pages()
1606 ext4_es_remove_extent(inode, start, last - start + 1); in mpage_release_unused_pages()
1607 up_write(&EXT4_I(inode)->i_data_sem); in mpage_release_unused_pages()
1632 static void ext4_print_free_blocks(struct inode *inode) in ext4_print_free_blocks() argument
1634 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_print_free_blocks()
1635 struct super_block *sb = inode->i_sb; in ext4_print_free_blocks()
1636 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_print_free_blocks()
1639 EXT4_C2B(EXT4_SB(inode->i_sb), in ext4_print_free_blocks()
1670 static int ext4_insert_delayed_block(struct inode *inode, ext4_lblk_t lblk) in ext4_insert_delayed_block() argument
1672 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_insert_delayed_block()
1689 ret = ext4_da_reserve_space(inode); in ext4_insert_delayed_block()
1694 if (!ext4_es_scan_clu(inode, &ext4_es_is_delonly, lblk)) { in ext4_insert_delayed_block()
1695 if (!ext4_es_scan_clu(inode, in ext4_insert_delayed_block()
1697 ret = ext4_clu_mapped(inode, in ext4_insert_delayed_block()
1702 ret = ext4_da_reserve_space(inode); in ext4_insert_delayed_block()
1715 ret = ext4_es_insert_delayed_block(inode, lblk, allocated); in ext4_insert_delayed_block()
1717 ext4_da_release_space(inode, 1); in ext4_insert_delayed_block()
1729 static int ext4_da_map_blocks(struct inode *inode, sector_t iblock, in ext4_da_map_blocks() argument
1742 if (invalid_block < ext4_blocks_count(EXT4_SB(inode->i_sb)->s_es)) in ext4_da_map_blocks()
1746 ext_debug(inode, "max_blocks %u, logical block %lu\n", map->m_len, in ext4_da_map_blocks()
1750 if (ext4_es_lookup_extent(inode, iblock, NULL, &es)) { in ext4_da_map_blocks()
1753 down_read(&EXT4_I(inode)->i_data_sem); in ext4_da_map_blocks()
1762 map_bh(bh, inode->i_sb, invalid_block); in ext4_da_map_blocks()
1781 ext4_map_blocks_es_recheck(NULL, inode, map, &orig_map, 0); in ext4_da_map_blocks()
1790 down_read(&EXT4_I(inode)->i_data_sem); in ext4_da_map_blocks()
1791 if (ext4_has_inline_data(inode)) in ext4_da_map_blocks()
1793 else if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) in ext4_da_map_blocks()
1794 retval = ext4_ext_map_blocks(NULL, inode, map, 0); in ext4_da_map_blocks()
1796 retval = ext4_ind_map_blocks(NULL, inode, map, 0); in ext4_da_map_blocks()
1807 ret = ext4_insert_delayed_block(inode, map->m_lblk); in ext4_da_map_blocks()
1813 map_bh(bh, inode->i_sb, invalid_block); in ext4_da_map_blocks()
1821 ext4_warning(inode->i_sb, in ext4_da_map_blocks()
1824 inode->i_ino, retval, map->m_len); in ext4_da_map_blocks()
1830 ret = ext4_es_insert_extent(inode, map->m_lblk, map->m_len, in ext4_da_map_blocks()
1837 up_read((&EXT4_I(inode)->i_data_sem)); in ext4_da_map_blocks()
1854 int ext4_da_get_block_prep(struct inode *inode, sector_t iblock, in ext4_da_get_block_prep() argument
1861 BUG_ON(bh->b_size != inode->i_sb->s_blocksize); in ext4_da_get_block_prep()
1871 ret = ext4_da_map_blocks(inode, iblock, &map, bh); in ext4_da_get_block_prep()
1875 map_bh(bh, inode->i_sb, map.m_pblk); in ext4_da_get_block_prep()
1907 struct inode *inode = mapping->host; in __ext4_journalled_writepage() local
1911 int inline_data = ext4_has_inline_data(inode); in __ext4_journalled_writepage()
1918 BUG_ON(len > ext4_get_max_inline_size(inode)); in __ext4_journalled_writepage()
1919 inode_bh = ext4_journalled_write_inline_data(inode, len, page); in __ext4_journalled_writepage()
1939 handle = ext4_journal_start(inode, EXT4_HT_WRITE_PAGE, in __ext4_journalled_writepage()
1940 ext4_writepage_trans_blocks(inode)); in __ext4_journalled_writepage()
1958 ret = ext4_mark_inode_dirty(handle, inode); in __ext4_journalled_writepage()
1968 err = ext4_jbd2_inode_add_write(handle, inode, page_offset(page), len); in __ext4_journalled_writepage()
1971 EXT4_I(inode)->i_datasync_tid = handle->h_transaction->t_tid; in __ext4_journalled_writepage()
1976 ext4_set_inode_state(inode, EXT4_STATE_JDATA); in __ext4_journalled_writepage()
2035 struct inode *inode = page->mapping->host; in ext4_writepage() local
2039 if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb)))) { in ext4_writepage()
2040 inode->i_mapping->a_ops->invalidatepage(page, 0, PAGE_SIZE); in ext4_writepage()
2046 size = i_size_read(inode); in ext4_writepage()
2048 !ext4_verity_in_progress(inode)) in ext4_writepage()
2055 ext4_warning_inode(inode, in ext4_writepage()
2084 (inode->i_sb->s_blocksize == PAGE_SIZE)) { in ext4_writepage()
2098 if (PageChecked(page) && ext4_should_journal_data(inode)) in ext4_writepage()
2106 io_submit.io_end = ext4_init_io_end(inode, GFP_NOFS); in ext4_writepage()
2140 size = i_size_read(mpd->inode); in mpage_submit_page()
2142 !ext4_verity_in_progress(mpd->inode)) in mpage_submit_page()
2236 struct inode *inode = mpd->inode; in mpage_process_page_bufs() local
2238 ext4_lblk_t blocks = (i_size_read(inode) + i_blocksize(inode) - 1) in mpage_process_page_bufs()
2239 >> inode->i_blkbits; in mpage_process_page_bufs()
2241 if (ext4_verity_in_progress(inode)) in mpage_process_page_bufs()
2295 int blkbits = mpd->inode->i_blkbits; in mpage_process_page()
2362 struct inode *inode = mpd->inode; in mpage_map_and_submit_buffers() local
2363 int bpp_bits = PAGE_SHIFT - inode->i_blkbits; in mpage_map_and_submit_buffers()
2377 nr_pages = pagevec_lookup_range(&pvec, inode->i_mapping, in mpage_map_and_submit_buffers()
2411 struct inode *inode = mpd->inode; in mpage_map_one_extent() local
2416 trace_ext4_da_write_pages_extent(inode, map); in mpage_map_one_extent()
2435 dioread_nolock = ext4_should_dioread_nolock(inode); in mpage_map_one_extent()
2441 err = ext4_map_blocks(handle, inode, map, get_blocks_flags); in mpage_map_one_extent()
2450 ext4_set_io_unwritten_flag(inode, mpd->io_submit.io_end); in mpage_map_one_extent()
2481 struct inode *inode = mpd->inode; in mpage_map_and_submit_extent() local
2492 io_end_vec->offset = ((loff_t)map->m_lblk) << inode->i_blkbits; in mpage_map_and_submit_extent()
2496 struct super_block *sb = inode->i_sb; in mpage_map_and_submit_extent()
2516 inode->i_ino, in mpage_map_and_submit_extent()
2523 ext4_print_free_blocks(inode); in mpage_map_and_submit_extent()
2544 if (disksize > READ_ONCE(EXT4_I(inode)->i_disksize)) { in mpage_map_and_submit_extent()
2548 down_write(&EXT4_I(inode)->i_data_sem); in mpage_map_and_submit_extent()
2549 i_size = i_size_read(inode); in mpage_map_and_submit_extent()
2552 if (disksize > EXT4_I(inode)->i_disksize) in mpage_map_and_submit_extent()
2553 EXT4_I(inode)->i_disksize = disksize; in mpage_map_and_submit_extent()
2554 up_write(&EXT4_I(inode)->i_data_sem); in mpage_map_and_submit_extent()
2555 err2 = ext4_mark_inode_dirty(handle, inode); in mpage_map_and_submit_extent()
2557 ext4_error_err(inode->i_sb, -err2, in mpage_map_and_submit_extent()
2559 inode->i_ino); in mpage_map_and_submit_extent()
2574 static int ext4_da_writepages_trans_blocks(struct inode *inode) in ext4_da_writepages_trans_blocks() argument
2576 int bpp = ext4_journal_blocks_per_page(inode); in ext4_da_writepages_trans_blocks()
2578 return ext4_meta_trans_blocks(inode, in ext4_da_writepages_trans_blocks()
2602 struct address_space *mapping = mpd->inode->i_mapping; in mpage_prepare_extent_to_map()
2610 int blkbits = mpd->inode->i_blkbits; in mpage_prepare_extent_to_map()
2675 ext4_warning_inode(mpd->inode, "page %lu does not have buffers attached", page->index); in mpage_prepare_extent_to_map()
2713 struct inode *inode = mapping->host; in ext4_writepages() local
2719 if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb)))) in ext4_writepages()
2723 trace_ext4_writepages(inode, wbc); in ext4_writepages()
2733 if (ext4_should_journal_data(inode)) { in ext4_writepages()
2749 ext4_test_mount_flag(inode->i_sb, EXT4_MF_FS_ABORTED))) { in ext4_writepages()
2759 if (ext4_has_inline_data(inode)) { in ext4_writepages()
2761 handle = ext4_journal_start(inode, EXT4_HT_INODE, 1); in ext4_writepages()
2766 BUG_ON(ext4_test_inode_state(inode, in ext4_writepages()
2768 ext4_destroy_inline_data(handle, inode); in ext4_writepages()
2772 if (ext4_should_dioread_nolock(inode)) { in ext4_writepages()
2777 rsv_blocks = 1 + ext4_chunk_trans_blocks(inode, in ext4_writepages()
2778 PAGE_SIZE >> inode->i_blkbits); in ext4_writepages()
2795 mpd.inode = inode; in ext4_writepages()
2811 mpd.io_submit.io_end = ext4_init_io_end(inode, GFP_KERNEL); in ext4_writepages()
2828 mpd.io_submit.io_end = ext4_init_io_end(inode, GFP_KERNEL); in ext4_writepages()
2841 BUG_ON(ext4_should_journal_data(inode)); in ext4_writepages()
2842 needed_blocks = ext4_da_writepages_trans_blocks(inode); in ext4_writepages()
2845 handle = ext4_journal_start_with_reserve(inode, in ext4_writepages()
2849 ext4_msg(inode->i_sb, KERN_CRIT, "%s: jbd2_start: " in ext4_writepages()
2851 wbc->nr_to_write, inode->i_ino, ret); in ext4_writepages()
2859 trace_ext4_da_write_pages(inode, mpd.first_page, mpd.wbc); in ext4_writepages()
2930 trace_ext4_writepages_result(inode, wbc, ret, in ext4_writepages()
2941 struct inode *inode = mapping->host; in ext4_dax_writepages() local
2944 if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb)))) in ext4_dax_writepages()
2948 trace_ext4_writepages(inode, wbc); in ext4_dax_writepages()
2951 trace_ext4_writepages_result(inode, wbc, ret, in ext4_dax_writepages()
2992 static int ext4_da_write_credits(struct inode *inode, loff_t pos, unsigned len) in ext4_da_write_credits() argument
2994 if (likely(ext4_has_feature_large_file(inode->i_sb))) in ext4_da_write_credits()
3011 struct inode *inode = mapping->host; in ext4_da_write_begin() local
3014 if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb)))) in ext4_da_write_begin()
3019 if (ext4_nonda_switch(inode->i_sb) || S_ISLNK(inode->i_mode) || in ext4_da_write_begin()
3020 ext4_verity_in_progress(inode)) { in ext4_da_write_begin()
3031 inode); in ext4_da_write_begin()
3032 trace_android_fs_datawrite_start(inode, pos, len, in ext4_da_write_begin()
3036 trace_ext4_da_write_begin(inode, pos, len, flags); in ext4_da_write_begin()
3038 if (ext4_test_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA)) { in ext4_da_write_begin()
3039 ret = ext4_da_write_inline_data_begin(mapping, inode, in ext4_da_write_begin()
3068 handle = ext4_journal_start(inode, EXT4_HT_WRITE_PAGE, in ext4_da_write_begin()
3069 ext4_da_write_credits(inode, pos, len)); in ext4_da_write_begin()
3100 if (pos + len > inode->i_size) in ext4_da_write_begin()
3101 ext4_truncate_failed_write(inode); in ext4_da_write_begin()
3104 ext4_should_retry_alloc(inode->i_sb, &retries)) in ext4_da_write_begin()
3123 struct inode *inode = page->mapping->host; in ext4_da_should_update_i_disksize() local
3128 idx = offset >> inode->i_blkbits; in ext4_da_should_update_i_disksize()
3143 struct inode *inode = mapping->host; in ext4_da_write_end() local
3154 trace_android_fs_datawrite_end(inode, pos, len); in ext4_da_write_end()
3155 trace_ext4_da_write_end(inode, pos, len, copied); in ext4_da_write_end()
3175 if (copied && new_i_size > inode->i_size) { in ext4_da_write_end()
3176 if (ext4_has_inline_data(inode) || in ext4_da_write_end()
3178 ext4_update_i_disksize(inode, new_i_size); in ext4_da_write_end()
3182 ext4_test_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA) && in ext4_da_write_end()
3183 ext4_has_inline_data(inode)) in ext4_da_write_end()
3184 ret = ext4_da_write_inline_data_end(inode, pos, len, copied, in ext4_da_write_end()
3201 int ext4_alloc_da_blocks(struct inode *inode) in ext4_alloc_da_blocks() argument
3203 trace_ext4_alloc_da_blocks(inode); in ext4_alloc_da_blocks()
3205 if (!EXT4_I(inode)->i_reserved_data_blocks) in ext4_alloc_da_blocks()
3239 return filemap_flush(inode->i_mapping); in ext4_alloc_da_blocks()
3258 struct inode *inode = mapping->host; in ext4_bmap() local
3263 inode_lock_shared(inode); in ext4_bmap()
3267 if (ext4_has_inline_data(inode)) in ext4_bmap()
3271 test_opt(inode->i_sb, DELALLOC)) { in ext4_bmap()
3280 if (EXT4_JOURNAL(inode) && in ext4_bmap()
3281 ext4_test_inode_state(inode, EXT4_STATE_JDATA)) { in ext4_bmap()
3300 ext4_clear_inode_state(inode, EXT4_STATE_JDATA); in ext4_bmap()
3301 journal = EXT4_JOURNAL(inode); in ext4_bmap()
3313 inode_unlock_shared(inode); in ext4_bmap()
3320 struct inode *inode = page->mapping->host; in ext4_readpage() local
3324 if (ext4_has_inline_data(inode)) in ext4_readpage()
3325 ret = ext4_readpage_inline(inode, page); in ext4_readpage()
3328 return ext4_mpage_readpages(inode, NULL, page); in ext4_readpage()
3335 struct inode *inode = rac->mapping->host; in ext4_readahead() local
3338 if (ext4_has_inline_data(inode)) in ext4_readahead()
3341 ext4_mpage_readpages(inode, rac, NULL); in ext4_readahead()
3395 static bool ext4_inode_datasync_dirty(struct inode *inode) in ext4_inode_datasync_dirty() argument
3397 journal_t *journal = EXT4_SB(inode->i_sb)->s_journal; in ext4_inode_datasync_dirty()
3401 EXT4_I(inode)->i_datasync_tid)) in ext4_inode_datasync_dirty()
3403 if (test_opt2(inode->i_sb, JOURNAL_FAST_COMMIT)) in ext4_inode_datasync_dirty()
3404 return !list_empty(&EXT4_I(inode)->i_fc_list); in ext4_inode_datasync_dirty()
3409 if (!list_empty(&inode->i_mapping->private_list)) in ext4_inode_datasync_dirty()
3411 return inode->i_state & I_DIRTY_DATASYNC; in ext4_inode_datasync_dirty()
3414 static void ext4_set_iomap(struct inode *inode, struct iomap *iomap, in ext4_set_iomap() argument
3418 u8 blkbits = inode->i_blkbits; in ext4_set_iomap()
3426 if (ext4_inode_datasync_dirty(inode) || in ext4_set_iomap()
3427 offset + length > i_size_read(inode)) in ext4_set_iomap()
3433 iomap->bdev = inode->i_sb->s_bdev; in ext4_set_iomap()
3434 iomap->dax_dev = EXT4_SB(inode->i_sb)->s_daxdev; in ext4_set_iomap()
3439 !ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) in ext4_set_iomap()
3463 static int ext4_iomap_alloc(struct inode *inode, struct ext4_map_blocks *map, in ext4_iomap_alloc() argument
3467 u8 blkbits = inode->i_blkbits; in ext4_iomap_alloc()
3476 dio_credits = ext4_chunk_trans_blocks(inode, map->m_len); in ext4_iomap_alloc()
3485 handle = ext4_journal_start(inode, EXT4_HT_MAP_BLOCKS, dio_credits); in ext4_iomap_alloc()
3493 WARN_ON(!IS_DAX(inode) && !(flags & IOMAP_DIRECT)); in ext4_iomap_alloc()
3494 if (IS_DAX(inode)) in ext4_iomap_alloc()
3502 else if (((loff_t)map->m_lblk << blkbits) >= i_size_read(inode)) in ext4_iomap_alloc()
3504 else if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) in ext4_iomap_alloc()
3507 ret = ext4_map_blocks(handle, inode, map, m_flags); in ext4_iomap_alloc()
3518 if (ret == -ENOSPC && ext4_should_retry_alloc(inode->i_sb, &retries)) in ext4_iomap_alloc()
3525 static int ext4_iomap_begin(struct inode *inode, loff_t offset, loff_t length, in ext4_iomap_begin() argument
3530 u8 blkbits = inode->i_blkbits; in ext4_iomap_begin()
3535 if (WARN_ON_ONCE(ext4_has_inline_data(inode))) in ext4_iomap_begin()
3552 if (offset + length <= i_size_read(inode)) { in ext4_iomap_begin()
3553 ret = ext4_map_blocks(NULL, inode, &map, 0); in ext4_iomap_begin()
3557 ret = ext4_iomap_alloc(inode, &map, flags); in ext4_iomap_begin()
3559 ret = ext4_map_blocks(NULL, inode, &map, 0); in ext4_iomap_begin()
3571 map.m_len = fscrypt_limit_io_blocks(inode, map.m_lblk, map.m_len); in ext4_iomap_begin()
3573 ext4_set_iomap(inode, iomap, &map, offset, length); in ext4_iomap_begin()
3578 static int ext4_iomap_overwrite_begin(struct inode *inode, loff_t offset, in ext4_iomap_overwrite_begin() argument
3589 ret = ext4_iomap_begin(inode, offset, length, flags, iomap, srcmap); in ext4_iomap_overwrite_begin()
3594 static int ext4_iomap_end(struct inode *inode, loff_t offset, loff_t length, in ext4_iomap_end() argument
3620 static bool ext4_iomap_is_delalloc(struct inode *inode, in ext4_iomap_is_delalloc() argument
3626 ext4_es_find_extent_range(inode, &ext4_es_is_delayed, in ext4_iomap_is_delalloc()
3643 static int ext4_iomap_begin_report(struct inode *inode, loff_t offset, in ext4_iomap_begin_report() argument
3650 u8 blkbits = inode->i_blkbits; in ext4_iomap_begin_report()
3655 if (ext4_has_inline_data(inode)) { in ext4_iomap_begin_report()
3656 ret = ext4_inline_data_iomap(inode, iomap); in ext4_iomap_begin_report()
3677 if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) { in ext4_iomap_begin_report()
3678 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_iomap_begin_report()
3686 ret = ext4_map_blocks(NULL, inode, &map, 0); in ext4_iomap_begin_report()
3690 delalloc = ext4_iomap_is_delalloc(inode, &map); in ext4_iomap_begin_report()
3693 ext4_set_iomap(inode, iomap, &map, offset, length); in ext4_iomap_begin_report()
3799 void ext4_set_aops(struct inode *inode) in ext4_set_aops() argument
3801 switch (ext4_inode_journal_mode(inode)) { in ext4_set_aops()
3806 inode->i_mapping->a_ops = &ext4_journalled_aops; in ext4_set_aops()
3811 if (IS_DAX(inode)) in ext4_set_aops()
3812 inode->i_mapping->a_ops = &ext4_dax_aops; in ext4_set_aops()
3813 else if (test_opt(inode->i_sb, DELALLOC)) in ext4_set_aops()
3814 inode->i_mapping->a_ops = &ext4_da_aops; in ext4_set_aops()
3816 inode->i_mapping->a_ops = &ext4_aops; in ext4_set_aops()
3826 struct inode *inode = mapping->host; in __ext4_block_zero_page_range() local
3836 blocksize = inode->i_sb->s_blocksize; in __ext4_block_zero_page_range()
3838 iblock = index << (PAGE_SHIFT - inode->i_sb->s_blocksize_bits); in __ext4_block_zero_page_range()
3857 ext4_get_block(inode, iblock, bh, 0); in __ext4_block_zero_page_range()
3873 if (fscrypt_inode_uses_fs_layer_crypto(inode)) { in __ext4_block_zero_page_range()
3875 BUG_ON(!fscrypt_has_encryption_key(inode)); in __ext4_block_zero_page_range()
3884 if (ext4_should_journal_data(inode)) { in __ext4_block_zero_page_range()
3893 if (ext4_should_journal_data(inode)) { in __ext4_block_zero_page_range()
3894 err = ext4_handle_dirty_metadata(handle, inode, bh); in __ext4_block_zero_page_range()
3898 if (ext4_should_order_data(inode)) in __ext4_block_zero_page_range()
3899 err = ext4_jbd2_inode_add_write(handle, inode, from, in __ext4_block_zero_page_range()
3919 struct inode *inode = mapping->host; in ext4_block_zero_page_range() local
3921 unsigned blocksize = inode->i_sb->s_blocksize; in ext4_block_zero_page_range()
3931 if (IS_DAX(inode)) { in ext4_block_zero_page_range()
3932 return iomap_zero_range(inode, from, length, NULL, in ext4_block_zero_page_range()
3950 struct inode *inode = mapping->host; in ext4_block_truncate_page() local
3953 if (IS_ENCRYPTED(inode) && !fscrypt_has_encryption_key(inode)) in ext4_block_truncate_page()
3956 blocksize = inode->i_sb->s_blocksize; in ext4_block_truncate_page()
3962 int ext4_zero_partial_blocks(handle_t *handle, struct inode *inode, in ext4_zero_partial_blocks() argument
3965 struct super_block *sb = inode->i_sb; in ext4_zero_partial_blocks()
3966 struct address_space *mapping = inode->i_mapping; in ext4_zero_partial_blocks()
4000 int ext4_can_truncate(struct inode *inode) in ext4_can_truncate() argument
4002 if (S_ISREG(inode->i_mode)) in ext4_can_truncate()
4004 if (S_ISDIR(inode->i_mode)) in ext4_can_truncate()
4006 if (S_ISLNK(inode->i_mode)) in ext4_can_truncate()
4007 return !ext4_inode_is_fast_symlink(inode); in ext4_can_truncate()
4017 int ext4_update_disksize_before_punch(struct inode *inode, loff_t offset, in ext4_update_disksize_before_punch() argument
4023 loff_t size = i_size_read(inode); in ext4_update_disksize_before_punch()
4025 WARN_ON(!inode_is_locked(inode)); in ext4_update_disksize_before_punch()
4029 if (EXT4_I(inode)->i_disksize >= size) in ext4_update_disksize_before_punch()
4032 handle = ext4_journal_start(inode, EXT4_HT_MISC, 1); in ext4_update_disksize_before_punch()
4035 ext4_update_i_disksize(inode, size); in ext4_update_disksize_before_punch()
4036 ret = ext4_mark_inode_dirty(handle, inode); in ext4_update_disksize_before_punch()
4049 int ext4_break_layouts(struct inode *inode) in ext4_break_layouts() argument
4051 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_break_layouts()
4059 page = dax_layout_busy_page(inode->i_mapping); in ext4_break_layouts()
4085 struct inode *inode = file_inode(file); in ext4_punch_hole() local
4086 struct super_block *sb = inode->i_sb; in ext4_punch_hole()
4088 struct address_space *mapping = inode->i_mapping; in ext4_punch_hole()
4090 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_punch_hole()
4095 trace_ext4_punch_hole(inode, offset, length, 0); in ext4_punch_hole()
4108 inode_lock(inode); in ext4_punch_hole()
4111 if (offset >= inode->i_size) in ext4_punch_hole()
4118 if (offset + length > inode->i_size) { in ext4_punch_hole()
4119 length = inode->i_size + in ext4_punch_hole()
4120 PAGE_SIZE - (inode->i_size & (PAGE_SIZE - 1)) - in ext4_punch_hole()
4128 max_length = sbi->s_bitmap_maxbytes - inode->i_sb->s_blocksize; in ext4_punch_hole()
4138 ret = ext4_inode_attach_jinode(inode); in ext4_punch_hole()
4145 inode_dio_wait(inode); in ext4_punch_hole()
4155 down_write(&EXT4_I(inode)->i_mmap_sem); in ext4_punch_hole()
4157 ret = ext4_break_layouts(inode); in ext4_punch_hole()
4166 ret = ext4_update_disksize_before_punch(inode, offset, length); in ext4_punch_hole()
4169 truncate_pagecache_range(inode, first_block_offset, in ext4_punch_hole()
4173 if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) in ext4_punch_hole()
4174 credits = ext4_writepage_trans_blocks(inode); in ext4_punch_hole()
4176 credits = ext4_blocks_for_truncate(inode); in ext4_punch_hole()
4177 handle = ext4_journal_start(inode, EXT4_HT_TRUNCATE, credits); in ext4_punch_hole()
4184 ret = ext4_zero_partial_blocks(handle, inode, offset, in ext4_punch_hole()
4196 down_write(&EXT4_I(inode)->i_data_sem); in ext4_punch_hole()
4197 ext4_discard_preallocations(inode, 0); in ext4_punch_hole()
4199 ret = ext4_es_remove_extent(inode, first_block, in ext4_punch_hole()
4202 up_write(&EXT4_I(inode)->i_data_sem); in ext4_punch_hole()
4206 if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) in ext4_punch_hole()
4207 ret = ext4_ext_remove_space(inode, first_block, in ext4_punch_hole()
4210 ret = ext4_ind_remove_space(handle, inode, first_block, in ext4_punch_hole()
4213 up_write(&EXT4_I(inode)->i_data_sem); in ext4_punch_hole()
4215 ext4_fc_track_range(handle, inode, first_block, stop_block); in ext4_punch_hole()
4216 if (IS_SYNC(inode)) in ext4_punch_hole()
4219 inode->i_mtime = inode->i_ctime = current_time(inode); in ext4_punch_hole()
4220 ret2 = ext4_mark_inode_dirty(handle, inode); in ext4_punch_hole()
4224 ext4_update_inode_fsync_trans(handle, inode, 1); in ext4_punch_hole()
4228 up_write(&EXT4_I(inode)->i_mmap_sem); in ext4_punch_hole()
4230 inode_unlock(inode); in ext4_punch_hole()
4234 int ext4_inode_attach_jinode(struct inode *inode) in ext4_inode_attach_jinode() argument
4236 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_inode_attach_jinode()
4239 if (ei->jinode || !EXT4_SB(inode->i_sb)->s_journal) in ext4_inode_attach_jinode()
4243 spin_lock(&inode->i_lock); in ext4_inode_attach_jinode()
4246 spin_unlock(&inode->i_lock); in ext4_inode_attach_jinode()
4250 jbd2_journal_init_jbd_inode(ei->jinode, inode); in ext4_inode_attach_jinode()
4253 spin_unlock(&inode->i_lock); in ext4_inode_attach_jinode()
4287 int ext4_truncate(struct inode *inode) in ext4_truncate() argument
4289 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_truncate()
4293 struct address_space *mapping = inode->i_mapping; in ext4_truncate()
4300 if (!(inode->i_state & (I_NEW|I_FREEING))) in ext4_truncate()
4301 WARN_ON(!inode_is_locked(inode)); in ext4_truncate()
4302 trace_ext4_truncate_enter(inode); in ext4_truncate()
4304 if (!ext4_can_truncate(inode)) in ext4_truncate()
4307 if (inode->i_size == 0 && !test_opt(inode->i_sb, NO_AUTO_DA_ALLOC)) in ext4_truncate()
4308 ext4_set_inode_state(inode, EXT4_STATE_DA_ALLOC_CLOSE); in ext4_truncate()
4310 if (ext4_has_inline_data(inode)) { in ext4_truncate()
4313 err = ext4_inline_data_truncate(inode, &has_inline); in ext4_truncate()
4319 if (inode->i_size & (inode->i_sb->s_blocksize - 1)) { in ext4_truncate()
4320 if (ext4_inode_attach_jinode(inode) < 0) in ext4_truncate()
4324 if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) in ext4_truncate()
4325 credits = ext4_writepage_trans_blocks(inode); in ext4_truncate()
4327 credits = ext4_blocks_for_truncate(inode); in ext4_truncate()
4329 handle = ext4_journal_start(inode, EXT4_HT_TRUNCATE, credits); in ext4_truncate()
4335 if (inode->i_size & (inode->i_sb->s_blocksize - 1)) in ext4_truncate()
4336 ext4_block_truncate_page(handle, mapping, inode->i_size); in ext4_truncate()
4347 err = ext4_orphan_add(handle, inode); in ext4_truncate()
4351 down_write(&EXT4_I(inode)->i_data_sem); in ext4_truncate()
4353 ext4_discard_preallocations(inode, 0); in ext4_truncate()
4355 if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) in ext4_truncate()
4356 err = ext4_ext_truncate(handle, inode); in ext4_truncate()
4358 ext4_ind_truncate(handle, inode); in ext4_truncate()
4364 if (IS_SYNC(inode)) in ext4_truncate()
4375 if (inode->i_nlink) in ext4_truncate()
4376 ext4_orphan_del(handle, inode); in ext4_truncate()
4378 inode->i_mtime = inode->i_ctime = current_time(inode); in ext4_truncate()
4379 err2 = ext4_mark_inode_dirty(handle, inode); in ext4_truncate()
4385 trace_ext4_truncate_exit(inode); in ext4_truncate()
4528 static int __ext4_get_inode_loc_noinmem(struct inode *inode, in __ext4_get_inode_loc_noinmem() argument
4534 ret = __ext4_get_inode_loc(inode->i_sb, inode->i_ino, iloc, 0, in __ext4_get_inode_loc_noinmem()
4538 ext4_error_inode_block(inode, err_blk, EIO, in __ext4_get_inode_loc_noinmem()
4544 int ext4_get_inode_loc(struct inode *inode, struct ext4_iloc *iloc) in ext4_get_inode_loc() argument
4550 ret = __ext4_get_inode_loc(inode->i_sb, inode->i_ino, iloc, in ext4_get_inode_loc()
4551 !ext4_test_inode_state(inode, EXT4_STATE_XATTR), &err_blk); in ext4_get_inode_loc()
4554 ext4_error_inode_block(inode, err_blk, EIO, in ext4_get_inode_loc()
4567 static bool ext4_should_enable_dax(struct inode *inode) in ext4_should_enable_dax() argument
4569 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_should_enable_dax()
4571 if (test_opt2(inode->i_sb, DAX_NEVER)) in ext4_should_enable_dax()
4573 if (!S_ISREG(inode->i_mode)) in ext4_should_enable_dax()
4575 if (ext4_should_journal_data(inode)) in ext4_should_enable_dax()
4577 if (ext4_has_inline_data(inode)) in ext4_should_enable_dax()
4579 if (ext4_test_inode_flag(inode, EXT4_INODE_ENCRYPT)) in ext4_should_enable_dax()
4581 if (ext4_test_inode_flag(inode, EXT4_INODE_VERITY)) in ext4_should_enable_dax()
4585 if (test_opt(inode->i_sb, DAX_ALWAYS)) in ext4_should_enable_dax()
4588 return ext4_test_inode_flag(inode, EXT4_INODE_DAX); in ext4_should_enable_dax()
4591 void ext4_set_inode_flags(struct inode *inode, bool init) in ext4_set_inode_flags() argument
4593 unsigned int flags = EXT4_I(inode)->i_flags; in ext4_set_inode_flags()
4596 WARN_ON_ONCE(IS_DAX(inode) && init); in ext4_set_inode_flags()
4611 new_fl |= (inode->i_flags & S_DAX); in ext4_set_inode_flags()
4612 if (init && ext4_should_enable_dax(inode)) in ext4_set_inode_flags()
4621 inode_set_flags(inode, new_fl, in ext4_set_inode_flags()
4630 struct inode *inode = &(ei->vfs_inode); in ext4_inode_blocks() local
4631 struct super_block *sb = inode->i_sb; in ext4_inode_blocks()
4637 if (ext4_test_inode_flag(inode, EXT4_INODE_HUGE_FILE)) { in ext4_inode_blocks()
4639 return i_blocks << (inode->i_blkbits - 9); in ext4_inode_blocks()
4648 static inline int ext4_iget_extra_inode(struct inode *inode, in ext4_iget_extra_inode() argument
4655 if (EXT4_INODE_HAS_XATTR_SPACE(inode) && in ext4_iget_extra_inode()
4657 ext4_set_inode_state(inode, EXT4_STATE_XATTR); in ext4_iget_extra_inode()
4658 return ext4_find_inline_data_nolock(inode); in ext4_iget_extra_inode()
4660 EXT4_I(inode)->i_inline_off = 0; in ext4_iget_extra_inode()
4664 int ext4_get_projid(struct inode *inode, kprojid_t *projid) in ext4_get_projid() argument
4666 if (!ext4_has_feature_project(inode->i_sb)) in ext4_get_projid()
4668 *projid = EXT4_I(inode)->i_projid; in ext4_get_projid()
4677 static inline void ext4_inode_set_iversion_queried(struct inode *inode, u64 val) in ext4_inode_set_iversion_queried() argument
4679 if (unlikely(EXT4_I(inode)->i_flags & EXT4_EA_INODE_FL)) in ext4_inode_set_iversion_queried()
4680 inode_set_iversion_raw(inode, val); in ext4_inode_set_iversion_queried()
4682 inode_set_iversion_queried(inode, val); in ext4_inode_set_iversion_queried()
4684 static inline u64 ext4_inode_peek_iversion(const struct inode *inode) in ext4_inode_peek_iversion() argument
4686 if (unlikely(EXT4_I(inode)->i_flags & EXT4_EA_INODE_FL)) in ext4_inode_peek_iversion()
4687 return inode_peek_iversion_raw(inode); in ext4_inode_peek_iversion()
4689 return inode_peek_iversion(inode); in ext4_inode_peek_iversion()
4692 struct inode *__ext4_iget(struct super_block *sb, unsigned long ino, in __ext4_iget()
4699 struct inode *inode; in __ext4_iget() local
4720 inode = iget_locked(sb, ino); in __ext4_iget()
4721 if (!inode) in __ext4_iget()
4723 if (!(inode->i_state & I_NEW)) in __ext4_iget()
4724 return inode; in __ext4_iget()
4726 ei = EXT4_I(inode); in __ext4_iget()
4729 ret = __ext4_get_inode_loc_noinmem(inode, &iloc); in __ext4_iget()
4735 ext4_error_inode(inode, function, line, 0, in __ext4_iget()
4747 if (EXT4_INODE_SIZE(inode->i_sb) > EXT4_GOOD_OLD_INODE_SIZE) { in __ext4_iget()
4750 EXT4_INODE_SIZE(inode->i_sb) || in __ext4_iget()
4752 ext4_error_inode(inode, function, line, 0, in __ext4_iget()
4756 EXT4_INODE_SIZE(inode->i_sb)); in __ext4_iget()
4765 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in __ext4_iget()
4767 __le32 inum = cpu_to_le32(inode->i_ino); in __ext4_iget()
4775 if ((!ext4_inode_csum_verify(inode, raw_inode, ei) || in __ext4_iget()
4778 ext4_error_inode_err(inode, function, line, 0, in __ext4_iget()
4784 inode->i_mode = le16_to_cpu(raw_inode->i_mode); in __ext4_iget()
4794 if (!(test_opt(inode->i_sb, NO_UID32))) { in __ext4_iget()
4798 i_uid_write(inode, i_uid); in __ext4_iget()
4799 i_gid_write(inode, i_gid); in __ext4_iget()
4801 set_nlink(inode, le16_to_cpu(raw_inode->i_links_count)); in __ext4_iget()
4812 if (inode->i_nlink == 0) { in __ext4_iget()
4813 if ((inode->i_mode == 0 || in __ext4_iget()
4814 !(EXT4_SB(inode->i_sb)->s_mount_state & EXT4_ORPHAN_FS)) && in __ext4_iget()
4828 ext4_set_inode_flags(inode, true); in __ext4_iget()
4829 inode->i_blocks = ext4_inode_blocks(raw_inode, ei); in __ext4_iget()
4834 inode->i_size = ext4_isize(sb, raw_inode); in __ext4_iget()
4835 if ((size = i_size_read(inode)) < 0) { in __ext4_iget()
4836 ext4_error_inode(inode, function, line, 0, in __ext4_iget()
4847 ext4_test_inode_flag(inode, EXT4_INODE_INDEX)) { in __ext4_iget()
4848 ext4_error_inode(inode, function, line, 0, in __ext4_iget()
4853 ei->i_disksize = inode->i_size; in __ext4_iget()
4857 inode->i_generation = le32_to_cpu(raw_inode->i_generation); in __ext4_iget()
4894 if (EXT4_INODE_SIZE(inode->i_sb) > EXT4_GOOD_OLD_INODE_SIZE) { in __ext4_iget()
4901 ret = ext4_iget_extra_inode(inode, raw_inode, ei); in __ext4_iget()
4907 EXT4_INODE_GET_XTIME(i_ctime, inode, raw_inode); in __ext4_iget()
4908 EXT4_INODE_GET_XTIME(i_mtime, inode, raw_inode); in __ext4_iget()
4909 EXT4_INODE_GET_XTIME(i_atime, inode, raw_inode); in __ext4_iget()
4912 if (likely(!test_opt2(inode->i_sb, HURD_COMPAT))) { in __ext4_iget()
4915 if (EXT4_INODE_SIZE(inode->i_sb) > EXT4_GOOD_OLD_INODE_SIZE) { in __ext4_iget()
4920 ext4_inode_set_iversion_queried(inode, ivers); in __ext4_iget()
4925 !ext4_inode_block_valid(inode, ei->i_file_acl, 1)) { in __ext4_iget()
4926 ext4_error_inode(inode, function, line, 0, in __ext4_iget()
4931 } else if (!ext4_has_inline_data(inode)) { in __ext4_iget()
4934 (S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || in __ext4_iget()
4935 (S_ISLNK(inode->i_mode) && in __ext4_iget()
4936 !ext4_inode_is_fast_symlink(inode)))) { in __ext4_iget()
4937 if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) in __ext4_iget()
4938 ret = ext4_ext_check_inode(inode); in __ext4_iget()
4940 ret = ext4_ind_check_inode(inode); in __ext4_iget()
4946 if (S_ISREG(inode->i_mode)) { in __ext4_iget()
4947 inode->i_op = &ext4_file_inode_operations; in __ext4_iget()
4948 inode->i_fop = &ext4_file_operations; in __ext4_iget()
4949 ext4_set_aops(inode); in __ext4_iget()
4950 } else if (S_ISDIR(inode->i_mode)) { in __ext4_iget()
4951 inode->i_op = &ext4_dir_inode_operations; in __ext4_iget()
4952 inode->i_fop = &ext4_dir_operations; in __ext4_iget()
4953 } else if (S_ISLNK(inode->i_mode)) { in __ext4_iget()
4955 if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) { in __ext4_iget()
4956 ext4_error_inode(inode, function, line, 0, in __ext4_iget()
4962 if (IS_ENCRYPTED(inode)) { in __ext4_iget()
4963 inode->i_op = &ext4_encrypted_symlink_inode_operations; in __ext4_iget()
4964 ext4_set_aops(inode); in __ext4_iget()
4965 } else if (ext4_inode_is_fast_symlink(inode)) { in __ext4_iget()
4966 inode->i_link = (char *)ei->i_data; in __ext4_iget()
4967 inode->i_op = &ext4_fast_symlink_inode_operations; in __ext4_iget()
4968 nd_terminate_link(ei->i_data, inode->i_size, in __ext4_iget()
4971 inode->i_op = &ext4_symlink_inode_operations; in __ext4_iget()
4972 ext4_set_aops(inode); in __ext4_iget()
4974 inode_nohighmem(inode); in __ext4_iget()
4975 } else if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode) || in __ext4_iget()
4976 S_ISFIFO(inode->i_mode) || S_ISSOCK(inode->i_mode)) { in __ext4_iget()
4977 inode->i_op = &ext4_special_inode_operations; in __ext4_iget()
4979 init_special_inode(inode, inode->i_mode, in __ext4_iget()
4982 init_special_inode(inode, inode->i_mode, in __ext4_iget()
4985 make_bad_inode(inode); in __ext4_iget()
4988 ext4_error_inode(inode, function, line, 0, in __ext4_iget()
4989 "iget: bogus i_mode (%o)", inode->i_mode); in __ext4_iget()
4992 if (IS_CASEFOLDED(inode) && !ext4_has_feature_casefold(inode->i_sb)) in __ext4_iget()
4993 ext4_error_inode(inode, function, line, 0, in __ext4_iget()
4997 unlock_new_inode(inode); in __ext4_iget()
4998 return inode; in __ext4_iget()
5002 iget_failed(inode); in __ext4_iget()
5010 struct inode *inode = &(ei->vfs_inode); in ext4_inode_blocks_set() local
5011 u64 i_blocks = READ_ONCE(inode->i_blocks); in ext4_inode_blocks_set()
5012 struct super_block *sb = inode->i_sb; in ext4_inode_blocks_set()
5021 ext4_clear_inode_flag(inode, EXT4_INODE_HUGE_FILE); in ext4_inode_blocks_set()
5034 ext4_clear_inode_flag(inode, EXT4_INODE_HUGE_FILE); in ext4_inode_blocks_set()
5036 ext4_set_inode_flag(inode, EXT4_INODE_HUGE_FILE); in ext4_inode_blocks_set()
5038 i_blocks = i_blocks >> (inode->i_blkbits - 9); in ext4_inode_blocks_set()
5050 struct inode *inode; in __ext4_update_other_inode_time() local
5052 inode = find_inode_by_ino_rcu(sb, ino); in __ext4_update_other_inode_time()
5053 if (!inode) in __ext4_update_other_inode_time()
5056 if ((inode->i_state & (I_FREEING | I_WILL_FREE | I_NEW | in __ext4_update_other_inode_time()
5058 ((inode->i_state & I_DIRTY_TIME) == 0)) in __ext4_update_other_inode_time()
5061 spin_lock(&inode->i_lock); in __ext4_update_other_inode_time()
5062 if (((inode->i_state & (I_FREEING | I_WILL_FREE | I_NEW | in __ext4_update_other_inode_time()
5064 (inode->i_state & I_DIRTY_TIME)) { in __ext4_update_other_inode_time()
5065 struct ext4_inode_info *ei = EXT4_I(inode); in __ext4_update_other_inode_time()
5067 inode->i_state &= ~I_DIRTY_TIME; in __ext4_update_other_inode_time()
5068 spin_unlock(&inode->i_lock); in __ext4_update_other_inode_time()
5071 EXT4_INODE_SET_XTIME(i_ctime, inode, raw_inode); in __ext4_update_other_inode_time()
5072 EXT4_INODE_SET_XTIME(i_mtime, inode, raw_inode); in __ext4_update_other_inode_time()
5073 EXT4_INODE_SET_XTIME(i_atime, inode, raw_inode); in __ext4_update_other_inode_time()
5074 ext4_inode_csum_set(inode, raw_inode, ei); in __ext4_update_other_inode_time()
5076 trace_ext4_other_inode_update_time(inode, orig_ino); in __ext4_update_other_inode_time()
5079 spin_unlock(&inode->i_lock); in __ext4_update_other_inode_time()
5117 struct inode *inode, in ext4_do_update_inode() argument
5121 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_do_update_inode()
5123 struct super_block *sb = inode->i_sb; in ext4_do_update_inode()
5134 if (ext4_test_inode_state(inode, EXT4_STATE_NEW)) in ext4_do_update_inode()
5135 memset(raw_inode, 0, EXT4_SB(inode->i_sb)->s_inode_size); in ext4_do_update_inode()
5143 raw_inode->i_mode = cpu_to_le16(inode->i_mode); in ext4_do_update_inode()
5144 i_uid = i_uid_read(inode); in ext4_do_update_inode()
5145 i_gid = i_gid_read(inode); in ext4_do_update_inode()
5147 if (!(test_opt(inode->i_sb, NO_UID32))) { in ext4_do_update_inode()
5169 raw_inode->i_links_count = cpu_to_le16(inode->i_nlink); in ext4_do_update_inode()
5171 EXT4_INODE_SET_XTIME(i_ctime, inode, raw_inode); in ext4_do_update_inode()
5172 EXT4_INODE_SET_XTIME(i_mtime, inode, raw_inode); in ext4_do_update_inode()
5173 EXT4_INODE_SET_XTIME(i_atime, inode, raw_inode); in ext4_do_update_inode()
5178 if (likely(!test_opt2(inode->i_sb, HURD_COMPAT))) in ext4_do_update_inode()
5182 if (READ_ONCE(ei->i_disksize) != ext4_isize(inode->i_sb, raw_inode)) { in ext4_do_update_inode()
5192 raw_inode->i_generation = cpu_to_le32(inode->i_generation); in ext4_do_update_inode()
5193 if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) { in ext4_do_update_inode()
5194 if (old_valid_dev(inode->i_rdev)) { in ext4_do_update_inode()
5196 cpu_to_le32(old_encode_dev(inode->i_rdev)); in ext4_do_update_inode()
5201 cpu_to_le32(new_encode_dev(inode->i_rdev)); in ext4_do_update_inode()
5204 } else if (!ext4_has_inline_data(inode)) { in ext4_do_update_inode()
5209 if (likely(!test_opt2(inode->i_sb, HURD_COMPAT))) { in ext4_do_update_inode()
5210 u64 ivers = ext4_inode_peek_iversion(inode); in ext4_do_update_inode()
5222 BUG_ON(!ext4_has_feature_project(inode->i_sb) && in ext4_do_update_inode()
5225 if (EXT4_INODE_SIZE(inode->i_sb) > EXT4_GOOD_OLD_INODE_SIZE && in ext4_do_update_inode()
5229 ext4_inode_csum_set(inode, raw_inode, ei); in ext4_do_update_inode()
5231 if (inode->i_sb->s_flags & SB_LAZYTIME) in ext4_do_update_inode()
5232 ext4_update_other_inodes_time(inode->i_sb, inode->i_ino, in ext4_do_update_inode()
5239 ext4_clear_inode_state(inode, EXT4_STATE_NEW); in ext4_do_update_inode()
5249 ext4_update_inode_fsync_trans(handle, inode, need_datasync); in ext4_do_update_inode()
5252 ext4_std_error(inode->i_sb, err); in ext4_do_update_inode()
5290 int ext4_write_inode(struct inode *inode, struct writeback_control *wbc) in ext4_write_inode() argument
5295 sb_rdonly(inode->i_sb)) in ext4_write_inode()
5298 if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb)))) in ext4_write_inode()
5301 if (EXT4_SB(inode->i_sb)->s_journal) { in ext4_write_inode()
5316 err = ext4_fc_commit(EXT4_SB(inode->i_sb)->s_journal, in ext4_write_inode()
5317 EXT4_I(inode)->i_sync_tid); in ext4_write_inode()
5321 err = __ext4_get_inode_loc_noinmem(inode, &iloc); in ext4_write_inode()
5331 ext4_error_inode_block(inode, iloc.bh->b_blocknr, EIO, in ext4_write_inode()
5345 static void ext4_wait_for_tail_page_commit(struct inode *inode) in ext4_wait_for_tail_page_commit() argument
5349 journal_t *journal = EXT4_SB(inode->i_sb)->s_journal; in ext4_wait_for_tail_page_commit()
5353 offset = inode->i_size & (PAGE_SIZE - 1); in ext4_wait_for_tail_page_commit()
5363 if (!offset || offset > (PAGE_SIZE - i_blocksize(inode))) in ext4_wait_for_tail_page_commit()
5366 page = find_lock_page(inode->i_mapping, in ext4_wait_for_tail_page_commit()
5367 inode->i_size >> PAGE_SHIFT); in ext4_wait_for_tail_page_commit()
5412 struct inode *inode = d_inode(dentry); in ext4_setattr() local
5417 if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb)))) in ext4_setattr()
5420 if (unlikely(IS_IMMUTABLE(inode))) in ext4_setattr()
5423 if (unlikely(IS_APPEND(inode) && in ext4_setattr()
5440 if (is_quota_modification(inode, attr)) { in ext4_setattr()
5441 error = dquot_initialize(inode); in ext4_setattr()
5445 ext4_fc_start_update(inode); in ext4_setattr()
5446 if ((ia_valid & ATTR_UID && !uid_eq(attr->ia_uid, inode->i_uid)) || in ext4_setattr()
5447 (ia_valid & ATTR_GID && !gid_eq(attr->ia_gid, inode->i_gid))) { in ext4_setattr()
5452 handle = ext4_journal_start(inode, EXT4_HT_QUOTA, in ext4_setattr()
5453 (EXT4_MAXQUOTAS_INIT_BLOCKS(inode->i_sb) + in ext4_setattr()
5454 EXT4_MAXQUOTAS_DEL_BLOCKS(inode->i_sb)) + 3); in ext4_setattr()
5463 down_read(&EXT4_I(inode)->xattr_sem); in ext4_setattr()
5464 error = dquot_transfer(inode, attr); in ext4_setattr()
5465 up_read(&EXT4_I(inode)->xattr_sem); in ext4_setattr()
5469 ext4_fc_stop_update(inode); in ext4_setattr()
5475 inode->i_uid = attr->ia_uid; in ext4_setattr()
5477 inode->i_gid = attr->ia_gid; in ext4_setattr()
5478 error = ext4_mark_inode_dirty(handle, inode); in ext4_setattr()
5481 ext4_fc_stop_update(inode); in ext4_setattr()
5488 loff_t oldsize = inode->i_size; in ext4_setattr()
5490 int shrink = (attr->ia_size < inode->i_size); in ext4_setattr()
5492 if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) { in ext4_setattr()
5493 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_setattr()
5496 ext4_fc_stop_update(inode); in ext4_setattr()
5500 if (!S_ISREG(inode->i_mode)) { in ext4_setattr()
5501 ext4_fc_stop_update(inode); in ext4_setattr()
5505 if (IS_I_VERSION(inode) && attr->ia_size != inode->i_size) in ext4_setattr()
5506 inode_inc_iversion(inode); in ext4_setattr()
5509 if (ext4_should_order_data(inode)) { in ext4_setattr()
5510 error = ext4_begin_ordered_truncate(inode, in ext4_setattr()
5519 inode_dio_wait(inode); in ext4_setattr()
5522 down_write(&EXT4_I(inode)->i_mmap_sem); in ext4_setattr()
5524 rc = ext4_break_layouts(inode); in ext4_setattr()
5526 up_write(&EXT4_I(inode)->i_mmap_sem); in ext4_setattr()
5530 if (attr->ia_size != inode->i_size) { in ext4_setattr()
5531 handle = ext4_journal_start(inode, EXT4_HT_INODE, 3); in ext4_setattr()
5537 error = ext4_orphan_add(handle, inode); in ext4_setattr()
5545 inode->i_mtime = current_time(inode); in ext4_setattr()
5546 inode->i_ctime = inode->i_mtime; in ext4_setattr()
5550 ext4_fc_track_range(handle, inode, in ext4_setattr()
5552 inode->i_sb->s_blocksize_bits, in ext4_setattr()
5556 handle, inode, in ext4_setattr()
5558 inode->i_sb->s_blocksize_bits, in ext4_setattr()
5560 inode->i_sb->s_blocksize_bits); in ext4_setattr()
5562 down_write(&EXT4_I(inode)->i_data_sem); in ext4_setattr()
5563 old_disksize = EXT4_I(inode)->i_disksize; in ext4_setattr()
5564 EXT4_I(inode)->i_disksize = attr->ia_size; in ext4_setattr()
5565 rc = ext4_mark_inode_dirty(handle, inode); in ext4_setattr()
5574 i_size_write(inode, attr->ia_size); in ext4_setattr()
5576 EXT4_I(inode)->i_disksize = old_disksize; in ext4_setattr()
5577 up_write(&EXT4_I(inode)->i_data_sem); in ext4_setattr()
5582 pagecache_isize_extended(inode, oldsize, in ext4_setattr()
5583 inode->i_size); in ext4_setattr()
5584 } else if (ext4_should_journal_data(inode)) { in ext4_setattr()
5585 ext4_wait_for_tail_page_commit(inode); in ext4_setattr()
5593 truncate_pagecache(inode, inode->i_size); in ext4_setattr()
5599 rc = ext4_truncate(inode); in ext4_setattr()
5604 up_write(&EXT4_I(inode)->i_mmap_sem); in ext4_setattr()
5608 setattr_copy(inode, attr); in ext4_setattr()
5609 mark_inode_dirty(inode); in ext4_setattr()
5616 if (orphan && inode->i_nlink) in ext4_setattr()
5617 ext4_orphan_del(NULL, inode); in ext4_setattr()
5620 rc = posix_acl_chmod(inode, inode->i_mode); in ext4_setattr()
5624 ext4_std_error(inode->i_sb, error); in ext4_setattr()
5627 ext4_fc_stop_update(inode); in ext4_setattr()
5634 struct inode *inode = d_inode(path->dentry); in ext4_getattr() local
5636 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_getattr()
5667 generic_fillattr(inode, stat); in ext4_getattr()
5674 struct inode *inode = d_inode(path->dentry); in ext4_file_getattr() local
5685 if (unlikely(ext4_has_inline_data(inode))) in ext4_file_getattr()
5698 delalloc_blocks = EXT4_C2B(EXT4_SB(inode->i_sb), in ext4_file_getattr()
5699 EXT4_I(inode)->i_reserved_data_blocks); in ext4_file_getattr()
5700 stat->blocks += delalloc_blocks << (inode->i_sb->s_blocksize_bits - 9); in ext4_file_getattr()
5704 static int ext4_index_trans_blocks(struct inode *inode, int lblocks, in ext4_index_trans_blocks() argument
5707 if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) in ext4_index_trans_blocks()
5708 return ext4_ind_trans_blocks(inode, lblocks); in ext4_index_trans_blocks()
5709 return ext4_ext_index_trans_blocks(inode, pextents); in ext4_index_trans_blocks()
5723 static int ext4_meta_trans_blocks(struct inode *inode, int lblocks, in ext4_meta_trans_blocks() argument
5726 ext4_group_t groups, ngroups = ext4_get_groups_count(inode->i_sb); in ext4_meta_trans_blocks()
5735 idxblocks = ext4_index_trans_blocks(inode, lblocks, pextents); in ext4_meta_trans_blocks()
5747 if (groups > EXT4_SB(inode->i_sb)->s_gdb_count) in ext4_meta_trans_blocks()
5748 gdpblocks = EXT4_SB(inode->i_sb)->s_gdb_count; in ext4_meta_trans_blocks()
5754 ret += EXT4_META_TRANS_BLOCKS(inode->i_sb); in ext4_meta_trans_blocks()
5769 int ext4_writepage_trans_blocks(struct inode *inode) in ext4_writepage_trans_blocks() argument
5771 int bpp = ext4_journal_blocks_per_page(inode); in ext4_writepage_trans_blocks()
5774 ret = ext4_meta_trans_blocks(inode, bpp, bpp); in ext4_writepage_trans_blocks()
5777 if (ext4_should_journal_data(inode)) in ext4_writepage_trans_blocks()
5791 int ext4_chunk_trans_blocks(struct inode *inode, int nrblocks) in ext4_chunk_trans_blocks() argument
5793 return ext4_meta_trans_blocks(inode, nrblocks, 1); in ext4_chunk_trans_blocks()
5801 struct inode *inode, struct ext4_iloc *iloc) in ext4_mark_iloc_dirty() argument
5805 if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb)))) { in ext4_mark_iloc_dirty()
5809 ext4_fc_track_inode(handle, inode); in ext4_mark_iloc_dirty()
5815 if (IS_I_VERSION(inode) && in ext4_mark_iloc_dirty()
5816 !(EXT4_I(inode)->i_flags & EXT4_EA_INODE_FL)) in ext4_mark_iloc_dirty()
5817 inode_inc_iversion(inode); in ext4_mark_iloc_dirty()
5823 err = ext4_do_update_inode(handle, inode, iloc); in ext4_mark_iloc_dirty()
5834 ext4_reserve_inode_write(handle_t *handle, struct inode *inode, in ext4_reserve_inode_write() argument
5839 if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb)))) in ext4_reserve_inode_write()
5842 err = ext4_get_inode_loc(inode, iloc); in ext4_reserve_inode_write()
5851 ext4_std_error(inode->i_sb, err); in ext4_reserve_inode_write()
5855 static int __ext4_expand_extra_isize(struct inode *inode, in __ext4_expand_extra_isize() argument
5862 unsigned int inode_size = EXT4_INODE_SIZE(inode->i_sb); in __ext4_expand_extra_isize()
5863 struct ext4_inode_info *ei = EXT4_I(inode); in __ext4_expand_extra_isize()
5869 EXT4_ERROR_INODE(inode, "bad extra_isize %u (inode size %u)", in __ext4_expand_extra_isize()
5871 EXT4_INODE_SIZE(inode->i_sb)); in __ext4_expand_extra_isize()
5881 header = IHDR(inode, raw_inode); in __ext4_expand_extra_isize()
5884 if (!ext4_test_inode_state(inode, EXT4_STATE_XATTR) || in __ext4_expand_extra_isize()
5887 EXT4_I(inode)->i_extra_isize, 0, in __ext4_expand_extra_isize()
5888 new_extra_isize - EXT4_I(inode)->i_extra_isize); in __ext4_expand_extra_isize()
5889 EXT4_I(inode)->i_extra_isize = new_extra_isize; in __ext4_expand_extra_isize()
5894 error = ext4_expand_extra_isize_ea(inode, new_extra_isize, in __ext4_expand_extra_isize()
5910 static int ext4_try_to_expand_extra_isize(struct inode *inode, in ext4_try_to_expand_extra_isize() argument
5918 if (ext4_test_inode_state(inode, EXT4_STATE_NO_EXPAND)) in ext4_try_to_expand_extra_isize()
5931 EXT4_DATA_TRANS_BLOCKS(inode->i_sb), 0) != 0) in ext4_try_to_expand_extra_isize()
5934 if (ext4_write_trylock_xattr(inode, &no_expand) == 0) in ext4_try_to_expand_extra_isize()
5937 error = __ext4_expand_extra_isize(inode, new_extra_isize, &iloc, in ext4_try_to_expand_extra_isize()
5939 ext4_write_unlock_xattr(inode, &no_expand); in ext4_try_to_expand_extra_isize()
5944 int ext4_expand_extra_isize(struct inode *inode, in ext4_expand_extra_isize() argument
5952 if (ext4_test_inode_state(inode, EXT4_STATE_NO_EXPAND)) { in ext4_expand_extra_isize()
5957 handle = ext4_journal_start(inode, EXT4_HT_INODE, in ext4_expand_extra_isize()
5958 EXT4_DATA_TRANS_BLOCKS(inode->i_sb)); in ext4_expand_extra_isize()
5965 ext4_write_lock_xattr(inode, &no_expand); in ext4_expand_extra_isize()
5974 error = __ext4_expand_extra_isize(inode, new_extra_isize, iloc, in ext4_expand_extra_isize()
5977 rc = ext4_mark_iloc_dirty(handle, inode, iloc); in ext4_expand_extra_isize()
5982 ext4_write_unlock_xattr(inode, &no_expand); in ext4_expand_extra_isize()
6000 int __ext4_mark_inode_dirty(handle_t *handle, struct inode *inode, in __ext4_mark_inode_dirty() argument
6004 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in __ext4_mark_inode_dirty()
6008 trace_ext4_mark_inode_dirty(inode, _RET_IP_); in __ext4_mark_inode_dirty()
6009 err = ext4_reserve_inode_write(handle, inode, &iloc); in __ext4_mark_inode_dirty()
6013 if (EXT4_I(inode)->i_extra_isize < sbi->s_want_extra_isize) in __ext4_mark_inode_dirty()
6014 ext4_try_to_expand_extra_isize(inode, sbi->s_want_extra_isize, in __ext4_mark_inode_dirty()
6017 err = ext4_mark_iloc_dirty(handle, inode, &iloc); in __ext4_mark_inode_dirty()
6020 ext4_error_inode_err(inode, func, line, 0, err, in __ext4_mark_inode_dirty()
6043 void ext4_dirty_inode(struct inode *inode, int flags) in ext4_dirty_inode() argument
6049 handle = ext4_journal_start(inode, EXT4_HT_INODE, 2); in ext4_dirty_inode()
6053 ext4_mark_inode_dirty(handle, inode); in ext4_dirty_inode()
6060 int ext4_change_inode_journal_flag(struct inode *inode, int val) in ext4_change_inode_journal_flag() argument
6065 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_change_inode_journal_flag()
6077 journal = EXT4_JOURNAL(inode); in ext4_change_inode_journal_flag()
6084 inode_dio_wait(inode); in ext4_change_inode_journal_flag()
6095 down_write(&EXT4_I(inode)->i_mmap_sem); in ext4_change_inode_journal_flag()
6096 err = filemap_write_and_wait(inode->i_mapping); in ext4_change_inode_journal_flag()
6098 up_write(&EXT4_I(inode)->i_mmap_sem); in ext4_change_inode_journal_flag()
6115 ext4_set_inode_flag(inode, EXT4_INODE_JOURNAL_DATA); in ext4_change_inode_journal_flag()
6123 ext4_clear_inode_flag(inode, EXT4_INODE_JOURNAL_DATA); in ext4_change_inode_journal_flag()
6125 ext4_set_aops(inode); in ext4_change_inode_journal_flag()
6131 up_write(&EXT4_I(inode)->i_mmap_sem); in ext4_change_inode_journal_flag()
6135 handle = ext4_journal_start(inode, EXT4_HT_INODE, 1); in ext4_change_inode_journal_flag()
6139 ext4_fc_mark_ineligible(inode->i_sb, in ext4_change_inode_journal_flag()
6141 err = ext4_mark_inode_dirty(handle, inode); in ext4_change_inode_journal_flag()
6144 ext4_std_error(inode->i_sb, err); in ext4_change_inode_journal_flag()
6163 struct inode *inode = file_inode(file); in ext4_page_mkwrite() local
6164 struct address_space *mapping = inode->i_mapping; in ext4_page_mkwrite()
6169 if (unlikely(IS_IMMUTABLE(inode))) in ext4_page_mkwrite()
6172 sb_start_pagefault(inode->i_sb); in ext4_page_mkwrite()
6175 down_read(&EXT4_I(inode)->i_mmap_sem); in ext4_page_mkwrite()
6177 err = ext4_convert_inline_data(inode); in ext4_page_mkwrite()
6187 if (ext4_should_journal_data(inode)) in ext4_page_mkwrite()
6191 if (test_opt(inode->i_sb, DELALLOC) && in ext4_page_mkwrite()
6192 !ext4_nonda_switch(inode->i_sb)) { in ext4_page_mkwrite()
6197 ext4_should_retry_alloc(inode->i_sb, &retries)); in ext4_page_mkwrite()
6202 size = i_size_read(inode); in ext4_page_mkwrite()
6233 if (ext4_should_dioread_nolock(inode)) in ext4_page_mkwrite()
6238 handle = ext4_journal_start(inode, EXT4_HT_WRITE_PAGE, in ext4_page_mkwrite()
6239 ext4_writepage_trans_blocks(inode)); in ext4_page_mkwrite()
6249 if (!ext4_should_journal_data(inode)) { in ext4_page_mkwrite()
6253 size = i_size_read(inode); in ext4_page_mkwrite()
6274 if (ext4_jbd2_inode_add_write(handle, inode, in ext4_page_mkwrite()
6277 ext4_set_inode_state(inode, EXT4_STATE_JDATA); in ext4_page_mkwrite()
6283 if (err == -ENOSPC && ext4_should_retry_alloc(inode->i_sb, &retries)) in ext4_page_mkwrite()
6288 up_read(&EXT4_I(inode)->i_mmap_sem); in ext4_page_mkwrite()
6289 sb_end_pagefault(inode->i_sb); in ext4_page_mkwrite()
6299 struct inode *inode = file_inode(vmf->vma->vm_file); in ext4_filemap_fault() local
6302 down_read(&EXT4_I(inode)->i_mmap_sem); in ext4_filemap_fault()
6304 up_read(&EXT4_I(inode)->i_mmap_sem); in ext4_filemap_fault()