Lines Matching refs:inode
51 static __u32 ext4_inode_csum(struct inode *inode, struct ext4_inode *raw, in ext4_inode_csum() argument
54 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_inode_csum()
66 if (EXT4_INODE_SIZE(inode->i_sb) > EXT4_GOOD_OLD_INODE_SIZE) { in ext4_inode_csum()
77 EXT4_INODE_SIZE(inode->i_sb) - offset); in ext4_inode_csum()
83 static int ext4_inode_csum_verify(struct inode *inode, struct ext4_inode *raw, in ext4_inode_csum_verify() argument
88 if (EXT4_SB(inode->i_sb)->s_es->s_creator_os != in ext4_inode_csum_verify()
90 !ext4_has_metadata_csum(inode->i_sb)) in ext4_inode_csum_verify()
94 calculated = ext4_inode_csum(inode, raw, ei); in ext4_inode_csum_verify()
95 if (EXT4_INODE_SIZE(inode->i_sb) > EXT4_GOOD_OLD_INODE_SIZE && in ext4_inode_csum_verify()
104 static void ext4_inode_csum_set(struct inode *inode, struct ext4_inode *raw, in ext4_inode_csum_set() argument
109 if (EXT4_SB(inode->i_sb)->s_es->s_creator_os != in ext4_inode_csum_set()
111 !ext4_has_metadata_csum(inode->i_sb)) in ext4_inode_csum_set()
114 csum = ext4_inode_csum(inode, raw, ei); in ext4_inode_csum_set()
116 if (EXT4_INODE_SIZE(inode->i_sb) > EXT4_GOOD_OLD_INODE_SIZE && in ext4_inode_csum_set()
121 static inline int ext4_begin_ordered_truncate(struct inode *inode, in ext4_begin_ordered_truncate() argument
124 trace_ext4_begin_ordered_truncate(inode, new_size); in ext4_begin_ordered_truncate()
131 if (!EXT4_I(inode)->jinode) in ext4_begin_ordered_truncate()
133 return jbd2_journal_begin_ordered_truncate(EXT4_JOURNAL(inode), in ext4_begin_ordered_truncate()
134 EXT4_I(inode)->jinode, in ext4_begin_ordered_truncate()
142 static int ext4_meta_trans_blocks(struct inode *inode, int lblocks,
148 int ext4_inode_is_fast_symlink(struct inode *inode) in ext4_inode_is_fast_symlink() argument
150 int ea_blocks = EXT4_I(inode)->i_file_acl ? in ext4_inode_is_fast_symlink()
151 EXT4_CLUSTER_SIZE(inode->i_sb) >> 9 : 0; in ext4_inode_is_fast_symlink()
153 if (ext4_has_inline_data(inode)) in ext4_inode_is_fast_symlink()
156 return (S_ISLNK(inode->i_mode) && inode->i_blocks - ea_blocks == 0); in ext4_inode_is_fast_symlink()
164 int ext4_truncate_restart_trans(handle_t *handle, struct inode *inode, in ext4_truncate_restart_trans() argument
175 BUG_ON(EXT4_JOURNAL(inode) == NULL); in ext4_truncate_restart_trans()
177 up_write(&EXT4_I(inode)->i_data_sem); in ext4_truncate_restart_trans()
179 down_write(&EXT4_I(inode)->i_data_sem); in ext4_truncate_restart_trans()
180 ext4_discard_preallocations(inode); in ext4_truncate_restart_trans()
188 void ext4_evict_inode(struct inode *inode) in ext4_evict_inode() argument
193 trace_ext4_evict_inode(inode); in ext4_evict_inode()
195 if (inode->i_nlink) { in ext4_evict_inode()
214 if (inode->i_ino != EXT4_JOURNAL_INO && in ext4_evict_inode()
215 ext4_should_journal_data(inode) && in ext4_evict_inode()
216 (S_ISLNK(inode->i_mode) || S_ISREG(inode->i_mode))) { in ext4_evict_inode()
217 journal_t *journal = EXT4_SB(inode->i_sb)->s_journal; in ext4_evict_inode()
218 tid_t commit_tid = EXT4_I(inode)->i_datasync_tid; in ext4_evict_inode()
221 filemap_write_and_wait(&inode->i_data); in ext4_evict_inode()
223 truncate_inode_pages_final(&inode->i_data); in ext4_evict_inode()
225 WARN_ON(atomic_read(&EXT4_I(inode)->i_ioend_count)); in ext4_evict_inode()
229 if (is_bad_inode(inode)) in ext4_evict_inode()
231 dquot_initialize(inode); in ext4_evict_inode()
233 if (ext4_should_order_data(inode)) in ext4_evict_inode()
234 ext4_begin_ordered_truncate(inode, 0); in ext4_evict_inode()
235 truncate_inode_pages_final(&inode->i_data); in ext4_evict_inode()
237 WARN_ON(atomic_read(&EXT4_I(inode)->i_ioend_count)); in ext4_evict_inode()
243 sb_start_intwrite(inode->i_sb); in ext4_evict_inode()
244 handle = ext4_journal_start(inode, EXT4_HT_TRUNCATE, in ext4_evict_inode()
245 ext4_blocks_for_truncate(inode)+3); in ext4_evict_inode()
247 ext4_std_error(inode->i_sb, PTR_ERR(handle)); in ext4_evict_inode()
253 ext4_orphan_del(NULL, inode); in ext4_evict_inode()
254 sb_end_intwrite(inode->i_sb); in ext4_evict_inode()
258 if (IS_SYNC(inode)) in ext4_evict_inode()
260 inode->i_size = 0; in ext4_evict_inode()
261 err = ext4_mark_inode_dirty(handle, inode); in ext4_evict_inode()
263 ext4_warning(inode->i_sb, in ext4_evict_inode()
267 if (inode->i_blocks) in ext4_evict_inode()
268 ext4_truncate(inode); in ext4_evict_inode()
281 ext4_warning(inode->i_sb, in ext4_evict_inode()
285 ext4_orphan_del(NULL, inode); in ext4_evict_inode()
286 sb_end_intwrite(inode->i_sb); in ext4_evict_inode()
299 ext4_orphan_del(handle, inode); in ext4_evict_inode()
300 EXT4_I(inode)->i_dtime = get_seconds(); in ext4_evict_inode()
309 if (ext4_mark_inode_dirty(handle, inode)) in ext4_evict_inode()
311 ext4_clear_inode(inode); in ext4_evict_inode()
313 ext4_free_inode(handle, inode); in ext4_evict_inode()
315 sb_end_intwrite(inode->i_sb); in ext4_evict_inode()
318 ext4_clear_inode(inode); /* We must guarantee clearing of inode... */ in ext4_evict_inode()
322 qsize_t *ext4_get_reserved_space(struct inode *inode) in ext4_get_reserved_space() argument
324 return &EXT4_I(inode)->i_reserved_quota; in ext4_get_reserved_space()
332 void ext4_da_update_reserve_space(struct inode *inode, in ext4_da_update_reserve_space() argument
335 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_da_update_reserve_space()
336 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_da_update_reserve_space()
339 trace_ext4_da_update_reserve_space(inode, used, quota_claim); in ext4_da_update_reserve_space()
341 ext4_warning(inode->i_sb, "%s: ino %lu, used %d " in ext4_da_update_reserve_space()
343 __func__, inode->i_ino, used, in ext4_da_update_reserve_space()
353 spin_unlock(&EXT4_I(inode)->i_block_reservation_lock); in ext4_da_update_reserve_space()
357 dquot_claim_block(inode, EXT4_C2B(sbi, used)); in ext4_da_update_reserve_space()
364 dquot_release_reservation_block(inode, EXT4_C2B(sbi, used)); in ext4_da_update_reserve_space()
373 (atomic_read(&inode->i_writecount) == 0)) in ext4_da_update_reserve_space()
374 ext4_discard_preallocations(inode); in ext4_da_update_reserve_space()
377 static int __check_block_validity(struct inode *inode, const char *func, in __check_block_validity() argument
381 if (ext4_has_feature_journal(inode->i_sb) && in __check_block_validity()
382 (inode->i_ino == in __check_block_validity()
383 le32_to_cpu(EXT4_SB(inode->i_sb)->s_es->s_journal_inum))) in __check_block_validity()
385 if (!ext4_inode_block_valid(inode, map->m_pblk, map->m_len)) { in __check_block_validity()
386 ext4_error_inode(inode, func, line, map->m_pblk, in __check_block_validity()
395 #define check_block_validity(inode, map) \ argument
396 __check_block_validity((inode), __func__, __LINE__, (map))
400 struct inode *inode, in ext4_map_blocks_es_recheck() argument
416 down_read(&EXT4_I(inode)->i_data_sem); in ext4_map_blocks_es_recheck()
417 if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) { in ext4_map_blocks_es_recheck()
418 retval = ext4_ext_map_blocks(handle, inode, map, flags & in ext4_map_blocks_es_recheck()
421 retval = ext4_ind_map_blocks(handle, inode, map, flags & in ext4_map_blocks_es_recheck()
425 up_read((&EXT4_I(inode)->i_data_sem)); in ext4_map_blocks_es_recheck()
437 inode->i_ino, es_map->m_lblk, es_map->m_len, in ext4_map_blocks_es_recheck()
467 int ext4_map_blocks(handle_t *handle, struct inode *inode, in ext4_map_blocks() argument
481 "logical block %lu\n", inode->i_ino, flags, map->m_len, in ext4_map_blocks()
495 if (ext4_es_lookup_extent(inode, map->m_lblk, &es)) { in ext4_map_blocks()
511 ext4_map_blocks_es_recheck(handle, inode, map, in ext4_map_blocks()
522 down_read(&EXT4_I(inode)->i_data_sem); in ext4_map_blocks()
523 if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) { in ext4_map_blocks()
524 retval = ext4_ext_map_blocks(handle, inode, map, flags & in ext4_map_blocks()
527 retval = ext4_ind_map_blocks(handle, inode, map, flags & in ext4_map_blocks()
534 ext4_warning(inode->i_sb, in ext4_map_blocks()
537 inode->i_ino, retval, map->m_len); in ext4_map_blocks()
545 ext4_find_delalloc_range(inode, map->m_lblk, in ext4_map_blocks()
548 ret = ext4_es_insert_extent(inode, map->m_lblk, in ext4_map_blocks()
554 up_read((&EXT4_I(inode)->i_data_sem)); in ext4_map_blocks()
558 ret = check_block_validity(inode, map); in ext4_map_blocks()
595 down_write(&EXT4_I(inode)->i_data_sem); in ext4_map_blocks()
601 if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) { in ext4_map_blocks()
602 retval = ext4_ext_map_blocks(handle, inode, map, flags); in ext4_map_blocks()
604 retval = ext4_ind_map_blocks(handle, inode, map, flags); in ext4_map_blocks()
612 ext4_clear_inode_state(inode, EXT4_STATE_EXT_MIGRATE); in ext4_map_blocks()
623 ext4_da_update_reserve_space(inode, retval, 1); in ext4_map_blocks()
630 ext4_warning(inode->i_sb, in ext4_map_blocks()
633 inode->i_ino, retval, map->m_len); in ext4_map_blocks()
642 ext4_es_lookup_extent(inode, map->m_lblk, &es)) { in ext4_map_blocks()
650 ext4_find_delalloc_range(inode, map->m_lblk, in ext4_map_blocks()
653 ret = ext4_es_insert_extent(inode, map->m_lblk, map->m_len, in ext4_map_blocks()
660 up_write((&EXT4_I(inode)->i_data_sem)); in ext4_map_blocks()
662 ret = check_block_validity(inode, map); in ext4_map_blocks()
673 !IS_NOQUOTA(inode) && in ext4_map_blocks()
674 ext4_should_order_data(inode)) { in ext4_map_blocks()
675 ret = ext4_jbd2_file_inode(handle, inode); in ext4_map_blocks()
714 static int _ext4_get_block(struct inode *inode, sector_t iblock, in _ext4_get_block() argument
722 if (ext4_has_inline_data(inode)) in _ext4_get_block()
726 map.m_len = bh->b_size >> inode->i_blkbits; in _ext4_get_block()
732 dio_credits = ext4_chunk_trans_blocks(inode, map.m_len); in _ext4_get_block()
733 handle = ext4_journal_start(inode, EXT4_HT_MAP_BLOCKS, in _ext4_get_block()
742 ret = ext4_map_blocks(handle, inode, &map, flags); in _ext4_get_block()
744 ext4_io_end_t *io_end = ext4_inode_aio(inode); in _ext4_get_block()
746 map_bh(bh, inode->i_sb, map.m_pblk); in _ext4_get_block()
748 if (IS_DAX(inode) && buffer_unwritten(bh)) { in _ext4_get_block()
755 bh->b_assoc_map = inode->i_mapping; in _ext4_get_block()
760 bh->b_size = inode->i_sb->s_blocksize * map.m_len; in _ext4_get_block()
768 int ext4_get_block(struct inode *inode, sector_t iblock, in ext4_get_block() argument
771 return _ext4_get_block(inode, iblock, bh, in ext4_get_block()
778 struct buffer_head *ext4_getblk(handle_t *handle, struct inode *inode, in ext4_getblk() argument
790 err = ext4_map_blocks(handle, inode, &map, map_flags); in ext4_getblk()
797 bh = sb_getblk(inode->i_sb, map.m_pblk); in ext4_getblk()
819 memset(bh->b_data, 0, inode->i_sb->s_blocksize); in ext4_getblk()
824 err = ext4_handle_dirty_metadata(handle, inode, bh); in ext4_getblk()
835 struct buffer_head *ext4_bread(handle_t *handle, struct inode *inode, in ext4_bread() argument
840 bh = ext4_getblk(handle, inode, block, map_flags); in ext4_bread()
933 static int ext4_get_block_write_nolock(struct inode *inode, sector_t iblock,
942 struct inode *inode = page->mapping->host; in ext4_block_write_begin() local
946 unsigned blocksize = inode->i_sb->s_blocksize; in ext4_block_write_begin()
976 err = get_block(inode, block, bh, 1); in ext4_block_write_begin()
1004 decrypt = ext4_encrypted_inode(inode) && in ext4_block_write_begin()
1005 S_ISREG(inode->i_mode); in ext4_block_write_begin()
1028 struct inode *inode = mapping->host; in ext4_write_begin() local
1041 inode); in ext4_write_begin()
1042 trace_android_fs_datawrite_start(inode, pos, len, in ext4_write_begin()
1046 trace_ext4_write_begin(inode, pos, len, flags); in ext4_write_begin()
1051 needed_blocks = ext4_writepage_trans_blocks(inode) + 1; in ext4_write_begin()
1056 if (ext4_test_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA)) { in ext4_write_begin()
1057 ret = ext4_try_to_write_inline_data(mapping, inode, pos, len, in ext4_write_begin()
1079 handle = ext4_journal_start(inode, EXT4_HT_WRITE_PAGE, needed_blocks); in ext4_write_begin()
1097 if (ext4_should_dioread_nolock(inode)) in ext4_write_begin()
1104 if (ext4_should_dioread_nolock(inode)) in ext4_write_begin()
1109 if (!ret && ext4_should_journal_data(inode)) { in ext4_write_begin()
1125 if (pos + len > inode->i_size && ext4_can_truncate(inode)) in ext4_write_begin()
1126 ext4_orphan_add(handle, inode); in ext4_write_begin()
1129 if (pos + len > inode->i_size) { in ext4_write_begin()
1130 ext4_truncate_failed_write(inode); in ext4_write_begin()
1137 if (inode->i_nlink) in ext4_write_begin()
1138 ext4_orphan_del(NULL, inode); in ext4_write_begin()
1142 ext4_should_retry_alloc(inode->i_sb, &retries)) in ext4_write_begin()
1177 struct inode *inode = mapping->host; in ext4_write_end() local
1178 loff_t old_size = inode->i_size; in ext4_write_end()
1181 int inline_data = ext4_has_inline_data(inode); in ext4_write_end()
1183 trace_android_fs_datawrite_end(inode, pos, len); in ext4_write_end()
1184 trace_ext4_write_end(inode, pos, len, copied); in ext4_write_end()
1186 ret = ext4_write_inline_data_end(inode, pos, len, in ext4_write_end()
1201 i_size_changed = ext4_update_inode_size(inode, pos + copied); in ext4_write_end()
1206 pagecache_isize_extended(inode, old_size, pos); in ext4_write_end()
1214 ext4_mark_inode_dirty(handle, inode); in ext4_write_end()
1216 if (pos + len > inode->i_size && ext4_can_truncate(inode)) in ext4_write_end()
1221 ext4_orphan_add(handle, inode); in ext4_write_end()
1227 if (pos + len > inode->i_size) { in ext4_write_end()
1228 ext4_truncate_failed_write(inode); in ext4_write_end()
1234 if (inode->i_nlink) in ext4_write_end()
1235 ext4_orphan_del(NULL, inode); in ext4_write_end()
1281 struct inode *inode = mapping->host; in ext4_journalled_write_end() local
1282 loff_t old_size = inode->i_size; in ext4_journalled_write_end()
1287 int inline_data = ext4_has_inline_data(inode); in ext4_journalled_write_end()
1289 trace_android_fs_datawrite_end(inode, pos, len); in ext4_journalled_write_end()
1290 trace_ext4_journalled_write_end(inode, pos, len, copied); in ext4_journalled_write_end()
1297 ret = ext4_write_inline_data_end(inode, pos, len, in ext4_journalled_write_end()
1318 size_changed = ext4_update_inode_size(inode, pos + copied); in ext4_journalled_write_end()
1319 ext4_set_inode_state(inode, EXT4_STATE_JDATA); in ext4_journalled_write_end()
1320 EXT4_I(inode)->i_datasync_tid = handle->h_transaction->t_tid; in ext4_journalled_write_end()
1325 pagecache_isize_extended(inode, old_size, pos); in ext4_journalled_write_end()
1328 ret2 = ext4_mark_inode_dirty(handle, inode); in ext4_journalled_write_end()
1333 if (pos + len > inode->i_size && ext4_can_truncate(inode)) in ext4_journalled_write_end()
1338 ext4_orphan_add(handle, inode); in ext4_journalled_write_end()
1344 if (pos + len > inode->i_size) { in ext4_journalled_write_end()
1345 ext4_truncate_failed_write(inode); in ext4_journalled_write_end()
1351 if (inode->i_nlink) in ext4_journalled_write_end()
1352 ext4_orphan_del(NULL, inode); in ext4_journalled_write_end()
1361 static int ext4_da_reserve_space(struct inode *inode) in ext4_da_reserve_space() argument
1363 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_da_reserve_space()
1364 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_da_reserve_space()
1372 ret = dquot_reserve_block(inode, EXT4_C2B(sbi, 1)); in ext4_da_reserve_space()
1379 dquot_release_reservation_block(inode, EXT4_C2B(sbi, 1)); in ext4_da_reserve_space()
1383 trace_ext4_da_reserve_space(inode); in ext4_da_reserve_space()
1389 static void ext4_da_release_space(struct inode *inode, int to_free) in ext4_da_release_space() argument
1391 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_da_release_space()
1392 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_da_release_space()
1397 spin_lock(&EXT4_I(inode)->i_block_reservation_lock); in ext4_da_release_space()
1399 trace_ext4_da_release_space(inode, to_free); in ext4_da_release_space()
1407 ext4_warning(inode->i_sb, "ext4_da_release_space: " in ext4_da_release_space()
1409 "data blocks", inode->i_ino, to_free, in ext4_da_release_space()
1419 spin_unlock(&EXT4_I(inode)->i_block_reservation_lock); in ext4_da_release_space()
1421 dquot_release_reservation_block(inode, EXT4_C2B(sbi, to_free)); in ext4_da_release_space()
1431 struct inode *inode = page->mapping->host; in ext4_da_page_release_reservation() local
1432 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_da_page_release_reservation()
1453 (PAGE_CACHE_SHIFT - inode->i_blkbits); in ext4_da_page_release_reservation()
1454 lblk += (curr_off >> inode->i_blkbits) - in ext4_da_page_release_reservation()
1456 ext4_es_remove_extent(inode, lblk, contiguous_blks); in ext4_da_page_release_reservation()
1463 lblk = page->index << (PAGE_CACHE_SHIFT - inode->i_blkbits); in ext4_da_page_release_reservation()
1464 lblk += (curr_off >> inode->i_blkbits) - contiguous_blks; in ext4_da_page_release_reservation()
1465 ext4_es_remove_extent(inode, lblk, contiguous_blks); in ext4_da_page_release_reservation()
1472 lblk = (page->index << (PAGE_CACHE_SHIFT - inode->i_blkbits)) + in ext4_da_page_release_reservation()
1475 !ext4_find_delalloc_cluster(inode, lblk)) in ext4_da_page_release_reservation()
1476 ext4_da_release_space(inode, 1); in ext4_da_page_release_reservation()
1487 struct inode *inode; member
1508 struct inode *inode = mpd->inode; in mpage_release_unused_pages() local
1509 struct address_space *mapping = inode->i_mapping; in mpage_release_unused_pages()
1519 start = index << (PAGE_CACHE_SHIFT - inode->i_blkbits); in mpage_release_unused_pages()
1520 last = end << (PAGE_CACHE_SHIFT - inode->i_blkbits); in mpage_release_unused_pages()
1521 ext4_es_remove_extent(inode, start, last - start + 1); in mpage_release_unused_pages()
1548 static void ext4_print_free_blocks(struct inode *inode) in ext4_print_free_blocks() argument
1550 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_print_free_blocks()
1551 struct super_block *sb = inode->i_sb; in ext4_print_free_blocks()
1552 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_print_free_blocks()
1555 EXT4_C2B(EXT4_SB(inode->i_sb), in ext4_print_free_blocks()
1581 static int ext4_da_map_blocks(struct inode *inode, sector_t iblock, in ext4_da_map_blocks() argument
1594 if (invalid_block < ext4_blocks_count(EXT4_SB(inode->i_sb)->s_es)) in ext4_da_map_blocks()
1599 "logical block %lu\n", inode->i_ino, map->m_len, in ext4_da_map_blocks()
1603 if (ext4_es_lookup_extent(inode, iblock, &es)) { in ext4_da_map_blocks()
1606 down_read(&EXT4_I(inode)->i_data_sem); in ext4_da_map_blocks()
1615 map_bh(bh, inode->i_sb, invalid_block); in ext4_da_map_blocks()
1634 ext4_map_blocks_es_recheck(NULL, inode, map, &orig_map, 0); in ext4_da_map_blocks()
1643 down_read(&EXT4_I(inode)->i_data_sem); in ext4_da_map_blocks()
1644 if (ext4_has_inline_data(inode)) in ext4_da_map_blocks()
1646 else if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) in ext4_da_map_blocks()
1647 retval = ext4_ext_map_blocks(NULL, inode, map, 0); in ext4_da_map_blocks()
1649 retval = ext4_ind_map_blocks(NULL, inode, map, 0); in ext4_da_map_blocks()
1663 if (EXT4_SB(inode->i_sb)->s_cluster_ratio == 1 || in ext4_da_map_blocks()
1664 !ext4_find_delalloc_cluster(inode, map->m_lblk)) { in ext4_da_map_blocks()
1665 ret = ext4_da_reserve_space(inode); in ext4_da_map_blocks()
1673 ret = ext4_es_insert_extent(inode, map->m_lblk, map->m_len, in ext4_da_map_blocks()
1680 map_bh(bh, inode->i_sb, invalid_block); in ext4_da_map_blocks()
1688 ext4_warning(inode->i_sb, in ext4_da_map_blocks()
1691 inode->i_ino, retval, map->m_len); in ext4_da_map_blocks()
1697 ret = ext4_es_insert_extent(inode, map->m_lblk, map->m_len, in ext4_da_map_blocks()
1704 up_read((&EXT4_I(inode)->i_data_sem)); in ext4_da_map_blocks()
1721 int ext4_da_get_block_prep(struct inode *inode, sector_t iblock, in ext4_da_get_block_prep() argument
1728 BUG_ON(bh->b_size != inode->i_sb->s_blocksize); in ext4_da_get_block_prep()
1738 ret = ext4_da_map_blocks(inode, iblock, &map, bh); in ext4_da_get_block_prep()
1742 map_bh(bh, inode->i_sb, map.m_pblk); in ext4_da_get_block_prep()
1774 struct inode *inode = mapping->host; in __ext4_journalled_writepage() local
1778 int inline_data = ext4_has_inline_data(inode); in __ext4_journalled_writepage()
1785 BUG_ON(len > ext4_get_max_inline_size(inode)); in __ext4_journalled_writepage()
1786 inode_bh = ext4_journalled_write_inline_data(inode, len, page); in __ext4_journalled_writepage()
1806 handle = ext4_journal_start(inode, EXT4_HT_WRITE_PAGE, in __ext4_journalled_writepage()
1807 ext4_writepage_trans_blocks(inode)); in __ext4_journalled_writepage()
1825 ret = ext4_mark_inode_dirty(handle, inode); in __ext4_journalled_writepage()
1835 EXT4_I(inode)->i_datasync_tid = handle->h_transaction->t_tid; in __ext4_journalled_writepage()
1840 ext4_set_inode_state(inode, EXT4_STATE_JDATA); in __ext4_journalled_writepage()
1899 struct inode *inode = page->mapping->host; in ext4_writepage() local
1904 size = i_size_read(inode); in ext4_writepage()
1932 (inode->i_sb->s_blocksize == PAGE_CACHE_SIZE)) { in ext4_writepage()
1946 if (PageChecked(page) && ext4_should_journal_data(inode)) in ext4_writepage()
1954 io_submit.io_end = ext4_init_io_end(inode, GFP_NOFS); in ext4_writepage()
1988 size = i_size_read(mpd->inode); in mpage_submit_page()
2080 struct inode *inode = mpd->inode; in mpage_process_page_bufs() local
2082 ext4_lblk_t blocks = (i_size_read(inode) + i_blocksize(inode) - 1) in mpage_process_page_bufs()
2083 >> inode->i_blkbits; in mpage_process_page_bufs()
2123 struct inode *inode = mpd->inode; in mpage_map_and_submit_buffers() local
2125 int bpp_bits = PAGE_CACHE_SHIFT - inode->i_blkbits; in mpage_map_and_submit_buffers()
2138 nr_pages = pagevec_lookup(&pvec, inode->i_mapping, start, in mpage_map_and_submit_buffers()
2205 struct inode *inode = mpd->inode; in mpage_map_one_extent() local
2210 trace_ext4_da_write_pages_extent(inode, map); in mpage_map_one_extent()
2228 dioread_nolock = ext4_should_dioread_nolock(inode); in mpage_map_one_extent()
2234 err = ext4_map_blocks(handle, inode, map, get_blocks_flags); in mpage_map_one_extent()
2243 ext4_set_io_unwritten_flag(inode, mpd->io_submit.io_end); in mpage_map_one_extent()
2248 struct block_device *bdev = inode->i_sb->s_bdev; in mpage_map_one_extent()
2281 struct inode *inode = mpd->inode; in mpage_map_and_submit_extent() local
2288 ((loff_t)map->m_lblk) << inode->i_blkbits; in mpage_map_and_submit_extent()
2292 struct super_block *sb = inode->i_sb; in mpage_map_and_submit_extent()
2311 inode->i_ino, in mpage_map_and_submit_extent()
2318 ext4_print_free_blocks(inode); in mpage_map_and_submit_extent()
2339 if (disksize > READ_ONCE(EXT4_I(inode)->i_disksize)) { in mpage_map_and_submit_extent()
2343 down_write(&EXT4_I(inode)->i_data_sem); in mpage_map_and_submit_extent()
2344 i_size = i_size_read(inode); in mpage_map_and_submit_extent()
2347 if (disksize > EXT4_I(inode)->i_disksize) in mpage_map_and_submit_extent()
2348 EXT4_I(inode)->i_disksize = disksize; in mpage_map_and_submit_extent()
2349 err2 = ext4_mark_inode_dirty(handle, inode); in mpage_map_and_submit_extent()
2350 up_write(&EXT4_I(inode)->i_data_sem); in mpage_map_and_submit_extent()
2352 ext4_error(inode->i_sb, in mpage_map_and_submit_extent()
2354 inode->i_ino); in mpage_map_and_submit_extent()
2368 static int ext4_da_writepages_trans_blocks(struct inode *inode) in ext4_da_writepages_trans_blocks() argument
2370 int bpp = ext4_journal_blocks_per_page(inode); in ext4_da_writepages_trans_blocks()
2372 return ext4_meta_trans_blocks(inode, in ext4_da_writepages_trans_blocks()
2396 struct address_space *mapping = mpd->inode->i_mapping; in mpage_prepare_extent_to_map()
2404 int blkbits = mpd->inode->i_blkbits; in mpage_prepare_extent_to_map()
2509 struct inode *inode = mapping->host; in ext4_writepages() local
2516 trace_ext4_writepages(inode, wbc); in ext4_writepages()
2526 if (ext4_should_journal_data(inode)) { in ext4_writepages()
2550 if (ext4_should_dioread_nolock(inode)) { in ext4_writepages()
2555 rsv_blocks = 1 + (PAGE_CACHE_SIZE >> inode->i_blkbits); in ext4_writepages()
2563 if (ext4_has_inline_data(inode)) { in ext4_writepages()
2565 handle = ext4_journal_start(inode, EXT4_HT_INODE, 1); in ext4_writepages()
2570 BUG_ON(ext4_test_inode_state(inode, in ext4_writepages()
2572 ext4_destroy_inline_data(handle, inode); in ext4_writepages()
2590 mpd.inode = inode; in ext4_writepages()
2600 mpd.io_submit.io_end = ext4_init_io_end(inode, GFP_KERNEL); in ext4_writepages()
2613 BUG_ON(ext4_should_journal_data(inode)); in ext4_writepages()
2614 needed_blocks = ext4_da_writepages_trans_blocks(inode); in ext4_writepages()
2617 handle = ext4_journal_start_with_reserve(inode, in ext4_writepages()
2621 ext4_msg(inode->i_sb, KERN_CRIT, "%s: jbd2_start: " in ext4_writepages()
2623 wbc->nr_to_write, inode->i_ino, ret); in ext4_writepages()
2629 trace_ext4_da_write_pages(inode, mpd.first_page, mpd.wbc); in ext4_writepages()
2707 trace_ext4_writepages_result(inode, wbc, ret, in ext4_writepages()
2747 static int ext4_da_write_credits(struct inode *inode, loff_t pos, unsigned len) in ext4_da_write_credits() argument
2749 if (likely(ext4_has_feature_large_file(inode->i_sb))) in ext4_da_write_credits()
2766 struct inode *inode = mapping->host; in ext4_da_write_begin() local
2771 if (ext4_nonda_switch(inode->i_sb)) { in ext4_da_write_begin()
2782 inode); in ext4_da_write_begin()
2783 trace_android_fs_datawrite_start(inode, pos, len, in ext4_da_write_begin()
2787 trace_ext4_da_write_begin(inode, pos, len, flags); in ext4_da_write_begin()
2789 if (ext4_test_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA)) { in ext4_da_write_begin()
2790 ret = ext4_da_write_inline_data_begin(mapping, inode, in ext4_da_write_begin()
2819 handle = ext4_journal_start(inode, EXT4_HT_WRITE_PAGE, in ext4_da_write_begin()
2820 ext4_da_write_credits(inode, pos, len)); in ext4_da_write_begin()
2851 if (pos + len > inode->i_size) in ext4_da_write_begin()
2852 ext4_truncate_failed_write(inode); in ext4_da_write_begin()
2855 ext4_should_retry_alloc(inode->i_sb, &retries)) in ext4_da_write_begin()
2874 struct inode *inode = page->mapping->host; in ext4_da_should_update_i_disksize() local
2879 idx = offset >> inode->i_blkbits; in ext4_da_should_update_i_disksize()
2894 struct inode *inode = mapping->host; in ext4_da_write_end() local
2905 trace_android_fs_datawrite_end(inode, pos, len); in ext4_da_write_end()
2906 trace_ext4_da_write_end(inode, pos, len, copied); in ext4_da_write_end()
2916 if (copied && new_i_size > EXT4_I(inode)->i_disksize) { in ext4_da_write_end()
2917 if (ext4_has_inline_data(inode) || in ext4_da_write_end()
2919 ext4_update_i_disksize(inode, new_i_size); in ext4_da_write_end()
2924 ext4_mark_inode_dirty(handle, inode); in ext4_da_write_end()
2929 ext4_test_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA) && in ext4_da_write_end()
2930 ext4_has_inline_data(inode)) in ext4_da_write_end()
2931 ret2 = ext4_da_write_inline_data_end(inode, pos, len, copied, in ext4_da_write_end()
2968 int ext4_alloc_da_blocks(struct inode *inode) in ext4_alloc_da_blocks() argument
2970 trace_ext4_alloc_da_blocks(inode); in ext4_alloc_da_blocks()
2972 if (!EXT4_I(inode)->i_reserved_data_blocks) in ext4_alloc_da_blocks()
3006 return filemap_flush(inode->i_mapping); in ext4_alloc_da_blocks()
3025 struct inode *inode = mapping->host; in ext4_bmap() local
3032 if (ext4_has_inline_data(inode)) in ext4_bmap()
3036 test_opt(inode->i_sb, DELALLOC)) { in ext4_bmap()
3045 if (EXT4_JOURNAL(inode) && in ext4_bmap()
3046 ext4_test_inode_state(inode, EXT4_STATE_JDATA)) { in ext4_bmap()
3065 ext4_clear_inode_state(inode, EXT4_STATE_JDATA); in ext4_bmap()
3066 journal = EXT4_JOURNAL(inode); in ext4_bmap()
3081 struct inode *inode = page->mapping->host; in ext4_readpage() local
3085 if (ext4_has_inline_data(inode)) in ext4_readpage()
3086 ret = ext4_readpage_inline(inode, page); in ext4_readpage()
3098 struct inode *inode = mapping->host; in ext4_readpages() local
3101 if (ext4_has_inline_data(inode)) in ext4_readpages()
3163 int ext4_get_block_write(struct inode *inode, sector_t iblock, in ext4_get_block_write() argument
3167 inode->i_ino, create); in ext4_get_block_write()
3168 return _ext4_get_block(inode, iblock, bh_result, in ext4_get_block_write()
3172 static int ext4_get_block_write_nolock(struct inode *inode, sector_t iblock, in ext4_get_block_write_nolock() argument
3176 inode->i_ino, create); in ext4_get_block_write_nolock()
3177 return _ext4_get_block(inode, iblock, bh_result, in ext4_get_block_write_nolock()
3181 int ext4_get_block_dax(struct inode *inode, sector_t iblock, in ext4_get_block_dax() argument
3188 inode->i_ino, create); in ext4_get_block_dax()
3189 return _ext4_get_block(inode, iblock, bh_result, flags); in ext4_get_block_dax()
3203 iocb->private, io_end->inode->i_ino, iocb, offset, in ext4_end_io_dio()
3235 struct inode *inode = file->f_mapping->host; in ext4_ext_direct_IO() local
3245 if (iov_iter_rw(iter) != WRITE || final_size > inode->i_size) in ext4_ext_direct_IO()
3256 inode_dio_begin(inode); in ext4_ext_direct_IO()
3262 down_read(&EXT4_I(inode)->i_data_sem); in ext4_ext_direct_IO()
3263 mutex_unlock(&inode->i_mutex); in ext4_ext_direct_IO()
3289 ext4_inode_aio_set(inode, NULL); in ext4_ext_direct_IO()
3291 io_end = ext4_init_io_end(inode, GFP_NOFS); in ext4_ext_direct_IO()
3307 ext4_inode_aio_set(inode, io_end); in ext4_ext_direct_IO()
3313 BUG_ON(ext4_encrypted_inode(inode) && S_ISREG(inode->i_mode)); in ext4_ext_direct_IO()
3315 if (IS_DAX(inode)) in ext4_ext_direct_IO()
3316 ret = dax_do_io(iocb, inode, iter, offset, get_block_func, in ext4_ext_direct_IO()
3319 ret = __blockdev_direct_IO(iocb, inode, in ext4_ext_direct_IO()
3320 inode->i_sb->s_bdev, iter, offset, in ext4_ext_direct_IO()
3332 ext4_inode_aio_set(inode, NULL); in ext4_ext_direct_IO()
3345 if (ret > 0 && !overwrite && ext4_test_inode_state(inode, in ext4_ext_direct_IO()
3352 err = ext4_convert_unwritten_extents(NULL, inode, in ext4_ext_direct_IO()
3356 ext4_clear_inode_state(inode, EXT4_STATE_DIO_UNWRITTEN); in ext4_ext_direct_IO()
3361 inode_dio_end(inode); in ext4_ext_direct_IO()
3364 up_read(&EXT4_I(inode)->i_data_sem); in ext4_ext_direct_IO()
3365 mutex_lock(&inode->i_mutex); in ext4_ext_direct_IO()
3375 struct inode *inode = file->f_mapping->host; in ext4_direct_IO() local
3380 loff_t size = i_size_read(inode); in ext4_direct_IO()
3387 if (ext4_encrypted_inode(inode) && S_ISREG(inode->i_mode)) in ext4_direct_IO()
3394 if (ext4_should_journal_data(inode)) in ext4_direct_IO()
3398 if (ext4_has_inline_data(inode)) in ext4_direct_IO()
3407 inode); in ext4_direct_IO()
3408 trace_android_fs_dataread_start(inode, offset, count, in ext4_direct_IO()
3418 inode); in ext4_direct_IO()
3419 trace_android_fs_datawrite_start(inode, offset, count, in ext4_direct_IO()
3423 trace_ext4_direct_IO_enter(inode, offset, count, iov_iter_rw(iter)); in ext4_direct_IO()
3424 if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) in ext4_direct_IO()
3428 trace_ext4_direct_IO_exit(inode, offset, count, iov_iter_rw(iter), ret); in ext4_direct_IO()
3432 trace_android_fs_dataread_end(inode, offset, count); in ext4_direct_IO()
3435 trace_android_fs_datawrite_end(inode, offset, count); in ext4_direct_IO()
3507 void ext4_set_aops(struct inode *inode) in ext4_set_aops() argument
3509 switch (ext4_inode_journal_mode(inode)) { in ext4_set_aops()
3511 ext4_set_inode_state(inode, EXT4_STATE_ORDERED_MODE); in ext4_set_aops()
3514 ext4_clear_inode_state(inode, EXT4_STATE_ORDERED_MODE); in ext4_set_aops()
3517 inode->i_mapping->a_ops = &ext4_journalled_aops; in ext4_set_aops()
3522 if (test_opt(inode->i_sb, DELALLOC)) in ext4_set_aops()
3523 inode->i_mapping->a_ops = &ext4_da_aops; in ext4_set_aops()
3525 inode->i_mapping->a_ops = &ext4_aops; in ext4_set_aops()
3535 struct inode *inode = mapping->host; in __ext4_block_zero_page_range() local
3545 blocksize = inode->i_sb->s_blocksize; in __ext4_block_zero_page_range()
3547 iblock = index << (PAGE_CACHE_SHIFT - inode->i_sb->s_blocksize_bits); in __ext4_block_zero_page_range()
3566 ext4_get_block(inode, iblock, bh, 0); in __ext4_block_zero_page_range()
3585 if (S_ISREG(inode->i_mode) && in __ext4_block_zero_page_range()
3586 ext4_encrypted_inode(inode)) { in __ext4_block_zero_page_range()
3588 BUG_ON(!ext4_has_encryption_key(inode)); in __ext4_block_zero_page_range()
3593 if (ext4_should_journal_data(inode)) { in __ext4_block_zero_page_range()
3602 if (ext4_should_journal_data(inode)) { in __ext4_block_zero_page_range()
3603 err = ext4_handle_dirty_metadata(handle, inode, bh); in __ext4_block_zero_page_range()
3607 if (ext4_test_inode_state(inode, EXT4_STATE_ORDERED_MODE)) in __ext4_block_zero_page_range()
3608 err = ext4_jbd2_file_inode(handle, inode); in __ext4_block_zero_page_range()
3627 struct inode *inode = mapping->host; in ext4_block_zero_page_range() local
3629 unsigned blocksize = inode->i_sb->s_blocksize; in ext4_block_zero_page_range()
3639 if (IS_DAX(inode)) in ext4_block_zero_page_range()
3640 return dax_zero_page_range(inode, from, length, ext4_get_block); in ext4_block_zero_page_range()
3656 struct inode *inode = mapping->host; in ext4_block_truncate_page() local
3659 if (ext4_encrypted_inode(inode) && !ext4_has_encryption_key(inode)) in ext4_block_truncate_page()
3662 blocksize = inode->i_sb->s_blocksize; in ext4_block_truncate_page()
3668 int ext4_zero_partial_blocks(handle_t *handle, struct inode *inode, in ext4_zero_partial_blocks() argument
3671 struct super_block *sb = inode->i_sb; in ext4_zero_partial_blocks()
3672 struct address_space *mapping = inode->i_mapping; in ext4_zero_partial_blocks()
3706 int ext4_can_truncate(struct inode *inode) in ext4_can_truncate() argument
3708 if (S_ISREG(inode->i_mode)) in ext4_can_truncate()
3710 if (S_ISDIR(inode->i_mode)) in ext4_can_truncate()
3712 if (S_ISLNK(inode->i_mode)) in ext4_can_truncate()
3713 return !ext4_inode_is_fast_symlink(inode); in ext4_can_truncate()
3723 int ext4_update_disksize_before_punch(struct inode *inode, loff_t offset, in ext4_update_disksize_before_punch() argument
3727 loff_t size = i_size_read(inode); in ext4_update_disksize_before_punch()
3729 WARN_ON(!mutex_is_locked(&inode->i_mutex)); in ext4_update_disksize_before_punch()
3733 if (EXT4_I(inode)->i_disksize >= size) in ext4_update_disksize_before_punch()
3736 handle = ext4_journal_start(inode, EXT4_HT_MISC, 1); in ext4_update_disksize_before_punch()
3739 ext4_update_i_disksize(inode, size); in ext4_update_disksize_before_punch()
3740 ext4_mark_inode_dirty(handle, inode); in ext4_update_disksize_before_punch()
3757 int ext4_punch_hole(struct inode *inode, loff_t offset, loff_t length) in ext4_punch_hole() argument
3759 struct super_block *sb = inode->i_sb; in ext4_punch_hole()
3761 struct address_space *mapping = inode->i_mapping; in ext4_punch_hole()
3767 if (!S_ISREG(inode->i_mode)) in ext4_punch_hole()
3770 trace_ext4_punch_hole(inode, offset, length, 0); in ext4_punch_hole()
3772 ext4_clear_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA); in ext4_punch_hole()
3773 if (ext4_has_inline_data(inode)) { in ext4_punch_hole()
3774 down_write(&EXT4_I(inode)->i_mmap_sem); in ext4_punch_hole()
3775 ret = ext4_convert_inline_data(inode); in ext4_punch_hole()
3776 up_write(&EXT4_I(inode)->i_mmap_sem); in ext4_punch_hole()
3792 mutex_lock(&inode->i_mutex); in ext4_punch_hole()
3795 if (offset >= inode->i_size) in ext4_punch_hole()
3802 if (offset + length > inode->i_size) { in ext4_punch_hole()
3803 length = inode->i_size + in ext4_punch_hole()
3804 PAGE_CACHE_SIZE - (inode->i_size & (PAGE_CACHE_SIZE - 1)) - in ext4_punch_hole()
3814 ret = ext4_inode_attach_jinode(inode); in ext4_punch_hole()
3821 ext4_inode_block_unlocked_dio(inode); in ext4_punch_hole()
3822 inode_dio_wait(inode); in ext4_punch_hole()
3828 down_write(&EXT4_I(inode)->i_mmap_sem); in ext4_punch_hole()
3834 ret = ext4_update_disksize_before_punch(inode, offset, length); in ext4_punch_hole()
3837 truncate_pagecache_range(inode, first_block_offset, in ext4_punch_hole()
3841 if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) in ext4_punch_hole()
3842 credits = ext4_writepage_trans_blocks(inode); in ext4_punch_hole()
3844 credits = ext4_blocks_for_truncate(inode); in ext4_punch_hole()
3845 handle = ext4_journal_start(inode, EXT4_HT_TRUNCATE, credits); in ext4_punch_hole()
3852 ret = ext4_zero_partial_blocks(handle, inode, offset, in ext4_punch_hole()
3864 down_write(&EXT4_I(inode)->i_data_sem); in ext4_punch_hole()
3865 ext4_discard_preallocations(inode); in ext4_punch_hole()
3867 ret = ext4_es_remove_extent(inode, first_block, in ext4_punch_hole()
3870 up_write(&EXT4_I(inode)->i_data_sem); in ext4_punch_hole()
3874 if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) in ext4_punch_hole()
3875 ret = ext4_ext_remove_space(inode, first_block, in ext4_punch_hole()
3878 ret = ext4_ind_remove_space(handle, inode, first_block, in ext4_punch_hole()
3881 up_write(&EXT4_I(inode)->i_data_sem); in ext4_punch_hole()
3883 if (IS_SYNC(inode)) in ext4_punch_hole()
3886 inode->i_mtime = inode->i_ctime = ext4_current_time(inode); in ext4_punch_hole()
3887 ext4_mark_inode_dirty(handle, inode); in ext4_punch_hole()
3889 ext4_update_inode_fsync_trans(handle, inode, 1); in ext4_punch_hole()
3893 up_write(&EXT4_I(inode)->i_mmap_sem); in ext4_punch_hole()
3894 ext4_inode_resume_unlocked_dio(inode); in ext4_punch_hole()
3896 mutex_unlock(&inode->i_mutex); in ext4_punch_hole()
3900 int ext4_inode_attach_jinode(struct inode *inode) in ext4_inode_attach_jinode() argument
3902 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_inode_attach_jinode()
3905 if (ei->jinode || !EXT4_SB(inode->i_sb)->s_journal) in ext4_inode_attach_jinode()
3909 spin_lock(&inode->i_lock); in ext4_inode_attach_jinode()
3912 spin_unlock(&inode->i_lock); in ext4_inode_attach_jinode()
3916 jbd2_journal_init_jbd_inode(ei->jinode, inode); in ext4_inode_attach_jinode()
3919 spin_unlock(&inode->i_lock); in ext4_inode_attach_jinode()
3953 void ext4_truncate(struct inode *inode) in ext4_truncate() argument
3955 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_truncate()
3958 struct address_space *mapping = inode->i_mapping; in ext4_truncate()
3965 if (!(inode->i_state & (I_NEW|I_FREEING))) in ext4_truncate()
3966 WARN_ON(!mutex_is_locked(&inode->i_mutex)); in ext4_truncate()
3967 trace_ext4_truncate_enter(inode); in ext4_truncate()
3969 if (!ext4_can_truncate(inode)) in ext4_truncate()
3972 ext4_clear_inode_flag(inode, EXT4_INODE_EOFBLOCKS); in ext4_truncate()
3974 if (inode->i_size == 0 && !test_opt(inode->i_sb, NO_AUTO_DA_ALLOC)) in ext4_truncate()
3975 ext4_set_inode_state(inode, EXT4_STATE_DA_ALLOC_CLOSE); in ext4_truncate()
3977 if (ext4_has_inline_data(inode)) { in ext4_truncate()
3980 ext4_inline_data_truncate(inode, &has_inline); in ext4_truncate()
3986 if (inode->i_size & (inode->i_sb->s_blocksize - 1)) { in ext4_truncate()
3987 if (ext4_inode_attach_jinode(inode) < 0) in ext4_truncate()
3991 if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) in ext4_truncate()
3992 credits = ext4_writepage_trans_blocks(inode); in ext4_truncate()
3994 credits = ext4_blocks_for_truncate(inode); in ext4_truncate()
3996 handle = ext4_journal_start(inode, EXT4_HT_TRUNCATE, credits); in ext4_truncate()
3998 ext4_std_error(inode->i_sb, PTR_ERR(handle)); in ext4_truncate()
4002 if (inode->i_size & (inode->i_sb->s_blocksize - 1)) in ext4_truncate()
4003 ext4_block_truncate_page(handle, mapping, inode->i_size); in ext4_truncate()
4014 if (ext4_orphan_add(handle, inode)) in ext4_truncate()
4017 down_write(&EXT4_I(inode)->i_data_sem); in ext4_truncate()
4019 ext4_discard_preallocations(inode); in ext4_truncate()
4021 if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) in ext4_truncate()
4022 ext4_ext_truncate(handle, inode); in ext4_truncate()
4024 ext4_ind_truncate(handle, inode); in ext4_truncate()
4028 if (IS_SYNC(inode)) in ext4_truncate()
4039 if (inode->i_nlink) in ext4_truncate()
4040 ext4_orphan_del(handle, inode); in ext4_truncate()
4042 inode->i_mtime = inode->i_ctime = ext4_current_time(inode); in ext4_truncate()
4043 ext4_mark_inode_dirty(handle, inode); in ext4_truncate()
4046 trace_ext4_truncate_exit(inode); in ext4_truncate()
4055 static int __ext4_get_inode_loc(struct inode *inode, in __ext4_get_inode_loc() argument
4060 struct super_block *sb = inode->i_sb; in __ext4_get_inode_loc()
4065 if (inode->i_ino < EXT4_ROOT_INO || in __ext4_get_inode_loc()
4066 inode->i_ino > le32_to_cpu(EXT4_SB(sb)->s_es->s_inodes_count)) in __ext4_get_inode_loc()
4069 iloc->block_group = (inode->i_ino - 1) / EXT4_INODES_PER_GROUP(sb); in __ext4_get_inode_loc()
4078 inode_offset = ((inode->i_ino - 1) % in __ext4_get_inode_loc()
4176 trace_ext4_load_inode(inode); in __ext4_get_inode_loc()
4182 EXT4_ERROR_INODE_BLOCK(inode, block, in __ext4_get_inode_loc()
4193 int ext4_get_inode_loc(struct inode *inode, struct ext4_iloc *iloc) in ext4_get_inode_loc() argument
4196 return __ext4_get_inode_loc(inode, iloc, in ext4_get_inode_loc()
4197 !ext4_test_inode_state(inode, EXT4_STATE_XATTR)); in ext4_get_inode_loc()
4200 void ext4_set_inode_flags(struct inode *inode) in ext4_set_inode_flags() argument
4202 unsigned int flags = EXT4_I(inode)->i_flags; in ext4_set_inode_flags()
4215 if (test_opt(inode->i_sb, DAX)) in ext4_set_inode_flags()
4219 inode_set_flags(inode, new_fl, in ext4_set_inode_flags()
4253 struct inode *inode = &(ei->vfs_inode); in ext4_inode_blocks() local
4254 struct super_block *sb = inode->i_sb; in ext4_inode_blocks()
4260 if (ext4_test_inode_flag(inode, EXT4_INODE_HUGE_FILE)) { in ext4_inode_blocks()
4262 return i_blocks << (inode->i_blkbits - 9); in ext4_inode_blocks()
4271 static inline void ext4_iget_extra_inode(struct inode *inode, in ext4_iget_extra_inode() argument
4278 ext4_set_inode_state(inode, EXT4_STATE_XATTR); in ext4_iget_extra_inode()
4279 ext4_find_inline_data_nolock(inode); in ext4_iget_extra_inode()
4281 EXT4_I(inode)->i_inline_off = 0; in ext4_iget_extra_inode()
4284 struct inode *__ext4_iget(struct super_block *sb, unsigned long ino, in __ext4_iget()
4291 struct inode *inode; in __ext4_iget() local
4311 inode = iget_locked(sb, ino); in __ext4_iget()
4312 if (!inode) in __ext4_iget()
4314 if (!(inode->i_state & I_NEW)) in __ext4_iget()
4315 return inode; in __ext4_iget()
4317 ei = EXT4_I(inode); in __ext4_iget()
4320 ret = __ext4_get_inode_loc(inode, &iloc, 0); in __ext4_iget()
4326 ext4_error_inode(inode, function, line, 0, in __ext4_iget()
4338 if (EXT4_INODE_SIZE(inode->i_sb) > EXT4_GOOD_OLD_INODE_SIZE) { in __ext4_iget()
4341 EXT4_INODE_SIZE(inode->i_sb)) { in __ext4_iget()
4342 EXT4_ERROR_INODE(inode, "bad extra_isize (%u != %u)", in __ext4_iget()
4344 EXT4_INODE_SIZE(inode->i_sb)); in __ext4_iget()
4353 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in __ext4_iget()
4355 __le32 inum = cpu_to_le32(inode->i_ino); in __ext4_iget()
4363 if (!ext4_inode_csum_verify(inode, raw_inode, ei)) { in __ext4_iget()
4364 ext4_error_inode(inode, function, line, 0, in __ext4_iget()
4370 inode->i_mode = le16_to_cpu(raw_inode->i_mode); in __ext4_iget()
4373 if (!(test_opt(inode->i_sb, NO_UID32))) { in __ext4_iget()
4377 i_uid_write(inode, i_uid); in __ext4_iget()
4378 i_gid_write(inode, i_gid); in __ext4_iget()
4379 set_nlink(inode, le16_to_cpu(raw_inode->i_links_count)); in __ext4_iget()
4390 if (inode->i_nlink == 0) { in __ext4_iget()
4391 if ((inode->i_mode == 0 || in __ext4_iget()
4392 !(EXT4_SB(inode->i_sb)->s_mount_state & EXT4_ORPHAN_FS)) && in __ext4_iget()
4406 inode->i_blocks = ext4_inode_blocks(raw_inode, ei); in __ext4_iget()
4411 inode->i_size = ext4_isize(raw_inode); in __ext4_iget()
4412 if ((size = i_size_read(inode)) < 0) { in __ext4_iget()
4413 ext4_error_inode(inode, function, line, 0, in __ext4_iget()
4424 ext4_test_inode_flag(inode, EXT4_INODE_INDEX)) { in __ext4_iget()
4425 EXT4_ERROR_INODE(inode, in __ext4_iget()
4430 ei->i_disksize = inode->i_size; in __ext4_iget()
4434 inode->i_generation = le32_to_cpu(raw_inode->i_generation); in __ext4_iget()
4470 if (EXT4_INODE_SIZE(inode->i_sb) > EXT4_GOOD_OLD_INODE_SIZE) { in __ext4_iget()
4476 ext4_iget_extra_inode(inode, raw_inode, ei); in __ext4_iget()
4480 EXT4_INODE_GET_XTIME(i_ctime, inode, raw_inode); in __ext4_iget()
4481 EXT4_INODE_GET_XTIME(i_mtime, inode, raw_inode); in __ext4_iget()
4482 EXT4_INODE_GET_XTIME(i_atime, inode, raw_inode); in __ext4_iget()
4485 if (likely(!test_opt2(inode->i_sb, HURD_COMPAT))) { in __ext4_iget()
4486 inode->i_version = le32_to_cpu(raw_inode->i_disk_version); in __ext4_iget()
4487 if (EXT4_INODE_SIZE(inode->i_sb) > EXT4_GOOD_OLD_INODE_SIZE) { in __ext4_iget()
4489 inode->i_version |= in __ext4_iget()
4496 !ext4_inode_block_valid(inode, ei->i_file_acl, 1)) { in __ext4_iget()
4497 ext4_error_inode(inode, function, line, 0, in __ext4_iget()
4502 } else if (!ext4_has_inline_data(inode)) { in __ext4_iget()
4503 if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) { in __ext4_iget()
4504 if ((S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || in __ext4_iget()
4505 (S_ISLNK(inode->i_mode) && in __ext4_iget()
4506 !ext4_inode_is_fast_symlink(inode)))) in __ext4_iget()
4508 ret = ext4_ext_check_inode(inode); in __ext4_iget()
4509 } else if (S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || in __ext4_iget()
4510 (S_ISLNK(inode->i_mode) && in __ext4_iget()
4511 !ext4_inode_is_fast_symlink(inode))) { in __ext4_iget()
4513 ret = ext4_ind_check_inode(inode); in __ext4_iget()
4519 if (S_ISREG(inode->i_mode)) { in __ext4_iget()
4520 inode->i_op = &ext4_file_inode_operations; in __ext4_iget()
4521 inode->i_fop = &ext4_file_operations; in __ext4_iget()
4522 ext4_set_aops(inode); in __ext4_iget()
4523 } else if (S_ISDIR(inode->i_mode)) { in __ext4_iget()
4524 inode->i_op = &ext4_dir_inode_operations; in __ext4_iget()
4525 inode->i_fop = &ext4_dir_operations; in __ext4_iget()
4526 } else if (S_ISLNK(inode->i_mode)) { in __ext4_iget()
4527 if (ext4_encrypted_inode(inode)) { in __ext4_iget()
4528 inode->i_op = &ext4_encrypted_symlink_inode_operations; in __ext4_iget()
4529 ext4_set_aops(inode); in __ext4_iget()
4530 } else if (ext4_inode_is_fast_symlink(inode)) { in __ext4_iget()
4531 inode->i_link = (char *)ei->i_data; in __ext4_iget()
4532 inode->i_op = &ext4_fast_symlink_inode_operations; in __ext4_iget()
4533 nd_terminate_link(ei->i_data, inode->i_size, in __ext4_iget()
4536 inode->i_op = &ext4_symlink_inode_operations; in __ext4_iget()
4537 ext4_set_aops(inode); in __ext4_iget()
4539 inode_nohighmem(inode); in __ext4_iget()
4540 } else if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode) || in __ext4_iget()
4541 S_ISFIFO(inode->i_mode) || S_ISSOCK(inode->i_mode)) { in __ext4_iget()
4542 inode->i_op = &ext4_special_inode_operations; in __ext4_iget()
4544 init_special_inode(inode, inode->i_mode, in __ext4_iget()
4547 init_special_inode(inode, inode->i_mode, in __ext4_iget()
4550 make_bad_inode(inode); in __ext4_iget()
4553 ext4_error_inode(inode, function, line, 0, in __ext4_iget()
4554 "iget: bogus i_mode (%o)", inode->i_mode); in __ext4_iget()
4558 ext4_set_inode_flags(inode); in __ext4_iget()
4559 unlock_new_inode(inode); in __ext4_iget()
4560 return inode; in __ext4_iget()
4564 iget_failed(inode); in __ext4_iget()
4572 struct inode *inode = &(ei->vfs_inode); in ext4_inode_blocks_set() local
4573 u64 i_blocks = READ_ONCE(inode->i_blocks); in ext4_inode_blocks_set()
4574 struct super_block *sb = inode->i_sb; in ext4_inode_blocks_set()
4583 ext4_clear_inode_flag(inode, EXT4_INODE_HUGE_FILE); in ext4_inode_blocks_set()
4596 ext4_clear_inode_flag(inode, EXT4_INODE_HUGE_FILE); in ext4_inode_blocks_set()
4598 ext4_set_inode_flag(inode, EXT4_INODE_HUGE_FILE); in ext4_inode_blocks_set()
4600 i_blocks = i_blocks >> (inode->i_blkbits - 9); in ext4_inode_blocks_set()
4612 static int other_inode_match(struct inode * inode, unsigned long ino, in other_inode_match() argument
4617 if ((inode->i_ino != ino) || in other_inode_match()
4618 (inode->i_state & (I_FREEING | I_WILL_FREE | I_NEW | in other_inode_match()
4620 ((inode->i_state & I_DIRTY_TIME) == 0)) in other_inode_match()
4622 spin_lock(&inode->i_lock); in other_inode_match()
4623 if (((inode->i_state & (I_FREEING | I_WILL_FREE | I_NEW | in other_inode_match()
4625 (inode->i_state & I_DIRTY_TIME)) { in other_inode_match()
4626 struct ext4_inode_info *ei = EXT4_I(inode); in other_inode_match()
4628 inode->i_state &= ~(I_DIRTY_TIME | I_DIRTY_TIME_EXPIRED); in other_inode_match()
4629 spin_unlock(&inode->i_lock); in other_inode_match()
4632 EXT4_INODE_SET_XTIME(i_ctime, inode, oi->raw_inode); in other_inode_match()
4633 EXT4_INODE_SET_XTIME(i_mtime, inode, oi->raw_inode); in other_inode_match()
4634 EXT4_INODE_SET_XTIME(i_atime, inode, oi->raw_inode); in other_inode_match()
4635 ext4_inode_csum_set(inode, oi->raw_inode, ei); in other_inode_match()
4637 trace_ext4_other_inode_update_time(inode, oi->orig_ino); in other_inode_match()
4640 spin_unlock(&inode->i_lock); in other_inode_match()
4679 struct inode *inode, in ext4_do_update_inode() argument
4683 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_do_update_inode()
4685 struct super_block *sb = inode->i_sb; in ext4_do_update_inode()
4695 if (ext4_test_inode_state(inode, EXT4_STATE_NEW)) in ext4_do_update_inode()
4696 memset(raw_inode, 0, EXT4_SB(inode->i_sb)->s_inode_size); in ext4_do_update_inode()
4699 raw_inode->i_mode = cpu_to_le16(inode->i_mode); in ext4_do_update_inode()
4700 i_uid = i_uid_read(inode); in ext4_do_update_inode()
4701 i_gid = i_gid_read(inode); in ext4_do_update_inode()
4702 if (!(test_opt(inode->i_sb, NO_UID32))) { in ext4_do_update_inode()
4724 raw_inode->i_links_count = cpu_to_le16(inode->i_nlink); in ext4_do_update_inode()
4726 EXT4_INODE_SET_XTIME(i_ctime, inode, raw_inode); in ext4_do_update_inode()
4727 EXT4_INODE_SET_XTIME(i_mtime, inode, raw_inode); in ext4_do_update_inode()
4728 EXT4_INODE_SET_XTIME(i_atime, inode, raw_inode); in ext4_do_update_inode()
4738 if (likely(!test_opt2(inode->i_sb, HURD_COMPAT))) in ext4_do_update_inode()
4752 raw_inode->i_generation = cpu_to_le32(inode->i_generation); in ext4_do_update_inode()
4753 if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) { in ext4_do_update_inode()
4754 if (old_valid_dev(inode->i_rdev)) { in ext4_do_update_inode()
4756 cpu_to_le32(old_encode_dev(inode->i_rdev)); in ext4_do_update_inode()
4761 cpu_to_le32(new_encode_dev(inode->i_rdev)); in ext4_do_update_inode()
4764 } else if (!ext4_has_inline_data(inode)) { in ext4_do_update_inode()
4769 if (likely(!test_opt2(inode->i_sb, HURD_COMPAT))) { in ext4_do_update_inode()
4770 raw_inode->i_disk_version = cpu_to_le32(inode->i_version); in ext4_do_update_inode()
4774 cpu_to_le32(inode->i_version >> 32); in ext4_do_update_inode()
4779 ext4_inode_csum_set(inode, raw_inode, ei); in ext4_do_update_inode()
4781 if (inode->i_sb->s_flags & MS_LAZYTIME) in ext4_do_update_inode()
4782 ext4_update_other_inodes_time(inode->i_sb, inode->i_ino, in ext4_do_update_inode()
4789 ext4_clear_inode_state(inode, EXT4_STATE_NEW); in ext4_do_update_inode()
4800 ext4_update_inode_fsync_trans(handle, inode, need_datasync); in ext4_do_update_inode()
4803 ext4_std_error(inode->i_sb, err); in ext4_do_update_inode()
4841 int ext4_write_inode(struct inode *inode, struct writeback_control *wbc) in ext4_write_inode() argument
4848 if (EXT4_SB(inode->i_sb)->s_journal) { in ext4_write_inode()
4863 err = ext4_force_commit(inode->i_sb); in ext4_write_inode()
4867 err = __ext4_get_inode_loc(inode, &iloc, 0); in ext4_write_inode()
4877 EXT4_ERROR_INODE_BLOCK(inode, iloc.bh->b_blocknr, in ext4_write_inode()
4891 static void ext4_wait_for_tail_page_commit(struct inode *inode) in ext4_wait_for_tail_page_commit() argument
4895 journal_t *journal = EXT4_SB(inode->i_sb)->s_journal; in ext4_wait_for_tail_page_commit()
4899 offset = inode->i_size & (PAGE_CACHE_SIZE - 1); in ext4_wait_for_tail_page_commit()
4905 if (offset > PAGE_CACHE_SIZE - (1 << inode->i_blkbits)) in ext4_wait_for_tail_page_commit()
4908 page = find_lock_page(inode->i_mapping, in ext4_wait_for_tail_page_commit()
4909 inode->i_size >> PAGE_CACHE_SHIFT); in ext4_wait_for_tail_page_commit()
4954 struct inode *inode = d_inode(dentry); in ext4_setattr() local
4959 error = inode_change_ok(inode, attr); in ext4_setattr()
4963 if (is_quota_modification(inode, attr)) { in ext4_setattr()
4964 error = dquot_initialize(inode); in ext4_setattr()
4968 if ((ia_valid & ATTR_UID && !uid_eq(attr->ia_uid, inode->i_uid)) || in ext4_setattr()
4969 (ia_valid & ATTR_GID && !gid_eq(attr->ia_gid, inode->i_gid))) { in ext4_setattr()
4974 handle = ext4_journal_start(inode, EXT4_HT_QUOTA, in ext4_setattr()
4975 (EXT4_MAXQUOTAS_INIT_BLOCKS(inode->i_sb) + in ext4_setattr()
4976 EXT4_MAXQUOTAS_DEL_BLOCKS(inode->i_sb)) + 3); in ext4_setattr()
4981 error = dquot_transfer(inode, attr); in ext4_setattr()
4989 inode->i_uid = attr->ia_uid; in ext4_setattr()
4991 inode->i_gid = attr->ia_gid; in ext4_setattr()
4992 error = ext4_mark_inode_dirty(handle, inode); in ext4_setattr()
4998 loff_t oldsize = inode->i_size; in ext4_setattr()
4999 int shrink = (attr->ia_size <= inode->i_size); in ext4_setattr()
5001 if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) { in ext4_setattr()
5002 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_setattr()
5007 if (!S_ISREG(inode->i_mode)) in ext4_setattr()
5010 if (IS_I_VERSION(inode) && attr->ia_size != inode->i_size) in ext4_setattr()
5011 inode_inc_iversion(inode); in ext4_setattr()
5013 if (ext4_should_order_data(inode) && in ext4_setattr()
5014 (attr->ia_size < inode->i_size)) { in ext4_setattr()
5015 error = ext4_begin_ordered_truncate(inode, in ext4_setattr()
5020 if (attr->ia_size != inode->i_size) { in ext4_setattr()
5021 handle = ext4_journal_start(inode, EXT4_HT_INODE, 3); in ext4_setattr()
5027 error = ext4_orphan_add(handle, inode); in ext4_setattr()
5035 inode->i_mtime = ext4_current_time(inode); in ext4_setattr()
5036 inode->i_ctime = inode->i_mtime; in ext4_setattr()
5038 down_write(&EXT4_I(inode)->i_data_sem); in ext4_setattr()
5039 EXT4_I(inode)->i_disksize = attr->ia_size; in ext4_setattr()
5040 rc = ext4_mark_inode_dirty(handle, inode); in ext4_setattr()
5049 i_size_write(inode, attr->ia_size); in ext4_setattr()
5050 up_write(&EXT4_I(inode)->i_data_sem); in ext4_setattr()
5053 if (orphan && inode->i_nlink) in ext4_setattr()
5054 ext4_orphan_del(NULL, inode); in ext4_setattr()
5059 pagecache_isize_extended(inode, oldsize, inode->i_size); in ext4_setattr()
5067 if (!ext4_should_journal_data(inode)) { in ext4_setattr()
5068 ext4_inode_block_unlocked_dio(inode); in ext4_setattr()
5069 inode_dio_wait(inode); in ext4_setattr()
5070 ext4_inode_resume_unlocked_dio(inode); in ext4_setattr()
5072 ext4_wait_for_tail_page_commit(inode); in ext4_setattr()
5074 down_write(&EXT4_I(inode)->i_mmap_sem); in ext4_setattr()
5079 truncate_pagecache(inode, inode->i_size); in ext4_setattr()
5081 ext4_truncate(inode); in ext4_setattr()
5082 up_write(&EXT4_I(inode)->i_mmap_sem); in ext4_setattr()
5086 setattr_copy(inode, attr); in ext4_setattr()
5087 mark_inode_dirty(inode); in ext4_setattr()
5094 if (orphan && inode->i_nlink) in ext4_setattr()
5095 ext4_orphan_del(NULL, inode); in ext4_setattr()
5098 rc = posix_acl_chmod(inode, inode->i_mode); in ext4_setattr()
5101 ext4_std_error(inode->i_sb, error); in ext4_setattr()
5110 struct inode *inode; in ext4_getattr() local
5113 inode = d_inode(dentry); in ext4_getattr()
5114 generic_fillattr(inode, stat); in ext4_getattr()
5122 if (unlikely(ext4_has_inline_data(inode))) in ext4_getattr()
5135 delalloc_blocks = EXT4_C2B(EXT4_SB(inode->i_sb), in ext4_getattr()
5136 EXT4_I(inode)->i_reserved_data_blocks); in ext4_getattr()
5137 stat->blocks += delalloc_blocks << (inode->i_sb->s_blocksize_bits - 9); in ext4_getattr()
5141 static int ext4_index_trans_blocks(struct inode *inode, int lblocks, in ext4_index_trans_blocks() argument
5144 if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) in ext4_index_trans_blocks()
5145 return ext4_ind_trans_blocks(inode, lblocks); in ext4_index_trans_blocks()
5146 return ext4_ext_index_trans_blocks(inode, pextents); in ext4_index_trans_blocks()
5160 static int ext4_meta_trans_blocks(struct inode *inode, int lblocks, in ext4_meta_trans_blocks() argument
5163 ext4_group_t groups, ngroups = ext4_get_groups_count(inode->i_sb); in ext4_meta_trans_blocks()
5172 idxblocks = ext4_index_trans_blocks(inode, lblocks, pextents); in ext4_meta_trans_blocks()
5184 if (groups > EXT4_SB(inode->i_sb)->s_gdb_count) in ext4_meta_trans_blocks()
5185 gdpblocks = EXT4_SB(inode->i_sb)->s_gdb_count; in ext4_meta_trans_blocks()
5191 ret += EXT4_META_TRANS_BLOCKS(inode->i_sb); in ext4_meta_trans_blocks()
5206 int ext4_writepage_trans_blocks(struct inode *inode) in ext4_writepage_trans_blocks() argument
5208 int bpp = ext4_journal_blocks_per_page(inode); in ext4_writepage_trans_blocks()
5211 ret = ext4_meta_trans_blocks(inode, bpp, bpp); in ext4_writepage_trans_blocks()
5214 if (ext4_should_journal_data(inode)) in ext4_writepage_trans_blocks()
5228 int ext4_chunk_trans_blocks(struct inode *inode, int nrblocks) in ext4_chunk_trans_blocks() argument
5230 return ext4_meta_trans_blocks(inode, nrblocks, 1); in ext4_chunk_trans_blocks()
5238 struct inode *inode, struct ext4_iloc *iloc) in ext4_mark_iloc_dirty() argument
5242 if (IS_I_VERSION(inode)) in ext4_mark_iloc_dirty()
5243 inode_inc_iversion(inode); in ext4_mark_iloc_dirty()
5249 err = ext4_do_update_inode(handle, inode, iloc); in ext4_mark_iloc_dirty()
5260 ext4_reserve_inode_write(handle_t *handle, struct inode *inode, in ext4_reserve_inode_write() argument
5265 err = ext4_get_inode_loc(inode, iloc); in ext4_reserve_inode_write()
5274 ext4_std_error(inode->i_sb, err); in ext4_reserve_inode_write()
5282 static int ext4_expand_extra_isize(struct inode *inode, in ext4_expand_extra_isize() argument
5289 unsigned int inode_size = EXT4_INODE_SIZE(inode->i_sb); in ext4_expand_extra_isize()
5290 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_expand_extra_isize()
5292 if (EXT4_I(inode)->i_extra_isize >= new_extra_isize) in ext4_expand_extra_isize()
5298 EXT4_ERROR_INODE(inode, "bad extra_isize %u (inode size %u)", in ext4_expand_extra_isize()
5300 EXT4_INODE_SIZE(inode->i_sb)); in ext4_expand_extra_isize()
5310 header = IHDR(inode, raw_inode); in ext4_expand_extra_isize()
5313 if (!ext4_test_inode_state(inode, EXT4_STATE_XATTR) || in ext4_expand_extra_isize()
5316 EXT4_I(inode)->i_extra_isize, 0, in ext4_expand_extra_isize()
5317 new_extra_isize - EXT4_I(inode)->i_extra_isize); in ext4_expand_extra_isize()
5318 EXT4_I(inode)->i_extra_isize = new_extra_isize; in ext4_expand_extra_isize()
5323 return ext4_expand_extra_isize_ea(inode, new_extra_isize, in ext4_expand_extra_isize()
5340 int ext4_mark_inode_dirty(handle_t *handle, struct inode *inode) in ext4_mark_inode_dirty() argument
5343 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); in ext4_mark_inode_dirty()
5348 trace_ext4_mark_inode_dirty(inode, _RET_IP_); in ext4_mark_inode_dirty()
5349 err = ext4_reserve_inode_write(handle, inode, &iloc); in ext4_mark_inode_dirty()
5353 EXT4_I(inode)->i_extra_isize < sbi->s_want_extra_isize && in ext4_mark_inode_dirty()
5354 !ext4_test_inode_state(inode, EXT4_STATE_NO_EXPAND)) { in ext4_mark_inode_dirty()
5363 EXT4_DATA_TRANS_BLOCKS(inode->i_sb))) == 0) { in ext4_mark_inode_dirty()
5364 ret = ext4_expand_extra_isize(inode, in ext4_mark_inode_dirty()
5370 ext4_warning(inode->i_sb, in ext4_mark_inode_dirty()
5373 inode->i_ino); in ext4_mark_inode_dirty()
5380 return ext4_mark_iloc_dirty(handle, inode, &iloc); in ext4_mark_inode_dirty()
5401 void ext4_dirty_inode(struct inode *inode, int flags) in ext4_dirty_inode() argument
5407 handle = ext4_journal_start(inode, EXT4_HT_INODE, 2); in ext4_dirty_inode()
5411 ext4_mark_inode_dirty(handle, inode); in ext4_dirty_inode()
5426 static int ext4_pin_inode(handle_t *handle, struct inode *inode)
5432 err = ext4_get_inode_loc(inode, &iloc);
5443 ext4_std_error(inode->i_sb, err);
5448 int ext4_change_inode_journal_flag(struct inode *inode, int val) in ext4_change_inode_journal_flag() argument
5464 journal = EXT4_JOURNAL(inode); in ext4_change_inode_journal_flag()
5475 if (val && test_opt(inode->i_sb, DELALLOC)) { in ext4_change_inode_journal_flag()
5476 err = ext4_alloc_da_blocks(inode); in ext4_change_inode_journal_flag()
5482 ext4_inode_block_unlocked_dio(inode); in ext4_change_inode_journal_flag()
5483 inode_dio_wait(inode); in ext4_change_inode_journal_flag()
5496 ext4_set_inode_flag(inode, EXT4_INODE_JOURNAL_DATA); in ext4_change_inode_journal_flag()
5501 ext4_inode_resume_unlocked_dio(inode); in ext4_change_inode_journal_flag()
5504 ext4_clear_inode_flag(inode, EXT4_INODE_JOURNAL_DATA); in ext4_change_inode_journal_flag()
5506 ext4_set_aops(inode); in ext4_change_inode_journal_flag()
5509 ext4_inode_resume_unlocked_dio(inode); in ext4_change_inode_journal_flag()
5513 handle = ext4_journal_start(inode, EXT4_HT_INODE, 1); in ext4_change_inode_journal_flag()
5517 err = ext4_mark_inode_dirty(handle, inode); in ext4_change_inode_journal_flag()
5520 ext4_std_error(inode->i_sb, err); in ext4_change_inode_journal_flag()
5537 struct inode *inode = file_inode(file); in ext4_page_mkwrite() local
5538 struct address_space *mapping = inode->i_mapping; in ext4_page_mkwrite()
5543 sb_start_pagefault(inode->i_sb); in ext4_page_mkwrite()
5546 down_read(&EXT4_I(inode)->i_mmap_sem); in ext4_page_mkwrite()
5548 ret = ext4_convert_inline_data(inode); in ext4_page_mkwrite()
5553 if (test_opt(inode->i_sb, DELALLOC) && in ext4_page_mkwrite()
5554 !ext4_should_journal_data(inode) && in ext4_page_mkwrite()
5555 !ext4_nonda_switch(inode->i_sb)) { in ext4_page_mkwrite()
5560 ext4_should_retry_alloc(inode->i_sb, &retries)); in ext4_page_mkwrite()
5565 size = i_size_read(inode); in ext4_page_mkwrite()
5593 if (ext4_should_dioread_nolock(inode)) in ext4_page_mkwrite()
5598 handle = ext4_journal_start(inode, EXT4_HT_WRITE_PAGE, in ext4_page_mkwrite()
5599 ext4_writepage_trans_blocks(inode)); in ext4_page_mkwrite()
5605 if (!ret && ext4_should_journal_data(inode)) { in ext4_page_mkwrite()
5613 ext4_set_inode_state(inode, EXT4_STATE_JDATA); in ext4_page_mkwrite()
5616 if (ret == -ENOSPC && ext4_should_retry_alloc(inode->i_sb, &retries)) in ext4_page_mkwrite()
5621 up_read(&EXT4_I(inode)->i_mmap_sem); in ext4_page_mkwrite()
5622 sb_end_pagefault(inode->i_sb); in ext4_page_mkwrite()
5628 struct inode *inode = file_inode(vma->vm_file); in ext4_filemap_fault() local
5631 down_read(&EXT4_I(inode)->i_mmap_sem); in ext4_filemap_fault()
5633 up_read(&EXT4_I(inode)->i_mmap_sem); in ext4_filemap_fault()