Lines Matching refs:inode

53 static __u32 ext4_inode_csum(struct inode *inode, struct ext4_inode *raw,  in ext4_inode_csum()  argument
56 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_inode_csum()
68 if (EXT4_INODE_SIZE(inode->i_sb) > EXT4_GOOD_OLD_INODE_SIZE) { in ext4_inode_csum()
79 EXT4_INODE_SIZE(inode->i_sb) - offset); in ext4_inode_csum()
85 static int ext4_inode_csum_verify(struct inode *inode, struct ext4_inode *raw, in ext4_inode_csum_verify() argument
90 if (EXT4_SB(inode->i_sb)->s_es->s_creator_os != in ext4_inode_csum_verify()
92 !ext4_has_metadata_csum(inode->i_sb)) in ext4_inode_csum_verify()
96 calculated = ext4_inode_csum(inode, raw, ei); in ext4_inode_csum_verify()
97 if (EXT4_INODE_SIZE(inode->i_sb) > EXT4_GOOD_OLD_INODE_SIZE && in ext4_inode_csum_verify()
106 static void ext4_inode_csum_set(struct inode *inode, struct ext4_inode *raw, in ext4_inode_csum_set() argument
111 if (EXT4_SB(inode->i_sb)->s_es->s_creator_os != in ext4_inode_csum_set()
113 !ext4_has_metadata_csum(inode->i_sb)) in ext4_inode_csum_set()
116 csum = ext4_inode_csum(inode, raw, ei); in ext4_inode_csum_set()
118 if (EXT4_INODE_SIZE(inode->i_sb) > EXT4_GOOD_OLD_INODE_SIZE && in ext4_inode_csum_set()
123 static inline int ext4_begin_ordered_truncate(struct inode *inode, in ext4_begin_ordered_truncate() argument
126 trace_ext4_begin_ordered_truncate(inode, new_size); in ext4_begin_ordered_truncate()
133 if (!EXT4_I(inode)->jinode) in ext4_begin_ordered_truncate()
135 return jbd2_journal_begin_ordered_truncate(EXT4_JOURNAL(inode), in ext4_begin_ordered_truncate()
136 EXT4_I(inode)->jinode, in ext4_begin_ordered_truncate()
144 static int ext4_meta_trans_blocks(struct inode *inode, int lblocks,
151 int ext4_inode_is_fast_symlink(struct inode *inode) in ext4_inode_is_fast_symlink() argument
153 if (!(EXT4_I(inode)->i_flags & EXT4_EA_INODE_FL)) { in ext4_inode_is_fast_symlink()
154 int ea_blocks = EXT4_I(inode)->i_file_acl ? in ext4_inode_is_fast_symlink()
155 EXT4_CLUSTER_SIZE(inode->i_sb) >> 9 : 0; in ext4_inode_is_fast_symlink()
157 if (ext4_has_inline_data(inode)) in ext4_inode_is_fast_symlink()
160 return (S_ISLNK(inode->i_mode) && inode->i_blocks - ea_blocks == 0); in ext4_inode_is_fast_symlink()
162 return S_ISLNK(inode->i_mode) && inode->i_size && in ext4_inode_is_fast_symlink()
163 (inode->i_size < EXT4_N_BLOCKS * 4); in ext4_inode_is_fast_symlink()
171 int ext4_truncate_restart_trans(handle_t *handle, struct inode *inode, in ext4_truncate_restart_trans() argument
182 BUG_ON(EXT4_JOURNAL(inode) == NULL); in ext4_truncate_restart_trans()
184 up_write(&EXT4_I(inode)->i_data_sem); in ext4_truncate_restart_trans()
186 down_write(&EXT4_I(inode)->i_data_sem); in ext4_truncate_restart_trans()
187 ext4_discard_preallocations(inode); in ext4_truncate_restart_trans()
195 void ext4_evict_inode(struct inode *inode) in ext4_evict_inode() argument
202 trace_ext4_evict_inode(inode); in ext4_evict_inode()
204 if (inode->i_nlink) { in ext4_evict_inode()
223 if (inode->i_ino != EXT4_JOURNAL_INO && in ext4_evict_inode()
224 ext4_should_journal_data(inode) && in ext4_evict_inode()
225 (S_ISLNK(inode->i_mode) || S_ISREG(inode->i_mode)) && in ext4_evict_inode()
226 inode->i_data.nrpages) { in ext4_evict_inode()
227 journal_t *journal = EXT4_SB(inode->i_sb)->s_journal; in ext4_evict_inode()
228 tid_t commit_tid = EXT4_I(inode)->i_datasync_tid; in ext4_evict_inode()
231 filemap_write_and_wait(&inode->i_data); in ext4_evict_inode()
233 truncate_inode_pages_final(&inode->i_data); in ext4_evict_inode()
238 if (is_bad_inode(inode)) in ext4_evict_inode()
240 dquot_initialize(inode); in ext4_evict_inode()
242 if (ext4_should_order_data(inode)) in ext4_evict_inode()
243 ext4_begin_ordered_truncate(inode, 0); in ext4_evict_inode()
244 truncate_inode_pages_final(&inode->i_data); in ext4_evict_inode()
250 sb_start_intwrite(inode->i_sb); in ext4_evict_inode()
252 if (!IS_NOQUOTA(inode)) in ext4_evict_inode()
253 extra_credits += EXT4_MAXQUOTAS_DEL_BLOCKS(inode->i_sb); in ext4_evict_inode()
255 handle = ext4_journal_start(inode, EXT4_HT_TRUNCATE, in ext4_evict_inode()
256 ext4_blocks_for_truncate(inode)+extra_credits); in ext4_evict_inode()
258 ext4_std_error(inode->i_sb, PTR_ERR(handle)); in ext4_evict_inode()
264 ext4_orphan_del(NULL, inode); in ext4_evict_inode()
265 sb_end_intwrite(inode->i_sb); in ext4_evict_inode()
269 if (IS_SYNC(inode)) in ext4_evict_inode()
279 if (ext4_inode_is_fast_symlink(inode)) in ext4_evict_inode()
280 memset(EXT4_I(inode)->i_data, 0, sizeof(EXT4_I(inode)->i_data)); in ext4_evict_inode()
281 inode->i_size = 0; in ext4_evict_inode()
282 err = ext4_mark_inode_dirty(handle, inode); in ext4_evict_inode()
284 ext4_warning(inode->i_sb, in ext4_evict_inode()
288 if (inode->i_blocks) { in ext4_evict_inode()
289 err = ext4_truncate(inode); in ext4_evict_inode()
291 ext4_error(inode->i_sb, in ext4_evict_inode()
293 inode->i_ino, err); in ext4_evict_inode()
299 err = ext4_xattr_delete_inode(handle, inode, &ea_inode_array, in ext4_evict_inode()
302 ext4_warning(inode->i_sb, "xattr delete (err %d)", err); in ext4_evict_inode()
305 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()
335 sb_end_intwrite(inode->i_sb); in ext4_evict_inode()
339 ext4_clear_inode(inode); /* We must guarantee clearing of inode... */ in ext4_evict_inode()
343 qsize_t *ext4_get_reserved_space(struct inode *inode) in ext4_get_reserved_space() argument
345 return &EXT4_I(inode)->i_reserved_quota; in ext4_get_reserved_space()
353 void ext4_da_update_reserve_space(struct inode *inode, in ext4_da_update_reserve_space() argument
356 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_da_update_reserve_space()
357 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_da_update_reserve_space()
360 trace_ext4_da_update_reserve_space(inode, used, quota_claim); in ext4_da_update_reserve_space()
362 ext4_warning(inode->i_sb, "%s: ino %lu, used %d " in ext4_da_update_reserve_space()
364 __func__, inode->i_ino, used, in ext4_da_update_reserve_space()
374 spin_unlock(&EXT4_I(inode)->i_block_reservation_lock); in ext4_da_update_reserve_space()
378 dquot_claim_block(inode, EXT4_C2B(sbi, used)); in ext4_da_update_reserve_space()
385 dquot_release_reservation_block(inode, EXT4_C2B(sbi, used)); in ext4_da_update_reserve_space()
394 !inode_is_open_for_write(inode)) in ext4_da_update_reserve_space()
395 ext4_discard_preallocations(inode); in ext4_da_update_reserve_space()
398 static int __check_block_validity(struct inode *inode, const char *func, in __check_block_validity() argument
402 if (ext4_has_feature_journal(inode->i_sb) && in __check_block_validity()
403 (inode->i_ino == in __check_block_validity()
404 le32_to_cpu(EXT4_SB(inode->i_sb)->s_es->s_journal_inum))) in __check_block_validity()
406 if (!ext4_data_block_valid(EXT4_SB(inode->i_sb), map->m_pblk, in __check_block_validity()
408 ext4_error_inode(inode, func, line, map->m_pblk, in __check_block_validity()
417 int ext4_issue_zeroout(struct inode *inode, ext4_lblk_t lblk, ext4_fsblk_t pblk, in ext4_issue_zeroout() argument
422 if (IS_ENCRYPTED(inode)) in ext4_issue_zeroout()
423 return fscrypt_zeroout_range(inode, lblk, pblk, len); in ext4_issue_zeroout()
425 ret = sb_issue_zeroout(inode->i_sb, pblk, len, GFP_NOFS); in ext4_issue_zeroout()
432 #define check_block_validity(inode, map) \ argument
433 __check_block_validity((inode), __func__, __LINE__, (map))
437 struct inode *inode, in ext4_map_blocks_es_recheck() argument
452 down_read(&EXT4_I(inode)->i_data_sem); in ext4_map_blocks_es_recheck()
453 if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) { in ext4_map_blocks_es_recheck()
454 retval = ext4_ext_map_blocks(handle, inode, map, flags & in ext4_map_blocks_es_recheck()
457 retval = ext4_ind_map_blocks(handle, inode, map, flags & 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
516 "logical block %lu\n", inode->i_ino, flags, map->m_len, in ext4_map_blocks()
530 if (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, flags & in ext4_map_blocks()
566 retval = ext4_ind_map_blocks(handle, inode, map, flags & in ext4_map_blocks()
573 ext4_warning(inode->i_sb, in ext4_map_blocks()
576 inode->i_ino, retval, map->m_len); in ext4_map_blocks()
584 ext4_es_scan_range(inode, &ext4_es_is_delayed, map->m_lblk, in ext4_map_blocks()
587 ret = ext4_es_insert_extent(inode, map->m_lblk, in ext4_map_blocks()
592 up_read((&EXT4_I(inode)->i_data_sem)); in ext4_map_blocks()
596 ret = check_block_validity(inode, map); in ext4_map_blocks()
633 down_write(&EXT4_I(inode)->i_data_sem); in ext4_map_blocks()
639 if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) { in ext4_map_blocks()
640 retval = ext4_ext_map_blocks(handle, inode, map, flags); in ext4_map_blocks()
642 retval = ext4_ind_map_blocks(handle, inode, map, flags); in ext4_map_blocks()
650 ext4_clear_inode_state(inode, EXT4_STATE_EXT_MIGRATE); in ext4_map_blocks()
661 ext4_da_update_reserve_space(inode, retval, 1); in ext4_map_blocks()
668 ext4_warning(inode->i_sb, in ext4_map_blocks()
671 inode->i_ino, retval, map->m_len); in ext4_map_blocks()
685 ret = ext4_issue_zeroout(inode, map->m_lblk, in ext4_map_blocks()
698 ext4_es_lookup_extent(inode, map->m_lblk, NULL, &es)) { in ext4_map_blocks()
706 ext4_es_scan_range(inode, &ext4_es_is_delayed, map->m_lblk, in ext4_map_blocks()
709 ret = ext4_es_insert_extent(inode, map->m_lblk, map->m_len, in ext4_map_blocks()
718 up_write((&EXT4_I(inode)->i_data_sem)); in ext4_map_blocks()
720 ret = check_block_validity(inode, map); in ext4_map_blocks()
732 !ext4_is_quota_file(inode) && in ext4_map_blocks()
733 ext4_should_order_data(inode)) { in ext4_map_blocks()
735 (loff_t)map->m_lblk << inode->i_blkbits; in ext4_map_blocks()
736 loff_t length = (loff_t)map->m_len << inode->i_blkbits; in ext4_map_blocks()
739 ret = ext4_jbd2_inode_add_wait(handle, inode, in ext4_map_blocks()
742 ret = ext4_jbd2_inode_add_write(handle, inode, in ext4_map_blocks()
779 static int _ext4_get_block(struct inode *inode, sector_t iblock, in _ext4_get_block() argument
785 if (ext4_has_inline_data(inode)) in _ext4_get_block()
789 map.m_len = bh->b_size >> inode->i_blkbits; in _ext4_get_block()
791 ret = ext4_map_blocks(ext4_journal_current_handle(), inode, &map, in _ext4_get_block()
794 map_bh(bh, inode->i_sb, map.m_pblk); in _ext4_get_block()
796 bh->b_size = inode->i_sb->s_blocksize * map.m_len; in _ext4_get_block()
800 bh->b_size = inode->i_sb->s_blocksize * map.m_len; in _ext4_get_block()
805 int ext4_get_block(struct inode *inode, sector_t iblock, in ext4_get_block() argument
808 return _ext4_get_block(inode, iblock, bh, in ext4_get_block()
817 int ext4_get_block_unwritten(struct inode *inode, sector_t iblock, in ext4_get_block_unwritten() argument
821 inode->i_ino, create); in ext4_get_block_unwritten()
822 return _ext4_get_block(inode, iblock, bh_result, in ext4_get_block_unwritten()
834 static int ext4_get_block_trans(struct inode *inode, sector_t iblock, in ext4_get_block_trans() argument
843 if (bh_result->b_size >> inode->i_blkbits > DIO_MAX_BLOCKS) in ext4_get_block_trans()
844 bh_result->b_size = DIO_MAX_BLOCKS << inode->i_blkbits; in ext4_get_block_trans()
845 dio_credits = ext4_chunk_trans_blocks(inode, in ext4_get_block_trans()
846 bh_result->b_size >> inode->i_blkbits); in ext4_get_block_trans()
848 handle = ext4_journal_start(inode, EXT4_HT_MAP_BLOCKS, dio_credits); in ext4_get_block_trans()
852 ret = _ext4_get_block(inode, iblock, bh_result, flags); in ext4_get_block_trans()
855 if (ret == -ENOSPC && ext4_should_retry_alloc(inode->i_sb, &retries)) in ext4_get_block_trans()
861 int ext4_dio_get_block(struct inode *inode, sector_t iblock, in ext4_dio_get_block() argument
868 return _ext4_get_block(inode, iblock, bh, 0); in ext4_dio_get_block()
869 return ext4_get_block_trans(inode, iblock, bh, EXT4_GET_BLOCKS_CREATE); in ext4_dio_get_block()
877 static int ext4_dio_get_block_unwritten_async(struct inode *inode, in ext4_dio_get_block_unwritten_async() argument
885 ret = ext4_get_block_trans(inode, iblock, bh_result, in ext4_dio_get_block_unwritten_async()
899 io_end = ext4_init_io_end(inode, GFP_KERNEL); in ext4_dio_get_block_unwritten_async()
903 ext4_set_io_unwritten_flag(inode, io_end); in ext4_dio_get_block_unwritten_async()
916 static int ext4_dio_get_block_unwritten_sync(struct inode *inode, in ext4_dio_get_block_unwritten_sync() argument
924 ret = ext4_get_block_trans(inode, iblock, bh_result, in ext4_dio_get_block_unwritten_sync()
933 ext4_set_inode_state(inode, EXT4_STATE_DIO_UNWRITTEN); in ext4_dio_get_block_unwritten_sync()
938 static int ext4_dio_get_block_overwrite(struct inode *inode, sector_t iblock, in ext4_dio_get_block_overwrite() argument
944 inode->i_ino, create); in ext4_dio_get_block_overwrite()
948 ret = _ext4_get_block(inode, iblock, bh_result, 0); in ext4_dio_get_block_overwrite()
962 struct buffer_head *ext4_getblk(handle_t *handle, struct inode *inode, in ext4_getblk() argument
974 err = ext4_map_blocks(handle, inode, &map, map_flags); in ext4_getblk()
981 bh = sb_getblk(inode->i_sb, map.m_pblk); in ext4_getblk()
1003 memset(bh->b_data, 0, inode->i_sb->s_blocksize); in ext4_getblk()
1008 err = ext4_handle_dirty_metadata(handle, inode, bh); in ext4_getblk()
1019 struct buffer_head *ext4_bread(handle_t *handle, struct inode *inode, in ext4_bread() argument
1024 bh = ext4_getblk(handle, inode, block, map_flags); in ext4_bread()
1038 int ext4_bread_batch(struct inode *inode, ext4_lblk_t block, int bh_count, in ext4_bread_batch() argument
1044 bhs[i] = ext4_getblk(NULL, inode, block + i, 0 /* map_flags */); in ext4_bread_batch()
1167 struct inode *inode = page->mapping->host; in ext4_block_write_begin() local
1171 unsigned blocksize = inode->i_sb->s_blocksize; in ext4_block_write_begin()
1202 err = get_block(inode, block, bh, 1); in ext4_block_write_begin()
1240 } else if (IS_ENCRYPTED(inode) && S_ISREG(inode->i_mode)) { in ext4_block_write_begin()
1261 struct inode *inode = mapping->host; in ext4_write_begin() local
1269 if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb)))) in ext4_write_begin()
1272 trace_ext4_write_begin(inode, pos, len, flags); in ext4_write_begin()
1277 needed_blocks = ext4_writepage_trans_blocks(inode) + 1; in ext4_write_begin()
1282 if (ext4_test_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA)) { in ext4_write_begin()
1283 ret = ext4_try_to_write_inline_data(mapping, inode, pos, len, in ext4_write_begin()
1305 handle = ext4_journal_start(inode, EXT4_HT_WRITE_PAGE, needed_blocks); in ext4_write_begin()
1323 if (ext4_should_dioread_nolock(inode)) in ext4_write_begin()
1330 if (ext4_should_dioread_nolock(inode)) in ext4_write_begin()
1336 if (!ret && ext4_should_journal_data(inode)) { in ext4_write_begin()
1343 bool extended = (pos + len > inode->i_size) && in ext4_write_begin()
1344 !ext4_verity_in_progress(inode); in ext4_write_begin()
1355 if (extended && ext4_can_truncate(inode)) in ext4_write_begin()
1356 ext4_orphan_add(handle, inode); in ext4_write_begin()
1360 ext4_truncate_failed_write(inode); in ext4_write_begin()
1367 if (inode->i_nlink) in ext4_write_begin()
1368 ext4_orphan_del(NULL, inode); in ext4_write_begin()
1372 ext4_should_retry_alloc(inode->i_sb, &retries)) in ext4_write_begin()
1407 struct inode *inode = mapping->host; in ext4_write_end() local
1408 loff_t old_size = inode->i_size; in ext4_write_end()
1411 int inline_data = ext4_has_inline_data(inode); in ext4_write_end()
1412 bool verity = ext4_verity_in_progress(inode); in ext4_write_end()
1414 trace_ext4_write_end(inode, pos, len, copied); in ext4_write_end()
1416 ret = ext4_write_inline_data_end(inode, pos, len, in ext4_write_end()
1435 i_size_changed = ext4_update_inode_size(inode, pos + copied); in ext4_write_end()
1440 pagecache_isize_extended(inode, old_size, pos); in ext4_write_end()
1448 ext4_mark_inode_dirty(handle, inode); in ext4_write_end()
1450 if (pos + len > inode->i_size && !verity && ext4_can_truncate(inode)) in ext4_write_end()
1455 ext4_orphan_add(handle, inode); in ext4_write_end()
1461 if (pos + len > inode->i_size && !verity) { in ext4_write_end()
1462 ext4_truncate_failed_write(inode); in ext4_write_end()
1468 if (inode->i_nlink) in ext4_write_end()
1469 ext4_orphan_del(NULL, inode); in ext4_write_end()
1515 struct inode *inode = mapping->host; in ext4_journalled_write_end() local
1516 loff_t old_size = inode->i_size; in ext4_journalled_write_end()
1521 int inline_data = ext4_has_inline_data(inode); in ext4_journalled_write_end()
1522 bool verity = ext4_verity_in_progress(inode); in ext4_journalled_write_end()
1524 trace_ext4_journalled_write_end(inode, pos, len, copied); in ext4_journalled_write_end()
1531 ret = ext4_write_inline_data_end(inode, pos, len, in ext4_journalled_write_end()
1553 size_changed = ext4_update_inode_size(inode, pos + copied); in ext4_journalled_write_end()
1554 ext4_set_inode_state(inode, EXT4_STATE_JDATA); in ext4_journalled_write_end()
1555 EXT4_I(inode)->i_datasync_tid = handle->h_transaction->t_tid; in ext4_journalled_write_end()
1560 pagecache_isize_extended(inode, old_size, pos); in ext4_journalled_write_end()
1563 ret2 = ext4_mark_inode_dirty(handle, inode); in ext4_journalled_write_end()
1568 if (pos + len > inode->i_size && !verity && ext4_can_truncate(inode)) in ext4_journalled_write_end()
1573 ext4_orphan_add(handle, inode); in ext4_journalled_write_end()
1579 if (pos + len > inode->i_size && !verity) { in ext4_journalled_write_end()
1580 ext4_truncate_failed_write(inode); in ext4_journalled_write_end()
1586 if (inode->i_nlink) in ext4_journalled_write_end()
1587 ext4_orphan_del(NULL, inode); in ext4_journalled_write_end()
1596 static int ext4_da_reserve_space(struct inode *inode) in ext4_da_reserve_space() argument
1598 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_da_reserve_space()
1599 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_da_reserve_space()
1607 ret = dquot_reserve_block(inode, EXT4_C2B(sbi, 1)); in ext4_da_reserve_space()
1614 dquot_release_reservation_block(inode, EXT4_C2B(sbi, 1)); in ext4_da_reserve_space()
1618 trace_ext4_da_reserve_space(inode); in ext4_da_reserve_space()
1624 void ext4_da_release_space(struct inode *inode, int to_free) in ext4_da_release_space() argument
1626 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_da_release_space()
1627 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_da_release_space()
1632 spin_lock(&EXT4_I(inode)->i_block_reservation_lock); in ext4_da_release_space()
1634 trace_ext4_da_release_space(inode, to_free); in ext4_da_release_space()
1642 ext4_warning(inode->i_sb, "ext4_da_release_space: " in ext4_da_release_space()
1644 "data blocks", inode->i_ino, to_free, in ext4_da_release_space()
1654 spin_unlock(&EXT4_I(inode)->i_block_reservation_lock); in ext4_da_release_space()
1656 dquot_release_reservation_block(inode, EXT4_C2B(sbi, to_free)); in ext4_da_release_space()
1664 struct inode *inode; member
1686 struct inode *inode = mpd->inode; in mpage_release_unused_pages() local
1687 struct address_space *mapping = inode->i_mapping; in mpage_release_unused_pages()
1697 start = index << (PAGE_SHIFT - inode->i_blkbits); in mpage_release_unused_pages()
1698 last = end << (PAGE_SHIFT - inode->i_blkbits); in mpage_release_unused_pages()
1699 ext4_es_remove_extent(inode, start, last - start + 1); in mpage_release_unused_pages()
1724 static void ext4_print_free_blocks(struct inode *inode) in ext4_print_free_blocks() argument
1726 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_print_free_blocks()
1727 struct super_block *sb = inode->i_sb; in ext4_print_free_blocks()
1728 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_print_free_blocks()
1731 EXT4_C2B(EXT4_SB(inode->i_sb), in ext4_print_free_blocks()
1762 static int ext4_insert_delayed_block(struct inode *inode, ext4_lblk_t lblk) in ext4_insert_delayed_block() argument
1764 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_insert_delayed_block()
1780 ret = ext4_da_reserve_space(inode); in ext4_insert_delayed_block()
1784 if (!ext4_es_scan_clu(inode, &ext4_es_is_delonly, lblk)) { in ext4_insert_delayed_block()
1785 if (!ext4_es_scan_clu(inode, in ext4_insert_delayed_block()
1787 ret = ext4_clu_mapped(inode, in ext4_insert_delayed_block()
1792 ret = ext4_da_reserve_space(inode); in ext4_insert_delayed_block()
1804 ret = ext4_es_insert_delayed_block(inode, lblk, allocated); in ext4_insert_delayed_block()
1816 static int ext4_da_map_blocks(struct inode *inode, sector_t iblock, in ext4_da_map_blocks() argument
1829 if (invalid_block < ext4_blocks_count(EXT4_SB(inode->i_sb)->s_es)) in ext4_da_map_blocks()
1834 "logical block %lu\n", inode->i_ino, map->m_len, in ext4_da_map_blocks()
1838 if (ext4_es_lookup_extent(inode, iblock, NULL, &es)) { in ext4_da_map_blocks()
1841 down_read(&EXT4_I(inode)->i_data_sem); in ext4_da_map_blocks()
1850 map_bh(bh, inode->i_sb, invalid_block); in ext4_da_map_blocks()
1869 ext4_map_blocks_es_recheck(NULL, inode, map, &orig_map, 0); in ext4_da_map_blocks()
1878 down_read(&EXT4_I(inode)->i_data_sem); in ext4_da_map_blocks()
1879 if (ext4_has_inline_data(inode)) in ext4_da_map_blocks()
1881 else if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) in ext4_da_map_blocks()
1882 retval = ext4_ext_map_blocks(NULL, inode, map, 0); in ext4_da_map_blocks()
1884 retval = ext4_ind_map_blocks(NULL, inode, map, 0); in ext4_da_map_blocks()
1895 ret = ext4_insert_delayed_block(inode, map->m_lblk); in ext4_da_map_blocks()
1901 map_bh(bh, inode->i_sb, invalid_block); in ext4_da_map_blocks()
1909 ext4_warning(inode->i_sb, in ext4_da_map_blocks()
1912 inode->i_ino, retval, map->m_len); in ext4_da_map_blocks()
1918 ret = ext4_es_insert_extent(inode, map->m_lblk, map->m_len, in ext4_da_map_blocks()
1925 up_read((&EXT4_I(inode)->i_data_sem)); in ext4_da_map_blocks()
1942 int ext4_da_get_block_prep(struct inode *inode, sector_t iblock, in ext4_da_get_block_prep() argument
1949 BUG_ON(bh->b_size != inode->i_sb->s_blocksize); in ext4_da_get_block_prep()
1959 ret = ext4_da_map_blocks(inode, iblock, &map, bh); in ext4_da_get_block_prep()
1963 map_bh(bh, inode->i_sb, map.m_pblk); in ext4_da_get_block_prep()
1995 struct inode *inode = mapping->host; in __ext4_journalled_writepage() local
1999 int inline_data = ext4_has_inline_data(inode); in __ext4_journalled_writepage()
2006 BUG_ON(len > ext4_get_max_inline_size(inode)); in __ext4_journalled_writepage()
2007 inode_bh = ext4_journalled_write_inline_data(inode, len, page); in __ext4_journalled_writepage()
2027 handle = ext4_journal_start(inode, EXT4_HT_WRITE_PAGE, in __ext4_journalled_writepage()
2028 ext4_writepage_trans_blocks(inode)); in __ext4_journalled_writepage()
2046 ret = ext4_mark_inode_dirty(handle, inode); in __ext4_journalled_writepage()
2056 EXT4_I(inode)->i_datasync_tid = handle->h_transaction->t_tid; in __ext4_journalled_writepage()
2061 if (!ext4_has_inline_data(inode)) in __ext4_journalled_writepage()
2064 ext4_set_inode_state(inode, EXT4_STATE_JDATA); in __ext4_journalled_writepage()
2120 struct inode *inode = page->mapping->host; in ext4_writepage() local
2124 if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb)))) { in ext4_writepage()
2131 size = i_size_read(inode); in ext4_writepage()
2133 !ext4_verity_in_progress(inode)) in ext4_writepage()
2160 (inode->i_sb->s_blocksize == PAGE_SIZE)) { in ext4_writepage()
2174 if (PageChecked(page) && ext4_should_journal_data(inode)) in ext4_writepage()
2182 io_submit.io_end = ext4_init_io_end(inode, GFP_NOFS); in ext4_writepage()
2216 size = i_size_read(mpd->inode); in mpage_submit_page()
2218 !ext4_verity_in_progress(mpd->inode)) in mpage_submit_page()
2312 struct inode *inode = mpd->inode; in mpage_process_page_bufs() local
2314 ext4_lblk_t blocks = (i_size_read(inode) + i_blocksize(inode) - 1) in mpage_process_page_bufs()
2315 >> inode->i_blkbits; in mpage_process_page_bufs()
2317 if (ext4_verity_in_progress(inode)) in mpage_process_page_bufs()
2361 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()
2376 nr_pages = pagevec_lookup_range(&pvec, inode->i_mapping, in mpage_map_and_submit_buffers()
2438 struct inode *inode = mpd->inode; in mpage_map_one_extent() local
2443 trace_ext4_da_write_pages_extent(inode, map); in mpage_map_one_extent()
2462 dioread_nolock = ext4_should_dioread_nolock(inode); in mpage_map_one_extent()
2468 err = ext4_map_blocks(handle, inode, map, get_blocks_flags); in mpage_map_one_extent()
2477 ext4_set_io_unwritten_flag(inode, mpd->io_submit.io_end); in mpage_map_one_extent()
2508 struct inode *inode = mpd->inode; in mpage_map_and_submit_extent() local
2515 ((loff_t)map->m_lblk) << inode->i_blkbits; in mpage_map_and_submit_extent()
2519 struct super_block *sb = inode->i_sb; in mpage_map_and_submit_extent()
2539 inode->i_ino, in mpage_map_and_submit_extent()
2546 ext4_print_free_blocks(inode); in mpage_map_and_submit_extent()
2567 if (disksize > EXT4_I(inode)->i_disksize) { in mpage_map_and_submit_extent()
2571 down_write(&EXT4_I(inode)->i_data_sem); in mpage_map_and_submit_extent()
2572 i_size = i_size_read(inode); in mpage_map_and_submit_extent()
2575 if (disksize > EXT4_I(inode)->i_disksize) in mpage_map_and_submit_extent()
2576 EXT4_I(inode)->i_disksize = disksize; in mpage_map_and_submit_extent()
2577 up_write(&EXT4_I(inode)->i_data_sem); in mpage_map_and_submit_extent()
2578 err2 = ext4_mark_inode_dirty(handle, inode); in mpage_map_and_submit_extent()
2580 ext4_error(inode->i_sb, in mpage_map_and_submit_extent()
2582 inode->i_ino); in mpage_map_and_submit_extent()
2596 static int ext4_da_writepages_trans_blocks(struct inode *inode) in ext4_da_writepages_trans_blocks() argument
2598 int bpp = ext4_journal_blocks_per_page(inode); in ext4_da_writepages_trans_blocks()
2600 return ext4_meta_trans_blocks(inode, in ext4_da_writepages_trans_blocks()
2624 struct address_space *mapping = mpd->inode->i_mapping; in mpage_prepare_extent_to_map()
2632 int blkbits = mpd->inode->i_blkbits; in mpage_prepare_extent_to_map()
2718 struct inode *inode = mapping->host; in ext4_writepages() local
2725 if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb)))) in ext4_writepages()
2729 trace_ext4_writepages(inode, wbc); in ext4_writepages()
2739 if (ext4_should_journal_data(inode)) { in ext4_writepages()
2765 if (ext4_has_inline_data(inode)) { in ext4_writepages()
2767 handle = ext4_journal_start(inode, EXT4_HT_INODE, 1); in ext4_writepages()
2772 BUG_ON(ext4_test_inode_state(inode, in ext4_writepages()
2774 ext4_destroy_inline_data(handle, inode); in ext4_writepages()
2778 if (ext4_should_dioread_nolock(inode)) { in ext4_writepages()
2783 rsv_blocks = 1 + ext4_chunk_trans_blocks(inode, in ext4_writepages()
2784 PAGE_SIZE >> inode->i_blkbits); in ext4_writepages()
2801 mpd.inode = inode; in ext4_writepages()
2817 mpd.io_submit.io_end = ext4_init_io_end(inode, GFP_KERNEL); in ext4_writepages()
2834 mpd.io_submit.io_end = ext4_init_io_end(inode, GFP_KERNEL); in ext4_writepages()
2847 BUG_ON(ext4_should_journal_data(inode)); in ext4_writepages()
2848 needed_blocks = ext4_da_writepages_trans_blocks(inode); in ext4_writepages()
2851 handle = ext4_journal_start_with_reserve(inode, in ext4_writepages()
2855 ext4_msg(inode->i_sb, KERN_CRIT, "%s: jbd2_start: " in ext4_writepages()
2857 wbc->nr_to_write, inode->i_ino, ret); in ext4_writepages()
2865 trace_ext4_da_write_pages(inode, mpd.first_page, mpd.wbc); in ext4_writepages()
2947 trace_ext4_writepages_result(inode, wbc, ret, in ext4_writepages()
2958 struct inode *inode = mapping->host; in ext4_dax_writepages() local
2961 if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb)))) in ext4_dax_writepages()
2965 trace_ext4_writepages(inode, wbc); in ext4_dax_writepages()
2967 ret = dax_writeback_mapping_range(mapping, inode->i_sb->s_bdev, wbc); in ext4_dax_writepages()
2968 trace_ext4_writepages_result(inode, wbc, ret, in ext4_dax_writepages()
3009 static int ext4_da_write_credits(struct inode *inode, loff_t pos, unsigned len) in ext4_da_write_credits() argument
3011 if (likely(ext4_has_feature_large_file(inode->i_sb))) in ext4_da_write_credits()
3028 struct inode *inode = mapping->host; in ext4_da_write_begin() local
3031 if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb)))) in ext4_da_write_begin()
3036 if (ext4_nonda_switch(inode->i_sb) || S_ISLNK(inode->i_mode) || in ext4_da_write_begin()
3037 ext4_verity_in_progress(inode)) { in ext4_da_write_begin()
3043 trace_ext4_da_write_begin(inode, pos, len, flags); in ext4_da_write_begin()
3045 if (ext4_test_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA)) { in ext4_da_write_begin()
3046 ret = ext4_da_write_inline_data_begin(mapping, inode, in ext4_da_write_begin()
3075 handle = ext4_journal_start(inode, EXT4_HT_WRITE_PAGE, in ext4_da_write_begin()
3076 ext4_da_write_credits(inode, pos, len)); in ext4_da_write_begin()
3107 if (pos + len > inode->i_size) in ext4_da_write_begin()
3108 ext4_truncate_failed_write(inode); in ext4_da_write_begin()
3111 ext4_should_retry_alloc(inode->i_sb, &retries)) in ext4_da_write_begin()
3130 struct inode *inode = page->mapping->host; in ext4_da_should_update_i_disksize() local
3135 idx = offset >> inode->i_blkbits; in ext4_da_should_update_i_disksize()
3150 struct inode *inode = mapping->host; in ext4_da_write_end() local
3161 trace_ext4_da_write_end(inode, pos, len, copied); in ext4_da_write_end()
3171 if (copied && new_i_size > EXT4_I(inode)->i_disksize) { in ext4_da_write_end()
3172 if (ext4_has_inline_data(inode) || in ext4_da_write_end()
3174 ext4_update_i_disksize(inode, new_i_size); in ext4_da_write_end()
3179 ext4_mark_inode_dirty(handle, inode); in ext4_da_write_end()
3184 ext4_test_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA) && in ext4_da_write_end()
3185 ext4_has_inline_data(inode)) in ext4_da_write_end()
3186 ret2 = ext4_da_write_inline_data_end(inode, pos, len, copied, in ext4_da_write_end()
3205 int ext4_alloc_da_blocks(struct inode *inode) in ext4_alloc_da_blocks() argument
3207 trace_ext4_alloc_da_blocks(inode); in ext4_alloc_da_blocks()
3209 if (!EXT4_I(inode)->i_reserved_data_blocks) in ext4_alloc_da_blocks()
3243 return filemap_flush(inode->i_mapping); in ext4_alloc_da_blocks()
3262 struct inode *inode = mapping->host; in ext4_bmap() local
3269 if (ext4_has_inline_data(inode)) in ext4_bmap()
3273 test_opt(inode->i_sb, DELALLOC)) { in ext4_bmap()
3282 if (EXT4_JOURNAL(inode) && in ext4_bmap()
3283 ext4_test_inode_state(inode, EXT4_STATE_JDATA)) { in ext4_bmap()
3302 ext4_clear_inode_state(inode, EXT4_STATE_JDATA); in ext4_bmap()
3303 journal = EXT4_JOURNAL(inode); in ext4_bmap()
3318 struct inode *inode = page->mapping->host; in ext4_readpage() local
3322 if (ext4_has_inline_data(inode)) in ext4_readpage()
3323 ret = ext4_readpage_inline(inode, page); in ext4_readpage()
3336 struct inode *inode = mapping->host; in ext4_readpages() local
3339 if (ext4_has_inline_data(inode)) in ext4_readpages()
3396 static bool ext4_inode_datasync_dirty(struct inode *inode) in ext4_inode_datasync_dirty() argument
3398 journal_t *journal = EXT4_SB(inode->i_sb)->s_journal; in ext4_inode_datasync_dirty()
3402 EXT4_I(inode)->i_datasync_tid); in ext4_inode_datasync_dirty()
3404 if (!list_empty(&inode->i_mapping->private_list)) in ext4_inode_datasync_dirty()
3406 return inode->i_state & I_DIRTY_DATASYNC; in ext4_inode_datasync_dirty()
3409 static int ext4_iomap_begin(struct inode *inode, loff_t offset, loff_t length, in ext4_iomap_begin() argument
3412 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_iomap_begin()
3413 unsigned int blkbits = inode->i_blkbits; in ext4_iomap_begin()
3426 if (ext4_has_inline_data(inode)) { in ext4_iomap_begin()
3427 ret = ext4_inline_data_iomap(inode, iomap); in ext4_iomap_begin()
3435 if (WARN_ON_ONCE(ext4_has_inline_data(inode))) in ext4_iomap_begin()
3443 ret = ext4_map_blocks(NULL, inode, &map, 0); in ext4_iomap_begin()
3451 ext4_es_find_extent_range(inode, &ext4_es_is_delayed, in ext4_iomap_begin()
3477 dio_credits = ext4_chunk_trans_blocks(inode, map.m_len); in ext4_iomap_begin()
3485 handle = ext4_journal_start(inode, EXT4_HT_MAP_BLOCKS, in ext4_iomap_begin()
3490 ret = ext4_map_blocks(handle, inode, &map, in ext4_iomap_begin()
3495 ext4_should_retry_alloc(inode->i_sb, &retries)) in ext4_iomap_begin()
3510 (i_size_read(inode) + (1 << blkbits) - 1) >> blkbits) { in ext4_iomap_begin()
3513 err = ext4_orphan_add(handle, inode); in ext4_iomap_begin()
3521 ret = ext4_map_blocks(NULL, inode, &map, 0); in ext4_iomap_begin()
3527 if (ext4_inode_datasync_dirty(inode)) in ext4_iomap_begin()
3529 iomap->bdev = inode->i_sb->s_bdev; in ext4_iomap_begin()
3555 static int ext4_iomap_end(struct inode *inode, loff_t offset, loff_t length, in ext4_iomap_end() argument
3560 int blkbits = inode->i_blkbits; in ext4_iomap_end()
3566 handle = ext4_journal_start(inode, EXT4_HT_INODE, 2); in ext4_iomap_end()
3571 if (ext4_update_inode_size(inode, offset + written)) in ext4_iomap_end()
3572 ext4_mark_inode_dirty(handle, inode); in ext4_iomap_end()
3577 ALIGN(inode->i_size, 1 << blkbits)) { in ext4_iomap_end()
3582 if (written_blk < end_blk && ext4_can_truncate(inode)) in ext4_iomap_end()
3589 if (!truncate && inode->i_nlink && in ext4_iomap_end()
3590 !list_empty(&EXT4_I(inode)->i_orphan)) in ext4_iomap_end()
3591 ext4_orphan_del(handle, inode); in ext4_iomap_end()
3594 ext4_truncate_failed_write(inode); in ext4_iomap_end()
3601 if (inode->i_nlink) in ext4_iomap_end()
3602 ext4_orphan_del(NULL, inode); in ext4_iomap_end()
3623 io_end, io_end->inode->i_ino, iocb, offset, size); in ext4_end_io_dio()
3664 struct inode *inode = file->f_mapping->host; in ext4_direct_IO_write() local
3665 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_direct_IO_write()
3676 if (final_size > inode->i_size || final_size > ei->i_disksize) { in ext4_direct_IO_write()
3678 handle = ext4_journal_start(inode, EXT4_HT_INODE, 2); in ext4_direct_IO_write()
3683 ret = ext4_orphan_add(handle, inode); in ext4_direct_IO_write()
3689 ext4_update_i_disksize(inode, inode->i_size); in ext4_direct_IO_write()
3700 inode_dio_begin(inode); in ext4_direct_IO_write()
3706 inode_unlock(inode); in ext4_direct_IO_write()
3731 else if (!ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS) || in ext4_direct_IO_write()
3732 round_down(offset, i_blocksize(inode)) >= inode->i_size) { in ext4_direct_IO_write()
3742 ret = __blockdev_direct_IO(iocb, inode, inode->i_sb->s_bdev, iter, in ext4_direct_IO_write()
3746 if (ret > 0 && !overwrite && ext4_test_inode_state(inode, in ext4_direct_IO_write()
3753 err = ext4_convert_unwritten_extents(NULL, inode, in ext4_direct_IO_write()
3757 ext4_clear_inode_state(inode, EXT4_STATE_DIO_UNWRITTEN); in ext4_direct_IO_write()
3760 inode_dio_end(inode); in ext4_direct_IO_write()
3763 inode_lock(inode); in ext4_direct_IO_write()
3765 if (ret < 0 && final_size > inode->i_size) in ext4_direct_IO_write()
3766 ext4_truncate_failed_write(inode); in ext4_direct_IO_write()
3773 handle = ext4_journal_start(inode, EXT4_HT_INODE, 2); in ext4_direct_IO_write()
3787 if (inode->i_nlink) in ext4_direct_IO_write()
3788 ext4_orphan_del(NULL, inode); in ext4_direct_IO_write()
3792 if (inode->i_nlink) in ext4_direct_IO_write()
3793 ext4_orphan_del(handle, inode); in ext4_direct_IO_write()
3796 if (end > inode->i_size || end > ei->i_disksize) { in ext4_direct_IO_write()
3797 ext4_update_i_disksize(inode, end); in ext4_direct_IO_write()
3798 if (end > inode->i_size) in ext4_direct_IO_write()
3799 i_size_write(inode, end); in ext4_direct_IO_write()
3807 ext4_mark_inode_dirty(handle, inode); in ext4_direct_IO_write()
3821 struct inode *inode = mapping->host; in ext4_direct_IO_read() local
3830 inode_lock_shared(inode); in ext4_direct_IO_read()
3835 ret = __blockdev_direct_IO(iocb, inode, inode->i_sb->s_bdev, in ext4_direct_IO_read()
3838 inode_unlock_shared(inode); in ext4_direct_IO_read()
3845 struct inode *inode = file->f_mapping->host; in ext4_direct_IO() local
3851 if (IS_ENCRYPTED(inode) && S_ISREG(inode->i_mode)) in ext4_direct_IO()
3854 if (fsverity_active(inode)) in ext4_direct_IO()
3860 if (ext4_should_journal_data(inode)) in ext4_direct_IO()
3864 if (ext4_has_inline_data(inode)) in ext4_direct_IO()
3867 trace_ext4_direct_IO_enter(inode, offset, count, iov_iter_rw(iter)); in ext4_direct_IO()
3872 trace_ext4_direct_IO_exit(inode, offset, count, iov_iter_rw(iter), ret); in ext4_direct_IO()
3960 void ext4_set_aops(struct inode *inode) in ext4_set_aops() argument
3962 switch (ext4_inode_journal_mode(inode)) { in ext4_set_aops()
3967 inode->i_mapping->a_ops = &ext4_journalled_aops; in ext4_set_aops()
3972 if (IS_DAX(inode)) in ext4_set_aops()
3973 inode->i_mapping->a_ops = &ext4_dax_aops; in ext4_set_aops()
3974 else if (test_opt(inode->i_sb, DELALLOC)) in ext4_set_aops()
3975 inode->i_mapping->a_ops = &ext4_da_aops; in ext4_set_aops()
3977 inode->i_mapping->a_ops = &ext4_aops; in ext4_set_aops()
3987 struct inode *inode = mapping->host; in __ext4_block_zero_page_range() local
3997 blocksize = inode->i_sb->s_blocksize; in __ext4_block_zero_page_range()
3999 iblock = index << (PAGE_SHIFT - inode->i_sb->s_blocksize_bits); in __ext4_block_zero_page_range()
4018 ext4_get_block(inode, iblock, bh, 0); in __ext4_block_zero_page_range()
4037 if (S_ISREG(inode->i_mode) && IS_ENCRYPTED(inode)) { in __ext4_block_zero_page_range()
4039 BUG_ON(!fscrypt_has_encryption_key(inode)); in __ext4_block_zero_page_range()
4044 if (ext4_should_journal_data(inode)) { in __ext4_block_zero_page_range()
4053 if (ext4_should_journal_data(inode)) { in __ext4_block_zero_page_range()
4054 err = ext4_handle_dirty_metadata(handle, inode, bh); in __ext4_block_zero_page_range()
4058 if (ext4_should_order_data(inode)) in __ext4_block_zero_page_range()
4059 err = ext4_jbd2_inode_add_write(handle, inode, from, in __ext4_block_zero_page_range()
4079 struct inode *inode = mapping->host; in ext4_block_zero_page_range() local
4081 unsigned blocksize = inode->i_sb->s_blocksize; in ext4_block_zero_page_range()
4091 if (IS_DAX(inode)) { in ext4_block_zero_page_range()
4092 return iomap_zero_range(inode, from, length, NULL, in ext4_block_zero_page_range()
4110 struct inode *inode = mapping->host; in ext4_block_truncate_page() local
4113 if (IS_ENCRYPTED(inode) && !fscrypt_has_encryption_key(inode)) in ext4_block_truncate_page()
4116 blocksize = inode->i_sb->s_blocksize; in ext4_block_truncate_page()
4122 int ext4_zero_partial_blocks(handle_t *handle, struct inode *inode, in ext4_zero_partial_blocks() argument
4125 struct super_block *sb = inode->i_sb; in ext4_zero_partial_blocks()
4126 struct address_space *mapping = inode->i_mapping; in ext4_zero_partial_blocks()
4160 int ext4_can_truncate(struct inode *inode) in ext4_can_truncate() argument
4162 if (S_ISREG(inode->i_mode)) in ext4_can_truncate()
4164 if (S_ISDIR(inode->i_mode)) in ext4_can_truncate()
4166 if (S_ISLNK(inode->i_mode)) in ext4_can_truncate()
4167 return !ext4_inode_is_fast_symlink(inode); in ext4_can_truncate()
4177 int ext4_update_disksize_before_punch(struct inode *inode, loff_t offset, in ext4_update_disksize_before_punch() argument
4181 loff_t size = i_size_read(inode); in ext4_update_disksize_before_punch()
4183 WARN_ON(!inode_is_locked(inode)); in ext4_update_disksize_before_punch()
4187 if (EXT4_I(inode)->i_disksize >= size) in ext4_update_disksize_before_punch()
4190 handle = ext4_journal_start(inode, EXT4_HT_MISC, 1); in ext4_update_disksize_before_punch()
4193 ext4_update_i_disksize(inode, size); in ext4_update_disksize_before_punch()
4194 ext4_mark_inode_dirty(handle, inode); in ext4_update_disksize_before_punch()
4207 int ext4_break_layouts(struct inode *inode) in ext4_break_layouts() argument
4209 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_break_layouts()
4217 page = dax_layout_busy_page(inode->i_mapping); in ext4_break_layouts()
4241 int ext4_punch_hole(struct inode *inode, loff_t offset, loff_t length) in ext4_punch_hole() argument
4243 struct super_block *sb = inode->i_sb; in ext4_punch_hole()
4245 struct address_space *mapping = inode->i_mapping; in ext4_punch_hole()
4251 if (!S_ISREG(inode->i_mode)) in ext4_punch_hole()
4254 trace_ext4_punch_hole(inode, offset, length, 0); in ext4_punch_hole()
4256 ext4_clear_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA); in ext4_punch_hole()
4257 if (ext4_has_inline_data(inode)) { in ext4_punch_hole()
4258 down_write(&EXT4_I(inode)->i_mmap_sem); in ext4_punch_hole()
4259 ret = ext4_convert_inline_data(inode); in ext4_punch_hole()
4260 up_write(&EXT4_I(inode)->i_mmap_sem); in ext4_punch_hole()
4276 inode_lock(inode); in ext4_punch_hole()
4279 if (offset >= inode->i_size) in ext4_punch_hole()
4286 if (offset + length > inode->i_size) { in ext4_punch_hole()
4287 length = inode->i_size + in ext4_punch_hole()
4288 PAGE_SIZE - (inode->i_size & (PAGE_SIZE - 1)) - in ext4_punch_hole()
4298 ret = ext4_inode_attach_jinode(inode); in ext4_punch_hole()
4305 inode_dio_wait(inode); in ext4_punch_hole()
4311 down_write(&EXT4_I(inode)->i_mmap_sem); in ext4_punch_hole()
4313 ret = ext4_break_layouts(inode); in ext4_punch_hole()
4322 ret = ext4_update_disksize_before_punch(inode, offset, length); in ext4_punch_hole()
4325 truncate_pagecache_range(inode, first_block_offset, in ext4_punch_hole()
4329 if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) in ext4_punch_hole()
4330 credits = ext4_writepage_trans_blocks(inode); in ext4_punch_hole()
4332 credits = ext4_blocks_for_truncate(inode); in ext4_punch_hole()
4333 handle = ext4_journal_start(inode, EXT4_HT_TRUNCATE, credits); in ext4_punch_hole()
4340 ret = ext4_zero_partial_blocks(handle, inode, offset, in ext4_punch_hole()
4352 down_write(&EXT4_I(inode)->i_data_sem); in ext4_punch_hole()
4353 ext4_discard_preallocations(inode); in ext4_punch_hole()
4355 ret = ext4_es_remove_extent(inode, first_block, in ext4_punch_hole()
4358 up_write(&EXT4_I(inode)->i_data_sem); in ext4_punch_hole()
4362 if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) in ext4_punch_hole()
4363 ret = ext4_ext_remove_space(inode, first_block, in ext4_punch_hole()
4366 ret = ext4_ind_remove_space(handle, inode, first_block, in ext4_punch_hole()
4369 up_write(&EXT4_I(inode)->i_data_sem); in ext4_punch_hole()
4371 if (IS_SYNC(inode)) in ext4_punch_hole()
4374 inode->i_mtime = inode->i_ctime = current_time(inode); in ext4_punch_hole()
4375 ext4_mark_inode_dirty(handle, inode); in ext4_punch_hole()
4377 ext4_update_inode_fsync_trans(handle, inode, 1); in ext4_punch_hole()
4381 up_write(&EXT4_I(inode)->i_mmap_sem); in ext4_punch_hole()
4383 inode_unlock(inode); in ext4_punch_hole()
4387 int ext4_inode_attach_jinode(struct inode *inode) in ext4_inode_attach_jinode() argument
4389 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_inode_attach_jinode()
4392 if (ei->jinode || !EXT4_SB(inode->i_sb)->s_journal) in ext4_inode_attach_jinode()
4396 spin_lock(&inode->i_lock); in ext4_inode_attach_jinode()
4399 spin_unlock(&inode->i_lock); in ext4_inode_attach_jinode()
4403 jbd2_journal_init_jbd_inode(ei->jinode, inode); in ext4_inode_attach_jinode()
4406 spin_unlock(&inode->i_lock); in ext4_inode_attach_jinode()
4440 int ext4_truncate(struct inode *inode) in ext4_truncate() argument
4442 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_truncate()
4446 struct address_space *mapping = inode->i_mapping; in ext4_truncate()
4453 if (!(inode->i_state & (I_NEW|I_FREEING))) in ext4_truncate()
4454 WARN_ON(!inode_is_locked(inode)); in ext4_truncate()
4455 trace_ext4_truncate_enter(inode); in ext4_truncate()
4457 if (!ext4_can_truncate(inode)) in ext4_truncate()
4460 ext4_clear_inode_flag(inode, EXT4_INODE_EOFBLOCKS); in ext4_truncate()
4462 if (inode->i_size == 0 && !test_opt(inode->i_sb, NO_AUTO_DA_ALLOC)) in ext4_truncate()
4463 ext4_set_inode_state(inode, EXT4_STATE_DA_ALLOC_CLOSE); in ext4_truncate()
4465 if (ext4_has_inline_data(inode)) { in ext4_truncate()
4468 err = ext4_inline_data_truncate(inode, &has_inline); in ext4_truncate()
4476 if (inode->i_size & (inode->i_sb->s_blocksize - 1)) { in ext4_truncate()
4477 if (ext4_inode_attach_jinode(inode) < 0) in ext4_truncate()
4481 if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) in ext4_truncate()
4482 credits = ext4_writepage_trans_blocks(inode); in ext4_truncate()
4484 credits = ext4_blocks_for_truncate(inode); in ext4_truncate()
4486 handle = ext4_journal_start(inode, EXT4_HT_TRUNCATE, credits); in ext4_truncate()
4490 if (inode->i_size & (inode->i_sb->s_blocksize - 1)) in ext4_truncate()
4491 ext4_block_truncate_page(handle, mapping, inode->i_size); in ext4_truncate()
4502 err = ext4_orphan_add(handle, inode); in ext4_truncate()
4506 down_write(&EXT4_I(inode)->i_data_sem); in ext4_truncate()
4508 ext4_discard_preallocations(inode); in ext4_truncate()
4510 if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) in ext4_truncate()
4511 err = ext4_ext_truncate(handle, inode); in ext4_truncate()
4513 ext4_ind_truncate(handle, inode); in ext4_truncate()
4519 if (IS_SYNC(inode)) in ext4_truncate()
4530 if (inode->i_nlink) in ext4_truncate()
4531 ext4_orphan_del(handle, inode); in ext4_truncate()
4533 inode->i_mtime = inode->i_ctime = current_time(inode); in ext4_truncate()
4534 ext4_mark_inode_dirty(handle, inode); in ext4_truncate()
4537 trace_ext4_truncate_exit(inode); in ext4_truncate()
4547 static int __ext4_get_inode_loc(struct inode *inode, in __ext4_get_inode_loc() argument
4552 struct super_block *sb = inode->i_sb; in __ext4_get_inode_loc()
4558 if (inode->i_ino < EXT4_ROOT_INO || in __ext4_get_inode_loc()
4559 inode->i_ino > le32_to_cpu(EXT4_SB(sb)->s_es->s_inodes_count)) in __ext4_get_inode_loc()
4562 iloc->block_group = (inode->i_ino - 1) / EXT4_INODES_PER_GROUP(sb); in __ext4_get_inode_loc()
4571 inode_offset = ((inode->i_ino - 1) % in __ext4_get_inode_loc()
4670 trace_ext4_load_inode(inode); in __ext4_get_inode_loc()
4677 EXT4_ERROR_INODE_BLOCK(inode, block, in __ext4_get_inode_loc()
4688 int ext4_get_inode_loc(struct inode *inode, struct ext4_iloc *iloc) in ext4_get_inode_loc() argument
4691 return __ext4_get_inode_loc(inode, iloc, in ext4_get_inode_loc()
4692 !ext4_test_inode_state(inode, EXT4_STATE_XATTR)); in ext4_get_inode_loc()
4695 static bool ext4_should_use_dax(struct inode *inode) in ext4_should_use_dax() argument
4697 if (!test_opt(inode->i_sb, DAX)) in ext4_should_use_dax()
4699 if (!S_ISREG(inode->i_mode)) in ext4_should_use_dax()
4701 if (ext4_should_journal_data(inode)) in ext4_should_use_dax()
4703 if (ext4_has_inline_data(inode)) in ext4_should_use_dax()
4705 if (ext4_test_inode_flag(inode, EXT4_INODE_ENCRYPT)) in ext4_should_use_dax()
4707 if (ext4_test_inode_flag(inode, EXT4_INODE_VERITY)) in ext4_should_use_dax()
4712 void ext4_set_inode_flags(struct inode *inode) in ext4_set_inode_flags() argument
4714 unsigned int flags = EXT4_I(inode)->i_flags; in ext4_set_inode_flags()
4727 if (ext4_should_use_dax(inode)) in ext4_set_inode_flags()
4735 inode_set_flags(inode, new_fl, in ext4_set_inode_flags()
4744 struct inode *inode = &(ei->vfs_inode); in ext4_inode_blocks() local
4745 struct super_block *sb = inode->i_sb; in ext4_inode_blocks()
4751 if (ext4_test_inode_flag(inode, EXT4_INODE_HUGE_FILE)) { in ext4_inode_blocks()
4753 return i_blocks << (inode->i_blkbits - 9); in ext4_inode_blocks()
4762 static inline int ext4_iget_extra_inode(struct inode *inode, in ext4_iget_extra_inode() argument
4770 EXT4_INODE_SIZE(inode->i_sb) && in ext4_iget_extra_inode()
4772 ext4_set_inode_state(inode, EXT4_STATE_XATTR); in ext4_iget_extra_inode()
4773 return ext4_find_inline_data_nolock(inode); in ext4_iget_extra_inode()
4775 EXT4_I(inode)->i_inline_off = 0; in ext4_iget_extra_inode()
4779 int ext4_get_projid(struct inode *inode, kprojid_t *projid) in ext4_get_projid() argument
4781 if (!ext4_has_feature_project(inode->i_sb)) in ext4_get_projid()
4783 *projid = EXT4_I(inode)->i_projid; in ext4_get_projid()
4792 static inline void ext4_inode_set_iversion_queried(struct inode *inode, u64 val) in ext4_inode_set_iversion_queried() argument
4794 if (unlikely(EXT4_I(inode)->i_flags & EXT4_EA_INODE_FL)) in ext4_inode_set_iversion_queried()
4795 inode_set_iversion_raw(inode, val); in ext4_inode_set_iversion_queried()
4797 inode_set_iversion_queried(inode, val); in ext4_inode_set_iversion_queried()
4799 static inline u64 ext4_inode_peek_iversion(const struct inode *inode) in ext4_inode_peek_iversion() argument
4801 if (unlikely(EXT4_I(inode)->i_flags & EXT4_EA_INODE_FL)) in ext4_inode_peek_iversion()
4802 return inode_peek_iversion_raw(inode); in ext4_inode_peek_iversion()
4804 return inode_peek_iversion(inode); in ext4_inode_peek_iversion()
4807 struct inode *__ext4_iget(struct super_block *sb, unsigned long ino, in __ext4_iget()
4814 struct inode *inode; in __ext4_iget() local
4835 inode = iget_locked(sb, ino); in __ext4_iget()
4836 if (!inode) in __ext4_iget()
4838 if (!(inode->i_state & I_NEW)) in __ext4_iget()
4839 return inode; in __ext4_iget()
4841 ei = EXT4_I(inode); in __ext4_iget()
4844 ret = __ext4_get_inode_loc(inode, &iloc, 0); in __ext4_iget()
4850 ext4_error_inode(inode, function, line, 0, in __ext4_iget()
4862 if (EXT4_INODE_SIZE(inode->i_sb) > EXT4_GOOD_OLD_INODE_SIZE) { in __ext4_iget()
4865 EXT4_INODE_SIZE(inode->i_sb) || in __ext4_iget()
4867 ext4_error_inode(inode, function, line, 0, in __ext4_iget()
4871 EXT4_INODE_SIZE(inode->i_sb)); in __ext4_iget()
4880 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in __ext4_iget()
4882 __le32 inum = cpu_to_le32(inode->i_ino); in __ext4_iget()
4890 if (!ext4_inode_csum_verify(inode, raw_inode, ei)) { in __ext4_iget()
4891 ext4_error_inode(inode, function, line, 0, in __ext4_iget()
4897 inode->i_mode = le16_to_cpu(raw_inode->i_mode); in __ext4_iget()
4907 if (!(test_opt(inode->i_sb, NO_UID32))) { in __ext4_iget()
4911 i_uid_write(inode, i_uid); in __ext4_iget()
4912 i_gid_write(inode, i_gid); in __ext4_iget()
4914 set_nlink(inode, le16_to_cpu(raw_inode->i_links_count)); in __ext4_iget()
4925 if (inode->i_nlink == 0) { in __ext4_iget()
4926 if ((inode->i_mode == 0 || in __ext4_iget()
4927 !(EXT4_SB(inode->i_sb)->s_mount_state & EXT4_ORPHAN_FS)) && in __ext4_iget()
4941 ext4_set_inode_flags(inode); in __ext4_iget()
4942 inode->i_blocks = ext4_inode_blocks(raw_inode, ei); in __ext4_iget()
4947 inode->i_size = ext4_isize(sb, raw_inode); in __ext4_iget()
4948 if ((size = i_size_read(inode)) < 0) { in __ext4_iget()
4949 ext4_error_inode(inode, function, line, 0, in __ext4_iget()
4954 ei->i_disksize = inode->i_size; in __ext4_iget()
4958 inode->i_generation = le32_to_cpu(raw_inode->i_generation); in __ext4_iget()
4994 if (EXT4_INODE_SIZE(inode->i_sb) > EXT4_GOOD_OLD_INODE_SIZE) { in __ext4_iget()
5001 ret = ext4_iget_extra_inode(inode, raw_inode, ei); in __ext4_iget()
5007 EXT4_INODE_GET_XTIME(i_ctime, inode, raw_inode); in __ext4_iget()
5008 EXT4_INODE_GET_XTIME(i_mtime, inode, raw_inode); in __ext4_iget()
5009 EXT4_INODE_GET_XTIME(i_atime, inode, raw_inode); in __ext4_iget()
5012 if (likely(!test_opt2(inode->i_sb, HURD_COMPAT))) { in __ext4_iget()
5015 if (EXT4_INODE_SIZE(inode->i_sb) > EXT4_GOOD_OLD_INODE_SIZE) { in __ext4_iget()
5020 ext4_inode_set_iversion_queried(inode, ivers); in __ext4_iget()
5026 ext4_error_inode(inode, function, line, 0, in __ext4_iget()
5031 } else if (!ext4_has_inline_data(inode)) { in __ext4_iget()
5033 if (S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || in __ext4_iget()
5034 (S_ISLNK(inode->i_mode) && in __ext4_iget()
5035 !ext4_inode_is_fast_symlink(inode))) { in __ext4_iget()
5036 if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) in __ext4_iget()
5037 ret = ext4_ext_check_inode(inode); in __ext4_iget()
5039 ret = ext4_ind_check_inode(inode); in __ext4_iget()
5045 if (S_ISREG(inode->i_mode)) { in __ext4_iget()
5046 inode->i_op = &ext4_file_inode_operations; in __ext4_iget()
5047 inode->i_fop = &ext4_file_operations; in __ext4_iget()
5048 ext4_set_aops(inode); in __ext4_iget()
5049 } else if (S_ISDIR(inode->i_mode)) { in __ext4_iget()
5050 inode->i_op = &ext4_dir_inode_operations; in __ext4_iget()
5051 inode->i_fop = &ext4_dir_operations; in __ext4_iget()
5052 } else if (S_ISLNK(inode->i_mode)) { in __ext4_iget()
5054 if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) { in __ext4_iget()
5055 ext4_error_inode(inode, function, line, 0, in __ext4_iget()
5061 if (IS_ENCRYPTED(inode)) { in __ext4_iget()
5062 inode->i_op = &ext4_encrypted_symlink_inode_operations; in __ext4_iget()
5063 ext4_set_aops(inode); in __ext4_iget()
5064 } else if (ext4_inode_is_fast_symlink(inode)) { in __ext4_iget()
5065 inode->i_link = (char *)ei->i_data; in __ext4_iget()
5066 inode->i_op = &ext4_fast_symlink_inode_operations; in __ext4_iget()
5067 nd_terminate_link(ei->i_data, inode->i_size, in __ext4_iget()
5070 inode->i_op = &ext4_symlink_inode_operations; in __ext4_iget()
5071 ext4_set_aops(inode); in __ext4_iget()
5073 inode_nohighmem(inode); in __ext4_iget()
5074 } else if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode) || in __ext4_iget()
5075 S_ISFIFO(inode->i_mode) || S_ISSOCK(inode->i_mode)) { in __ext4_iget()
5076 inode->i_op = &ext4_special_inode_operations; in __ext4_iget()
5078 init_special_inode(inode, inode->i_mode, in __ext4_iget()
5081 init_special_inode(inode, inode->i_mode, in __ext4_iget()
5084 make_bad_inode(inode); in __ext4_iget()
5087 ext4_error_inode(inode, function, line, 0, in __ext4_iget()
5088 "iget: bogus i_mode (%o)", inode->i_mode); in __ext4_iget()
5091 if (IS_CASEFOLDED(inode) && !ext4_has_feature_casefold(inode->i_sb)) in __ext4_iget()
5092 ext4_error_inode(inode, function, line, 0, in __ext4_iget()
5096 unlock_new_inode(inode); in __ext4_iget()
5097 return inode; in __ext4_iget()
5101 iget_failed(inode); in __ext4_iget()
5109 struct inode *inode = &(ei->vfs_inode); in ext4_inode_blocks_set() local
5110 u64 i_blocks = inode->i_blocks; in ext4_inode_blocks_set()
5111 struct super_block *sb = inode->i_sb; in ext4_inode_blocks_set()
5120 ext4_clear_inode_flag(inode, EXT4_INODE_HUGE_FILE); in ext4_inode_blocks_set()
5133 ext4_clear_inode_flag(inode, EXT4_INODE_HUGE_FILE); in ext4_inode_blocks_set()
5135 ext4_set_inode_flag(inode, EXT4_INODE_HUGE_FILE); in ext4_inode_blocks_set()
5137 i_blocks = i_blocks >> (inode->i_blkbits - 9); in ext4_inode_blocks_set()
5149 static int other_inode_match(struct inode * inode, unsigned long ino, in other_inode_match() argument
5154 if ((inode->i_ino != ino) || in other_inode_match()
5155 (inode->i_state & (I_FREEING | I_WILL_FREE | I_NEW | in other_inode_match()
5157 ((inode->i_state & I_DIRTY_TIME) == 0)) in other_inode_match()
5159 spin_lock(&inode->i_lock); in other_inode_match()
5160 if (((inode->i_state & (I_FREEING | I_WILL_FREE | I_NEW | in other_inode_match()
5162 (inode->i_state & I_DIRTY_TIME)) { in other_inode_match()
5163 struct ext4_inode_info *ei = EXT4_I(inode); in other_inode_match()
5165 inode->i_state &= ~(I_DIRTY_TIME | I_DIRTY_TIME_EXPIRED); in other_inode_match()
5166 spin_unlock(&inode->i_lock); in other_inode_match()
5169 EXT4_INODE_SET_XTIME(i_ctime, inode, oi->raw_inode); in other_inode_match()
5170 EXT4_INODE_SET_XTIME(i_mtime, inode, oi->raw_inode); in other_inode_match()
5171 EXT4_INODE_SET_XTIME(i_atime, inode, oi->raw_inode); in other_inode_match()
5172 ext4_inode_csum_set(inode, oi->raw_inode, ei); in other_inode_match()
5174 trace_ext4_other_inode_update_time(inode, oi->orig_ino); in other_inode_match()
5177 spin_unlock(&inode->i_lock); in other_inode_match()
5216 struct inode *inode, in ext4_do_update_inode() argument
5220 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_do_update_inode()
5222 struct super_block *sb = inode->i_sb; in ext4_do_update_inode()
5233 if (ext4_test_inode_state(inode, EXT4_STATE_NEW)) in ext4_do_update_inode()
5234 memset(raw_inode, 0, EXT4_SB(inode->i_sb)->s_inode_size); in ext4_do_update_inode()
5236 raw_inode->i_mode = cpu_to_le16(inode->i_mode); in ext4_do_update_inode()
5237 i_uid = i_uid_read(inode); in ext4_do_update_inode()
5238 i_gid = i_gid_read(inode); in ext4_do_update_inode()
5240 if (!(test_opt(inode->i_sb, NO_UID32))) { in ext4_do_update_inode()
5262 raw_inode->i_links_count = cpu_to_le16(inode->i_nlink); in ext4_do_update_inode()
5264 EXT4_INODE_SET_XTIME(i_ctime, inode, raw_inode); in ext4_do_update_inode()
5265 EXT4_INODE_SET_XTIME(i_mtime, inode, raw_inode); in ext4_do_update_inode()
5266 EXT4_INODE_SET_XTIME(i_atime, inode, raw_inode); in ext4_do_update_inode()
5276 if (likely(!test_opt2(inode->i_sb, HURD_COMPAT))) in ext4_do_update_inode()
5280 if (ei->i_disksize != ext4_isize(inode->i_sb, raw_inode)) { in ext4_do_update_inode()
5290 raw_inode->i_generation = cpu_to_le32(inode->i_generation); in ext4_do_update_inode()
5291 if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) { in ext4_do_update_inode()
5292 if (old_valid_dev(inode->i_rdev)) { in ext4_do_update_inode()
5294 cpu_to_le32(old_encode_dev(inode->i_rdev)); in ext4_do_update_inode()
5299 cpu_to_le32(new_encode_dev(inode->i_rdev)); in ext4_do_update_inode()
5302 } else if (!ext4_has_inline_data(inode)) { in ext4_do_update_inode()
5307 if (likely(!test_opt2(inode->i_sb, HURD_COMPAT))) { in ext4_do_update_inode()
5308 u64 ivers = ext4_inode_peek_iversion(inode); in ext4_do_update_inode()
5320 BUG_ON(!ext4_has_feature_project(inode->i_sb) && in ext4_do_update_inode()
5323 if (EXT4_INODE_SIZE(inode->i_sb) > EXT4_GOOD_OLD_INODE_SIZE && in ext4_do_update_inode()
5327 ext4_inode_csum_set(inode, raw_inode, ei); in ext4_do_update_inode()
5329 if (inode->i_sb->s_flags & SB_LAZYTIME) in ext4_do_update_inode()
5330 ext4_update_other_inodes_time(inode->i_sb, inode->i_ino, in ext4_do_update_inode()
5337 ext4_clear_inode_state(inode, EXT4_STATE_NEW); in ext4_do_update_inode()
5347 ext4_update_inode_fsync_trans(handle, inode, need_datasync); in ext4_do_update_inode()
5350 ext4_std_error(inode->i_sb, err); in ext4_do_update_inode()
5388 int ext4_write_inode(struct inode *inode, struct writeback_control *wbc) in ext4_write_inode() argument
5393 sb_rdonly(inode->i_sb)) in ext4_write_inode()
5396 if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb)))) in ext4_write_inode()
5399 if (EXT4_SB(inode->i_sb)->s_journal) { in ext4_write_inode()
5414 err = jbd2_complete_transaction(EXT4_SB(inode->i_sb)->s_journal, in ext4_write_inode()
5415 EXT4_I(inode)->i_sync_tid); in ext4_write_inode()
5419 err = __ext4_get_inode_loc(inode, &iloc, 0); in ext4_write_inode()
5429 EXT4_ERROR_INODE_BLOCK(inode, iloc.bh->b_blocknr, in ext4_write_inode()
5443 static void ext4_wait_for_tail_page_commit(struct inode *inode) in ext4_wait_for_tail_page_commit() argument
5447 journal_t *journal = EXT4_SB(inode->i_sb)->s_journal; in ext4_wait_for_tail_page_commit()
5451 offset = inode->i_size & (PAGE_SIZE - 1); in ext4_wait_for_tail_page_commit()
5457 if (offset > PAGE_SIZE - i_blocksize(inode)) in ext4_wait_for_tail_page_commit()
5460 page = find_lock_page(inode->i_mapping, in ext4_wait_for_tail_page_commit()
5461 inode->i_size >> PAGE_SHIFT); in ext4_wait_for_tail_page_commit()
5506 struct inode *inode = d_inode(dentry); in ext4_setattr() local
5511 if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb)))) in ext4_setattr()
5514 if (unlikely(IS_IMMUTABLE(inode))) in ext4_setattr()
5517 if (unlikely(IS_APPEND(inode) && in ext4_setattr()
5534 if (is_quota_modification(inode, attr)) { in ext4_setattr()
5535 error = dquot_initialize(inode); in ext4_setattr()
5539 if ((ia_valid & ATTR_UID && !uid_eq(attr->ia_uid, inode->i_uid)) || in ext4_setattr()
5540 (ia_valid & ATTR_GID && !gid_eq(attr->ia_gid, inode->i_gid))) { in ext4_setattr()
5545 handle = ext4_journal_start(inode, EXT4_HT_QUOTA, in ext4_setattr()
5546 (EXT4_MAXQUOTAS_INIT_BLOCKS(inode->i_sb) + in ext4_setattr()
5547 EXT4_MAXQUOTAS_DEL_BLOCKS(inode->i_sb)) + 3); in ext4_setattr()
5556 down_read(&EXT4_I(inode)->xattr_sem); in ext4_setattr()
5557 error = dquot_transfer(inode, attr); in ext4_setattr()
5558 up_read(&EXT4_I(inode)->xattr_sem); in ext4_setattr()
5567 inode->i_uid = attr->ia_uid; in ext4_setattr()
5569 inode->i_gid = attr->ia_gid; in ext4_setattr()
5570 error = ext4_mark_inode_dirty(handle, inode); in ext4_setattr()
5576 loff_t oldsize = inode->i_size; in ext4_setattr()
5577 int shrink = (attr->ia_size < inode->i_size); in ext4_setattr()
5579 if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) { in ext4_setattr()
5580 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_setattr()
5585 if (!S_ISREG(inode->i_mode)) in ext4_setattr()
5588 if (IS_I_VERSION(inode) && attr->ia_size != inode->i_size) in ext4_setattr()
5589 inode_inc_iversion(inode); in ext4_setattr()
5592 if (ext4_should_order_data(inode)) { in ext4_setattr()
5593 error = ext4_begin_ordered_truncate(inode, in ext4_setattr()
5602 inode_dio_wait(inode); in ext4_setattr()
5605 down_write(&EXT4_I(inode)->i_mmap_sem); in ext4_setattr()
5607 rc = ext4_break_layouts(inode); in ext4_setattr()
5609 up_write(&EXT4_I(inode)->i_mmap_sem); in ext4_setattr()
5613 if (attr->ia_size != inode->i_size) { in ext4_setattr()
5614 handle = ext4_journal_start(inode, EXT4_HT_INODE, 3); in ext4_setattr()
5620 error = ext4_orphan_add(handle, inode); in ext4_setattr()
5628 inode->i_mtime = current_time(inode); in ext4_setattr()
5629 inode->i_ctime = inode->i_mtime; in ext4_setattr()
5631 down_write(&EXT4_I(inode)->i_data_sem); in ext4_setattr()
5632 EXT4_I(inode)->i_disksize = attr->ia_size; in ext4_setattr()
5633 rc = ext4_mark_inode_dirty(handle, inode); in ext4_setattr()
5642 i_size_write(inode, attr->ia_size); in ext4_setattr()
5643 up_write(&EXT4_I(inode)->i_data_sem); in ext4_setattr()
5648 pagecache_isize_extended(inode, oldsize, in ext4_setattr()
5649 inode->i_size); in ext4_setattr()
5650 } else if (ext4_should_journal_data(inode)) { in ext4_setattr()
5651 ext4_wait_for_tail_page_commit(inode); in ext4_setattr()
5659 truncate_pagecache(inode, inode->i_size); in ext4_setattr()
5665 rc = ext4_truncate(inode); in ext4_setattr()
5670 up_write(&EXT4_I(inode)->i_mmap_sem); in ext4_setattr()
5674 setattr_copy(inode, attr); in ext4_setattr()
5675 mark_inode_dirty(inode); in ext4_setattr()
5682 if (orphan && inode->i_nlink) in ext4_setattr()
5683 ext4_orphan_del(NULL, inode); in ext4_setattr()
5686 rc = posix_acl_chmod(inode, inode->i_mode); in ext4_setattr()
5689 ext4_std_error(inode->i_sb, error); in ext4_setattr()
5698 struct inode *inode = d_inode(path->dentry); in ext4_getattr() local
5700 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_getattr()
5727 generic_fillattr(inode, stat); in ext4_getattr()
5734 struct inode *inode = d_inode(path->dentry); in ext4_file_getattr() local
5745 if (unlikely(ext4_has_inline_data(inode))) in ext4_file_getattr()
5758 delalloc_blocks = EXT4_C2B(EXT4_SB(inode->i_sb), in ext4_file_getattr()
5759 EXT4_I(inode)->i_reserved_data_blocks); in ext4_file_getattr()
5760 stat->blocks += delalloc_blocks << (inode->i_sb->s_blocksize_bits - 9); in ext4_file_getattr()
5764 static int ext4_index_trans_blocks(struct inode *inode, int lblocks, in ext4_index_trans_blocks() argument
5767 if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) in ext4_index_trans_blocks()
5768 return ext4_ind_trans_blocks(inode, lblocks); in ext4_index_trans_blocks()
5769 return ext4_ext_index_trans_blocks(inode, pextents); in ext4_index_trans_blocks()
5783 static int ext4_meta_trans_blocks(struct inode *inode, int lblocks, in ext4_meta_trans_blocks() argument
5786 ext4_group_t groups, ngroups = ext4_get_groups_count(inode->i_sb); in ext4_meta_trans_blocks()
5795 idxblocks = ext4_index_trans_blocks(inode, lblocks, pextents); in ext4_meta_trans_blocks()
5807 if (groups > EXT4_SB(inode->i_sb)->s_gdb_count) in ext4_meta_trans_blocks()
5808 gdpblocks = EXT4_SB(inode->i_sb)->s_gdb_count; in ext4_meta_trans_blocks()
5814 ret += EXT4_META_TRANS_BLOCKS(inode->i_sb); in ext4_meta_trans_blocks()
5829 int ext4_writepage_trans_blocks(struct inode *inode) in ext4_writepage_trans_blocks() argument
5831 int bpp = ext4_journal_blocks_per_page(inode); in ext4_writepage_trans_blocks()
5834 ret = ext4_meta_trans_blocks(inode, bpp, bpp); in ext4_writepage_trans_blocks()
5837 if (ext4_should_journal_data(inode)) in ext4_writepage_trans_blocks()
5851 int ext4_chunk_trans_blocks(struct inode *inode, int nrblocks) in ext4_chunk_trans_blocks() argument
5853 return ext4_meta_trans_blocks(inode, nrblocks, 1); in ext4_chunk_trans_blocks()
5861 struct inode *inode, struct ext4_iloc *iloc) in ext4_mark_iloc_dirty() argument
5865 if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb)))) { in ext4_mark_iloc_dirty()
5869 if (IS_I_VERSION(inode)) in ext4_mark_iloc_dirty()
5870 inode_inc_iversion(inode); in ext4_mark_iloc_dirty()
5876 err = ext4_do_update_inode(handle, inode, iloc); in ext4_mark_iloc_dirty()
5887 ext4_reserve_inode_write(handle_t *handle, struct inode *inode, in ext4_reserve_inode_write() argument
5892 if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb)))) in ext4_reserve_inode_write()
5895 err = ext4_get_inode_loc(inode, iloc); in ext4_reserve_inode_write()
5904 ext4_std_error(inode->i_sb, err); in ext4_reserve_inode_write()
5908 static int __ext4_expand_extra_isize(struct inode *inode, in __ext4_expand_extra_isize() argument
5919 header = IHDR(inode, raw_inode); in __ext4_expand_extra_isize()
5922 if (!ext4_test_inode_state(inode, EXT4_STATE_XATTR) || in __ext4_expand_extra_isize()
5925 EXT4_I(inode)->i_extra_isize, 0, in __ext4_expand_extra_isize()
5926 new_extra_isize - EXT4_I(inode)->i_extra_isize); in __ext4_expand_extra_isize()
5927 EXT4_I(inode)->i_extra_isize = new_extra_isize; in __ext4_expand_extra_isize()
5932 error = ext4_expand_extra_isize_ea(inode, new_extra_isize, in __ext4_expand_extra_isize()
5948 static int ext4_try_to_expand_extra_isize(struct inode *inode, in ext4_try_to_expand_extra_isize() argument
5956 if (ext4_test_inode_state(inode, EXT4_STATE_NO_EXPAND)) in ext4_try_to_expand_extra_isize()
5970 EXT4_DATA_TRANS_BLOCKS(inode->i_sb)) != 0) in ext4_try_to_expand_extra_isize()
5973 if (ext4_write_trylock_xattr(inode, &no_expand) == 0) in ext4_try_to_expand_extra_isize()
5976 error = __ext4_expand_extra_isize(inode, new_extra_isize, &iloc, in ext4_try_to_expand_extra_isize()
5978 ext4_write_unlock_xattr(inode, &no_expand); in ext4_try_to_expand_extra_isize()
5983 int ext4_expand_extra_isize(struct inode *inode, in ext4_expand_extra_isize() argument
5991 if (ext4_test_inode_state(inode, EXT4_STATE_NO_EXPAND)) { in ext4_expand_extra_isize()
5996 handle = ext4_journal_start(inode, EXT4_HT_INODE, in ext4_expand_extra_isize()
5997 EXT4_DATA_TRANS_BLOCKS(inode->i_sb)); in ext4_expand_extra_isize()
6004 ext4_write_lock_xattr(inode, &no_expand); in ext4_expand_extra_isize()
6013 error = __ext4_expand_extra_isize(inode, new_extra_isize, iloc, in ext4_expand_extra_isize()
6016 rc = ext4_mark_iloc_dirty(handle, inode, iloc); in ext4_expand_extra_isize()
6020 ext4_write_unlock_xattr(inode, &no_expand); in ext4_expand_extra_isize()
6039 int ext4_mark_inode_dirty(handle_t *handle, struct inode *inode) in ext4_mark_inode_dirty() argument
6042 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_mark_inode_dirty()
6046 trace_ext4_mark_inode_dirty(inode, _RET_IP_); in ext4_mark_inode_dirty()
6047 err = ext4_reserve_inode_write(handle, inode, &iloc); in ext4_mark_inode_dirty()
6051 if (EXT4_I(inode)->i_extra_isize < sbi->s_want_extra_isize) in ext4_mark_inode_dirty()
6052 ext4_try_to_expand_extra_isize(inode, sbi->s_want_extra_isize, in ext4_mark_inode_dirty()
6055 return ext4_mark_iloc_dirty(handle, inode, &iloc); in ext4_mark_inode_dirty()
6076 void ext4_dirty_inode(struct inode *inode, int flags) in ext4_dirty_inode() argument
6082 handle = ext4_journal_start(inode, EXT4_HT_INODE, 2); in ext4_dirty_inode()
6086 ext4_mark_inode_dirty(handle, inode); in ext4_dirty_inode()
6093 int ext4_change_inode_journal_flag(struct inode *inode, int val) in ext4_change_inode_journal_flag() argument
6098 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_change_inode_journal_flag()
6110 journal = EXT4_JOURNAL(inode); in ext4_change_inode_journal_flag()
6117 inode_dio_wait(inode); in ext4_change_inode_journal_flag()
6128 down_write(&EXT4_I(inode)->i_mmap_sem); in ext4_change_inode_journal_flag()
6129 err = filemap_write_and_wait(inode->i_mapping); in ext4_change_inode_journal_flag()
6131 up_write(&EXT4_I(inode)->i_mmap_sem); in ext4_change_inode_journal_flag()
6148 ext4_set_inode_flag(inode, EXT4_INODE_JOURNAL_DATA); in ext4_change_inode_journal_flag()
6156 ext4_clear_inode_flag(inode, EXT4_INODE_JOURNAL_DATA); in ext4_change_inode_journal_flag()
6158 ext4_set_aops(inode); in ext4_change_inode_journal_flag()
6164 up_write(&EXT4_I(inode)->i_mmap_sem); in ext4_change_inode_journal_flag()
6168 handle = ext4_journal_start(inode, EXT4_HT_INODE, 1); in ext4_change_inode_journal_flag()
6172 err = ext4_mark_inode_dirty(handle, inode); in ext4_change_inode_journal_flag()
6175 ext4_std_error(inode->i_sb, err); in ext4_change_inode_journal_flag()
6194 struct inode *inode = file_inode(file); in ext4_page_mkwrite() local
6195 struct address_space *mapping = inode->i_mapping; in ext4_page_mkwrite()
6200 if (unlikely(IS_IMMUTABLE(inode))) in ext4_page_mkwrite()
6203 sb_start_pagefault(inode->i_sb); in ext4_page_mkwrite()
6206 down_read(&EXT4_I(inode)->i_mmap_sem); in ext4_page_mkwrite()
6208 err = ext4_convert_inline_data(inode); in ext4_page_mkwrite()
6213 if (test_opt(inode->i_sb, DELALLOC) && in ext4_page_mkwrite()
6214 !ext4_should_journal_data(inode) && in ext4_page_mkwrite()
6215 !ext4_nonda_switch(inode->i_sb)) { in ext4_page_mkwrite()
6220 ext4_should_retry_alloc(inode->i_sb, &retries)); in ext4_page_mkwrite()
6225 size = i_size_read(inode); in ext4_page_mkwrite()
6253 if (ext4_should_dioread_nolock(inode)) in ext4_page_mkwrite()
6258 handle = ext4_journal_start(inode, EXT4_HT_WRITE_PAGE, in ext4_page_mkwrite()
6259 ext4_writepage_trans_blocks(inode)); in ext4_page_mkwrite()
6265 if (!err && ext4_should_journal_data(inode)) { in ext4_page_mkwrite()
6273 ext4_set_inode_state(inode, EXT4_STATE_JDATA); in ext4_page_mkwrite()
6276 if (err == -ENOSPC && ext4_should_retry_alloc(inode->i_sb, &retries)) in ext4_page_mkwrite()
6281 up_read(&EXT4_I(inode)->i_mmap_sem); in ext4_page_mkwrite()
6282 sb_end_pagefault(inode->i_sb); in ext4_page_mkwrite()
6288 struct inode *inode = file_inode(vmf->vma->vm_file); in ext4_filemap_fault() local
6291 down_read(&EXT4_I(inode)->i_mmap_sem); in ext4_filemap_fault()
6293 up_read(&EXT4_I(inode)->i_mmap_sem); in ext4_filemap_fault()