Lines Matching refs:inode
25 struct inode *inode,
28 static int ext4_get_inline_size(struct inode *inode) in ext4_get_inline_size() argument
30 if (EXT4_I(inode)->i_inline_off) in ext4_get_inline_size()
31 return EXT4_I(inode)->i_inline_size; in ext4_get_inline_size()
36 static int get_max_inline_xattr_value_size(struct inode *inode, in get_max_inline_xattr_value_size() argument
45 if (!EXT4_INODE_HAS_XATTR_SPACE(inode)) in get_max_inline_xattr_value_size()
48 min_offs = EXT4_SB(inode->i_sb)->s_inode_size - in get_max_inline_xattr_value_size()
50 EXT4_I(inode)->i_extra_isize - in get_max_inline_xattr_value_size()
58 if (!ext4_test_inode_state(inode, EXT4_STATE_XATTR)) in get_max_inline_xattr_value_size()
64 header = IHDR(inode, raw_inode); in get_max_inline_xattr_value_size()
66 end = (void *)raw_inode + EXT4_SB(inode->i_sb)->s_inode_size; in get_max_inline_xattr_value_size()
73 EXT4_ERROR_INODE(inode, in get_max_inline_xattr_value_size()
87 if (EXT4_I(inode)->i_inline_off) { in get_max_inline_xattr_value_size()
89 ((void *)raw_inode + EXT4_I(inode)->i_inline_off); in get_max_inline_xattr_value_size()
111 int ext4_get_max_inline_size(struct inode *inode) in ext4_get_max_inline_size() argument
116 if (EXT4_I(inode)->i_extra_isize == 0) in ext4_get_max_inline_size()
119 error = ext4_get_inode_loc(inode, &iloc); in ext4_get_max_inline_size()
121 ext4_error_inode_err(inode, __func__, __LINE__, 0, -error, in ext4_get_max_inline_size()
123 inode->i_ino); in ext4_get_max_inline_size()
127 down_read(&EXT4_I(inode)->xattr_sem); in ext4_get_max_inline_size()
128 max_inline_size = get_max_inline_xattr_value_size(inode, &iloc); in ext4_get_max_inline_size()
129 up_read(&EXT4_I(inode)->xattr_sem); in ext4_get_max_inline_size()
144 int ext4_find_inline_data_nolock(struct inode *inode) in ext4_find_inline_data_nolock() argument
155 if (EXT4_I(inode)->i_extra_isize == 0) in ext4_find_inline_data_nolock()
158 error = ext4_get_inode_loc(inode, &is.iloc); in ext4_find_inline_data_nolock()
162 error = ext4_xattr_ibody_find(inode, &i, &is); in ext4_find_inline_data_nolock()
168 EXT4_ERROR_INODE(inode, "inline data xattr refers " in ext4_find_inline_data_nolock()
173 EXT4_I(inode)->i_inline_off = (u16)((void *)is.s.here - in ext4_find_inline_data_nolock()
175 EXT4_I(inode)->i_inline_size = EXT4_MIN_INLINE_DATA_SIZE + in ext4_find_inline_data_nolock()
183 static int ext4_read_inline_data(struct inode *inode, void *buffer, in ext4_read_inline_data() argument
195 BUG_ON(len > EXT4_I(inode)->i_inline_size); in ext4_read_inline_data()
208 header = IHDR(inode, raw_inode); in ext4_read_inline_data()
210 EXT4_I(inode)->i_inline_off); in ext4_read_inline_data()
228 static void ext4_write_inline_data(struct inode *inode, struct ext4_iloc *iloc, in ext4_write_inline_data() argument
236 if (unlikely(ext4_emergency_state(inode->i_sb))) in ext4_write_inline_data()
239 BUG_ON(!EXT4_I(inode)->i_inline_off); in ext4_write_inline_data()
240 BUG_ON(pos + len > EXT4_I(inode)->i_inline_size); in ext4_write_inline_data()
259 header = IHDR(inode, raw_inode); in ext4_write_inline_data()
261 EXT4_I(inode)->i_inline_off); in ext4_write_inline_data()
268 struct inode *inode, unsigned len) in ext4_create_inline_data() argument
280 error = ext4_get_inode_loc(inode, &is.iloc); in ext4_create_inline_data()
285 error = ext4_journal_get_write_access(handle, inode->i_sb, is.iloc.bh, in ext4_create_inline_data()
302 error = ext4_xattr_ibody_find(inode, &i, &is); in ext4_create_inline_data()
307 EXT4_ERROR_INODE(inode, "unexpected inline data xattr"); in ext4_create_inline_data()
312 error = ext4_xattr_ibody_set(handle, inode, &i, &is); in ext4_create_inline_data()
315 ext4_clear_inode_state(inode, in ext4_create_inline_data()
323 EXT4_I(inode)->i_inline_off = (u16)((void *)is.s.here - in ext4_create_inline_data()
325 EXT4_I(inode)->i_inline_size = len + EXT4_MIN_INLINE_DATA_SIZE; in ext4_create_inline_data()
326 ext4_clear_inode_flag(inode, EXT4_INODE_EXTENTS); in ext4_create_inline_data()
327 ext4_set_inode_flag(inode, EXT4_INODE_INLINE_DATA); in ext4_create_inline_data()
329 error = ext4_mark_iloc_dirty(handle, inode, &is.iloc); in ext4_create_inline_data()
336 static int ext4_update_inline_data(handle_t *handle, struct inode *inode, in ext4_update_inline_data() argument
350 if (len <= EXT4_I(inode)->i_inline_size) in ext4_update_inline_data()
353 error = ext4_get_inode_loc(inode, &is.iloc); in ext4_update_inline_data()
357 error = ext4_xattr_ibody_find(inode, &i, &is); in ext4_update_inline_data()
362 EXT4_ERROR_INODE(inode, "missing inline data xattr"); in ext4_update_inline_data()
374 error = ext4_xattr_ibody_get(inode, i.name_index, i.name, in ext4_update_inline_data()
380 error = ext4_journal_get_write_access(handle, inode->i_sb, is.iloc.bh, in ext4_update_inline_data()
389 error = ext4_xattr_ibody_set(handle, inode, &i, &is); in ext4_update_inline_data()
393 EXT4_I(inode)->i_inline_off = (u16)((void *)is.s.here - in ext4_update_inline_data()
395 EXT4_I(inode)->i_inline_size = EXT4_MIN_INLINE_DATA_SIZE + in ext4_update_inline_data()
397 ext4_set_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA); in ext4_update_inline_data()
399 error = ext4_mark_iloc_dirty(handle, inode, &is.iloc); in ext4_update_inline_data()
407 static int ext4_prepare_inline_data(handle_t *handle, struct inode *inode, in ext4_prepare_inline_data() argument
411 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_prepare_inline_data()
413 if (!ext4_test_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA)) in ext4_prepare_inline_data()
416 size = ext4_get_max_inline_size(inode); in ext4_prepare_inline_data()
420 ext4_write_lock_xattr(inode, &no_expand); in ext4_prepare_inline_data()
426 (void) ext4_find_inline_data_nolock(inode); in ext4_prepare_inline_data()
428 ret = ext4_update_inline_data(handle, inode, len); in ext4_prepare_inline_data()
430 ret = ext4_create_inline_data(handle, inode, len); in ext4_prepare_inline_data()
432 ext4_write_unlock_xattr(inode, &no_expand); in ext4_prepare_inline_data()
437 struct inode *inode) in ext4_destroy_inline_data_nolock() argument
439 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_destroy_inline_data_nolock()
456 error = ext4_get_inode_loc(inode, &is.iloc); in ext4_destroy_inline_data_nolock()
462 error = ext4_xattr_ibody_find(inode, &i, &is); in ext4_destroy_inline_data_nolock()
467 error = ext4_journal_get_write_access(handle, inode->i_sb, is.iloc.bh, in ext4_destroy_inline_data_nolock()
472 error = ext4_xattr_ibody_set(handle, inode, &i, &is); in ext4_destroy_inline_data_nolock()
480 if (ext4_has_feature_extents(inode->i_sb)) { in ext4_destroy_inline_data_nolock()
481 if (S_ISDIR(inode->i_mode) || in ext4_destroy_inline_data_nolock()
482 S_ISREG(inode->i_mode) || S_ISLNK(inode->i_mode)) { in ext4_destroy_inline_data_nolock()
483 ext4_set_inode_flag(inode, EXT4_INODE_EXTENTS); in ext4_destroy_inline_data_nolock()
484 ext4_ext_tree_init(handle, inode); in ext4_destroy_inline_data_nolock()
487 ext4_clear_inode_flag(inode, EXT4_INODE_INLINE_DATA); in ext4_destroy_inline_data_nolock()
490 error = ext4_mark_iloc_dirty(handle, inode, &is.iloc); in ext4_destroy_inline_data_nolock()
492 EXT4_I(inode)->i_inline_off = 0; in ext4_destroy_inline_data_nolock()
493 EXT4_I(inode)->i_inline_size = 0; in ext4_destroy_inline_data_nolock()
494 ext4_clear_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA); in ext4_destroy_inline_data_nolock()
503 static int ext4_read_inline_folio(struct inode *inode, struct folio *folio) in ext4_read_inline_folio() argument
511 BUG_ON(!ext4_has_inline_data(inode)); in ext4_read_inline_folio()
514 if (!EXT4_I(inode)->i_inline_off) { in ext4_read_inline_folio()
515 ext4_warning(inode->i_sb, "inode %lu doesn't have inline data.", in ext4_read_inline_folio()
516 inode->i_ino); in ext4_read_inline_folio()
520 ret = ext4_get_inode_loc(inode, &iloc); in ext4_read_inline_folio()
524 len = min_t(size_t, ext4_get_inline_size(inode), i_size_read(inode)); in ext4_read_inline_folio()
527 ext4_error_inode(inode, __func__, __LINE__, 0, in ext4_read_inline_folio()
535 ret = ext4_read_inline_data(inode, kaddr, len, &iloc); in ext4_read_inline_folio()
545 int ext4_readpage_inline(struct inode *inode, struct folio *folio) in ext4_readpage_inline() argument
549 down_read(&EXT4_I(inode)->xattr_sem); in ext4_readpage_inline()
550 if (!ext4_has_inline_data(inode)) { in ext4_readpage_inline()
551 up_read(&EXT4_I(inode)->xattr_sem); in ext4_readpage_inline()
560 ret = ext4_read_inline_folio(inode, folio); in ext4_readpage_inline()
566 up_read(&EXT4_I(inode)->xattr_sem); in ext4_readpage_inline()
573 struct inode *inode) in ext4_convert_inline_data_to_extent() argument
582 if (!ext4_has_inline_data(inode)) { in ext4_convert_inline_data_to_extent()
587 ext4_clear_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA); in ext4_convert_inline_data_to_extent()
591 needed_blocks = ext4_chunk_trans_extent(inode, 1); in ext4_convert_inline_data_to_extent()
593 ret = ext4_get_inode_loc(inode, &iloc); in ext4_convert_inline_data_to_extent()
598 handle = ext4_journal_start(inode, EXT4_HT_WRITE_PAGE, needed_blocks); in ext4_convert_inline_data_to_extent()
614 ext4_write_lock_xattr(inode, &no_expand); in ext4_convert_inline_data_to_extent()
617 if (!ext4_has_inline_data(inode)) { in ext4_convert_inline_data_to_extent()
623 to = ext4_get_inline_size(inode); in ext4_convert_inline_data_to_extent()
625 ret = ext4_read_inline_folio(inode, folio); in ext4_convert_inline_data_to_extent()
630 ext4_fc_track_inode(handle, inode); in ext4_convert_inline_data_to_extent()
631 ret = ext4_destroy_inline_data_nolock(handle, inode); in ext4_convert_inline_data_to_extent()
635 if (ext4_should_dioread_nolock(inode)) { in ext4_convert_inline_data_to_extent()
643 if (!ret && ext4_should_journal_data(inode)) { in ext4_convert_inline_data_to_extent()
644 ret = ext4_walk_page_buffers(handle, inode, in ext4_convert_inline_data_to_extent()
653 ext4_orphan_add(handle, inode); in ext4_convert_inline_data_to_extent()
654 ext4_write_unlock_xattr(inode, &no_expand); in ext4_convert_inline_data_to_extent()
658 ext4_truncate_failed_write(inode); in ext4_convert_inline_data_to_extent()
665 if (inode->i_nlink) in ext4_convert_inline_data_to_extent()
666 ext4_orphan_del(NULL, inode); in ext4_convert_inline_data_to_extent()
669 if (ret == -ENOSPC && ext4_should_retry_alloc(inode->i_sb, &retries)) in ext4_convert_inline_data_to_extent()
681 ext4_write_unlock_xattr(inode, &no_expand); in ext4_convert_inline_data_to_extent()
697 struct inode *inode, in ext4_generic_write_inline_data() argument
708 ret = ext4_get_inode_loc(inode, &iloc); in ext4_generic_write_inline_data()
713 handle = ext4_journal_start(inode, EXT4_HT_INODE, 1); in ext4_generic_write_inline_data()
719 ret = ext4_prepare_inline_data(handle, inode, pos + len); in ext4_generic_write_inline_data()
728 return ext4_convert_inline_data_to_extent(mapping, inode); in ext4_generic_write_inline_data()
731 ret = ext4_da_convert_inline_data_to_extent(mapping, inode, fsdata); in ext4_generic_write_inline_data()
733 ext4_should_retry_alloc(inode->i_sb, &retries)) in ext4_generic_write_inline_data()
745 down_read(&EXT4_I(inode)->xattr_sem); in ext4_generic_write_inline_data()
747 if (!ext4_has_inline_data(inode)) { in ext4_generic_write_inline_data()
753 ret = ext4_read_inline_folio(inode, folio); in ext4_generic_write_inline_data()
758 ret = ext4_journal_get_write_access(handle, inode->i_sb, iloc.bh, EXT4_JTR_NONE); in ext4_generic_write_inline_data()
762 up_read(&EXT4_I(inode)->xattr_sem); in ext4_generic_write_inline_data()
767 up_read(&EXT4_I(inode)->xattr_sem); in ext4_generic_write_inline_data()
784 struct inode *inode, in ext4_try_to_write_inline_data() argument
788 if (pos + len > ext4_get_max_inline_size(inode)) in ext4_try_to_write_inline_data()
789 return ext4_convert_inline_data_to_extent(mapping, inode); in ext4_try_to_write_inline_data()
790 return ext4_generic_write_inline_data(mapping, inode, pos, len, in ext4_try_to_write_inline_data()
794 int ext4_write_inline_data_end(struct inode *inode, loff_t pos, unsigned len, in ext4_write_inline_data_end() argument
807 ret = ext4_get_inode_loc(inode, &iloc); in ext4_write_inline_data_end()
811 ext4_std_error(inode->i_sb, ret); in ext4_write_inline_data_end()
814 ext4_write_lock_xattr(inode, &no_expand); in ext4_write_inline_data_end()
815 BUG_ON(!ext4_has_inline_data(inode)); in ext4_write_inline_data_end()
822 (void) ext4_find_inline_data_nolock(inode); in ext4_write_inline_data_end()
825 ext4_write_inline_data(inode, &iloc, kaddr, pos, copied); in ext4_write_inline_data_end()
831 ext4_write_unlock_xattr(inode, &no_expand); in ext4_write_inline_data_end()
839 ext4_update_inode_size(inode, pos + copied); in ext4_write_inline_data_end()
851 mark_inode_dirty(inode); in ext4_write_inline_data_end()
857 if (pos + len > inode->i_size && ext4_can_truncate(inode)) in ext4_write_inline_data_end()
858 ext4_orphan_add(handle, inode); in ext4_write_inline_data_end()
863 if (pos + len > inode->i_size) { in ext4_write_inline_data_end()
864 ext4_truncate_failed_write(inode); in ext4_write_inline_data_end()
870 if (inode->i_nlink) in ext4_write_inline_data_end()
871 ext4_orphan_del(NULL, inode); in ext4_write_inline_data_end()
886 struct inode *inode, in ext4_da_convert_inline_data_to_extent() argument
897 down_read(&EXT4_I(inode)->xattr_sem); in ext4_da_convert_inline_data_to_extent()
898 if (!ext4_has_inline_data(inode)) { in ext4_da_convert_inline_data_to_extent()
899 ext4_clear_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA); in ext4_da_convert_inline_data_to_extent()
903 inline_size = ext4_get_inline_size(inode); in ext4_da_convert_inline_data_to_extent()
906 ret = ext4_read_inline_folio(inode, folio); in ext4_da_convert_inline_data_to_extent()
914 up_read(&EXT4_I(inode)->xattr_sem); in ext4_da_convert_inline_data_to_extent()
917 ext4_truncate_failed_write(inode); in ext4_da_convert_inline_data_to_extent()
924 ext4_clear_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA); in ext4_da_convert_inline_data_to_extent()
928 up_read(&EXT4_I(inode)->xattr_sem); in ext4_da_convert_inline_data_to_extent()
937 void ext4_show_inline_dir(struct inode *dir, struct buffer_head *bh, in ext4_show_inline_dir()
951 de->name_len, le32_to_cpu(de->inode)); in ext4_show_inline_dir()
971 struct inode *dir, in ext4_add_dirent_to_inline()
972 struct inode *inode, in ext4_add_dirent_to_inline() argument
989 ext4_insert_dentry(dir, inode, de, inline_size, fname); in ext4_add_dirent_to_inline()
1010 static void *ext4_get_inline_xattr_pos(struct inode *inode, in ext4_get_inline_xattr_pos() argument
1016 BUG_ON(!EXT4_I(inode)->i_inline_off); in ext4_get_inline_xattr_pos()
1018 header = IHDR(inode, ext4_raw_inode(iloc)); in ext4_get_inline_xattr_pos()
1020 EXT4_I(inode)->i_inline_off); in ext4_get_inline_xattr_pos()
1046 de->inode = 0; in ext4_update_final_de()
1051 static int ext4_update_inline_dir(handle_t *handle, struct inode *dir, in ext4_update_inline_dir()
1073 static void ext4_restore_inline_data(handle_t *handle, struct inode *inode, in ext4_restore_inline_data() argument
1079 ret = ext4_create_inline_data(handle, inode, inline_size); in ext4_restore_inline_data()
1081 ext4_msg(inode->i_sb, KERN_EMERG, in ext4_restore_inline_data()
1083 inode->i_ino, ret); in ext4_restore_inline_data()
1086 ext4_write_inline_data(inode, iloc, buf, 0, inline_size); in ext4_restore_inline_data()
1087 ext4_set_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA); in ext4_restore_inline_data()
1091 struct inode *inode, in ext4_convert_inline_data_nolock() argument
1100 inline_size = ext4_get_inline_size(inode); in ext4_convert_inline_data_nolock()
1107 error = ext4_read_inline_data(inode, buf, inline_size, iloc); in ext4_convert_inline_data_nolock()
1115 if (S_ISDIR(inode->i_mode)) { in ext4_convert_inline_data_nolock()
1116 error = ext4_check_all_de(inode, iloc->bh, in ext4_convert_inline_data_nolock()
1123 error = ext4_destroy_inline_data_nolock(handle, inode); in ext4_convert_inline_data_nolock()
1130 error = ext4_map_blocks(handle, inode, &map, EXT4_GET_BLOCKS_CREATE); in ext4_convert_inline_data_nolock()
1138 data_bh = sb_getblk(inode->i_sb, map.m_pblk); in ext4_convert_inline_data_nolock()
1145 error = ext4_journal_get_create_access(handle, inode->i_sb, data_bh, in ext4_convert_inline_data_nolock()
1152 memset(data_bh->b_data, 0, inode->i_sb->s_blocksize); in ext4_convert_inline_data_nolock()
1154 if (!S_ISDIR(inode->i_mode)) { in ext4_convert_inline_data_nolock()
1159 inode, data_bh); in ext4_convert_inline_data_nolock()
1162 inode->i_size = inode->i_sb->s_blocksize; in ext4_convert_inline_data_nolock()
1163 i_size_write(inode, inode->i_sb->s_blocksize); in ext4_convert_inline_data_nolock()
1164 EXT4_I(inode)->i_disksize = inode->i_sb->s_blocksize; in ext4_convert_inline_data_nolock()
1166 error = ext4_init_dirblock(handle, inode, data_bh, in ext4_convert_inline_data_nolock()
1167 le32_to_cpu(((struct ext4_dir_entry_2 *)buf)->inode), in ext4_convert_inline_data_nolock()
1171 error = ext4_mark_inode_dirty(handle, inode); in ext4_convert_inline_data_nolock()
1176 ext4_restore_inline_data(handle, inode, iloc, buf, inline_size); in ext4_convert_inline_data_nolock()
1190 struct inode *dir, struct inode *inode) in ext4_try_add_inline_entry() argument
1208 ret = ext4_add_dirent_to_inline(handle, fname, dir, inode, &iloc, in ext4_try_add_inline_entry()
1230 inode, &iloc, inline_start, in ext4_try_add_inline_entry()
1259 struct inode *dir, ext4_lblk_t block, in ext4_inlinedir_to_tree()
1268 struct inode *inode = file_inode(dir_file); in ext4_inlinedir_to_tree() local
1275 ret = ext4_get_inode_loc(inode, &iloc); in ext4_inlinedir_to_tree()
1279 down_read(&EXT4_I(inode)->xattr_sem); in ext4_inlinedir_to_tree()
1280 if (!ext4_has_inline_data(inode)) { in ext4_inlinedir_to_tree()
1281 up_read(&EXT4_I(inode)->xattr_sem); in ext4_inlinedir_to_tree()
1286 inline_size = ext4_get_inline_size(inode); in ext4_inlinedir_to_tree()
1290 up_read(&EXT4_I(inode)->xattr_sem); in ext4_inlinedir_to_tree()
1294 ret = ext4_read_inline_data(inode, dir_buf, inline_size, &iloc); in ext4_inlinedir_to_tree()
1295 up_read(&EXT4_I(inode)->xattr_sem); in ext4_inlinedir_to_tree()
1300 parent_ino = le32_to_cpu(((struct ext4_dir_entry_2 *)dir_buf)->inode); in ext4_inlinedir_to_tree()
1308 fake.inode = cpu_to_le32(inode->i_ino); in ext4_inlinedir_to_tree()
1314 ext4_set_de_type(inode->i_sb, &fake, S_IFDIR); in ext4_inlinedir_to_tree()
1318 fake.inode = cpu_to_le32(parent_ino); in ext4_inlinedir_to_tree()
1324 ext4_set_de_type(inode->i_sb, &fake, S_IFDIR); in ext4_inlinedir_to_tree()
1330 if (ext4_check_dir_entry(inode, dir_file, de, in ext4_inlinedir_to_tree()
1352 if (de->inode == 0) in ext4_inlinedir_to_tree()
1387 struct inode *inode = file_inode(file); in ext4_read_inline_dir() local
1394 ret = ext4_get_inode_loc(inode, &iloc); in ext4_read_inline_dir()
1398 down_read(&EXT4_I(inode)->xattr_sem); in ext4_read_inline_dir()
1399 if (!ext4_has_inline_data(inode)) { in ext4_read_inline_dir()
1400 up_read(&EXT4_I(inode)->xattr_sem); in ext4_read_inline_dir()
1405 inline_size = ext4_get_inline_size(inode); in ext4_read_inline_dir()
1409 up_read(&EXT4_I(inode)->xattr_sem); in ext4_read_inline_dir()
1413 ret = ext4_read_inline_data(inode, dir_buf, inline_size, &iloc); in ext4_read_inline_dir()
1414 up_read(&EXT4_I(inode)->xattr_sem); in ext4_read_inline_dir()
1419 sb = inode->i_sb; in ext4_read_inline_dir()
1420 parent_ino = le32_to_cpu(((struct ext4_dir_entry_2 *)dir_buf)->inode); in ext4_read_inline_dir()
1441 if (!inode_eq_iversion(inode, info->cookie)) { in ext4_read_inline_dir()
1473 info->cookie = inode_query_iversion(inode); in ext4_read_inline_dir()
1478 if (!dir_emit(ctx, ".", 1, inode->i_ino, DT_DIR)) in ext4_read_inline_dir()
1493 if (ext4_check_dir_entry(inode, file, de, iloc.bh, dir_buf, in ext4_read_inline_dir()
1496 if (le32_to_cpu(de->inode)) { in ext4_read_inline_dir()
1498 le32_to_cpu(de->inode), in ext4_read_inline_dir()
1510 void *ext4_read_inline_link(struct inode *inode) in ext4_read_inline_link() argument
1516 ret = ext4_get_inode_loc(inode, &iloc); in ext4_read_inline_link()
1521 inline_size = ext4_get_inline_size(inode); in ext4_read_inline_link()
1526 ret = ext4_read_inline_data(inode, link, inline_size, &iloc); in ext4_read_inline_link()
1531 nd_terminate_link(link, inode->i_size, ret); in ext4_read_inline_link()
1539 struct buffer_head *ext4_get_first_inline_block(struct inode *inode, in ext4_get_first_inline_block() argument
1545 *retval = ext4_get_inode_loc(inode, &iloc); in ext4_get_first_inline_block()
1559 int ext4_try_create_inline_dir(handle_t *handle, struct inode *parent, in ext4_try_create_inline_dir()
1560 struct inode *inode) in ext4_try_create_inline_dir() argument
1566 ret = ext4_get_inode_loc(inode, &iloc); in ext4_try_create_inline_dir()
1570 ret = ext4_prepare_inline_data(handle, inode, inline_size); in ext4_try_create_inline_dir()
1579 de->inode = cpu_to_le32(parent->i_ino); in ext4_try_create_inline_dir()
1581 de->inode = 0; in ext4_try_create_inline_dir()
1585 set_nlink(inode, 2); in ext4_try_create_inline_dir()
1586 inode->i_size = EXT4_I(inode)->i_disksize = inline_size; in ext4_try_create_inline_dir()
1592 struct buffer_head *ext4_find_inline_entry(struct inode *dir, in ext4_find_inline_entry()
1656 struct inode *dir, in ext4_delete_inline_entry()
1713 ext4_get_inline_entry(struct inode *inode, in ext4_get_inline_entry() argument
1721 BUG_ON(offset > ext4_get_inline_size(inode)); in ext4_get_inline_entry()
1727 inline_pos = ext4_get_inline_xattr_pos(inode, iloc); in ext4_get_inline_entry()
1729 *inline_size = ext4_get_inline_size(inode) - in ext4_get_inline_entry()
1738 bool empty_inline_dir(struct inode *dir, int *has_inline_data) in empty_inline_dir()
1764 if (!le32_to_cpu(de->inode)) { in empty_inline_dir()
1783 dir->i_ino, le32_to_cpu(de->inode), in empty_inline_dir()
1788 if (le32_to_cpu(de->inode)) { in empty_inline_dir()
1801 int ext4_destroy_inline_data(handle_t *handle, struct inode *inode) in ext4_destroy_inline_data() argument
1805 ext4_write_lock_xattr(inode, &no_expand); in ext4_destroy_inline_data()
1806 ret = ext4_destroy_inline_data_nolock(handle, inode); in ext4_destroy_inline_data()
1807 ext4_write_unlock_xattr(inode, &no_expand); in ext4_destroy_inline_data()
1812 int ext4_inline_data_iomap(struct inode *inode, struct iomap *iomap) in ext4_inline_data_iomap() argument
1818 down_read(&EXT4_I(inode)->xattr_sem); in ext4_inline_data_iomap()
1819 if (!ext4_has_inline_data(inode)) in ext4_inline_data_iomap()
1822 error = ext4_get_inode_loc(inode, &iloc); in ext4_inline_data_iomap()
1826 addr = (__u64)iloc.bh->b_blocknr << inode->i_sb->s_blocksize_bits; in ext4_inline_data_iomap()
1834 iomap->length = min_t(loff_t, ext4_get_inline_size(inode), in ext4_inline_data_iomap()
1835 i_size_read(inode)); in ext4_inline_data_iomap()
1840 up_read(&EXT4_I(inode)->xattr_sem); in ext4_inline_data_iomap()
1844 int ext4_inline_data_truncate(struct inode *inode, int *has_inline) in ext4_inline_data_truncate() argument
1859 needed_blocks = ext4_chunk_trans_extent(inode, 1); in ext4_inline_data_truncate()
1860 handle = ext4_journal_start(inode, EXT4_HT_INODE, needed_blocks); in ext4_inline_data_truncate()
1864 ext4_write_lock_xattr(inode, &no_expand); in ext4_inline_data_truncate()
1865 if (!ext4_has_inline_data(inode)) { in ext4_inline_data_truncate()
1866 ext4_write_unlock_xattr(inode, &no_expand); in ext4_inline_data_truncate()
1872 if ((err = ext4_orphan_add(handle, inode)) != 0) in ext4_inline_data_truncate()
1875 if ((err = ext4_get_inode_loc(inode, &is.iloc)) != 0) in ext4_inline_data_truncate()
1878 down_write(&EXT4_I(inode)->i_data_sem); in ext4_inline_data_truncate()
1879 i_size = inode->i_size; in ext4_inline_data_truncate()
1880 inline_size = ext4_get_inline_size(inode); in ext4_inline_data_truncate()
1881 EXT4_I(inode)->i_disksize = i_size; in ext4_inline_data_truncate()
1890 if (!ext4_test_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA)) in ext4_inline_data_truncate()
1891 ext4_es_remove_extent(inode, 0, EXT_MAX_BLOCKS); in ext4_inline_data_truncate()
1895 if ((err = ext4_xattr_ibody_find(inode, &i, &is)) != 0) in ext4_inline_data_truncate()
1899 EXT4_ERROR_INODE(inode, in ext4_inline_data_truncate()
1912 err = ext4_xattr_ibody_get(inode, i.name_index, in ext4_inline_data_truncate()
1920 err = ext4_xattr_ibody_set(handle, inode, &i, &is); in ext4_inline_data_truncate()
1932 EXT4_I(inode)->i_inline_size = i_size < in ext4_inline_data_truncate()
1938 up_write(&EXT4_I(inode)->i_data_sem); in ext4_inline_data_truncate()
1941 ext4_write_unlock_xattr(inode, &no_expand); in ext4_inline_data_truncate()
1943 if (inode->i_nlink) in ext4_inline_data_truncate()
1944 ext4_orphan_del(handle, inode); in ext4_inline_data_truncate()
1947 inode_set_mtime_to_ts(inode, inode_set_ctime_current(inode)); in ext4_inline_data_truncate()
1948 err = ext4_mark_inode_dirty(handle, inode); in ext4_inline_data_truncate()
1949 if (IS_SYNC(inode)) in ext4_inline_data_truncate()
1956 int ext4_convert_inline_data(struct inode *inode) in ext4_convert_inline_data() argument
1962 if (!ext4_has_inline_data(inode)) { in ext4_convert_inline_data()
1963 ext4_clear_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA); in ext4_convert_inline_data()
1965 } else if (!ext4_test_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA)) { in ext4_convert_inline_data()
1972 error = filemap_flush(inode->i_mapping); in ext4_convert_inline_data()
1975 if (!ext4_has_inline_data(inode)) in ext4_convert_inline_data()
1979 needed_blocks = ext4_chunk_trans_extent(inode, 1); in ext4_convert_inline_data()
1982 error = ext4_get_inode_loc(inode, &iloc); in ext4_convert_inline_data()
1986 handle = ext4_journal_start(inode, EXT4_HT_WRITE_PAGE, needed_blocks); in ext4_convert_inline_data()
1992 ext4_write_lock_xattr(inode, &no_expand); in ext4_convert_inline_data()
1993 if (ext4_has_inline_data(inode)) in ext4_convert_inline_data()
1994 error = ext4_convert_inline_data_nolock(handle, inode, &iloc); in ext4_convert_inline_data()
1995 ext4_write_unlock_xattr(inode, &no_expand); in ext4_convert_inline_data()