Lines Matching refs:inode

27 static int ext4_get_inline_size(struct inode *inode)  in ext4_get_inline_size()  argument
29 if (EXT4_I(inode)->i_inline_off) in ext4_get_inline_size()
30 return EXT4_I(inode)->i_inline_size; in ext4_get_inline_size()
35 static int get_max_inline_xattr_value_size(struct inode *inode, in get_max_inline_xattr_value_size() argument
43 min_offs = EXT4_SB(inode->i_sb)->s_inode_size - in get_max_inline_xattr_value_size()
45 EXT4_I(inode)->i_extra_isize - in get_max_inline_xattr_value_size()
53 if (!ext4_test_inode_state(inode, EXT4_STATE_XATTR)) in get_max_inline_xattr_value_size()
59 header = IHDR(inode, raw_inode); in get_max_inline_xattr_value_size()
73 if (EXT4_I(inode)->i_inline_off) { in get_max_inline_xattr_value_size()
75 ((void *)raw_inode + EXT4_I(inode)->i_inline_off); in get_max_inline_xattr_value_size()
97 int ext4_get_max_inline_size(struct inode *inode) in ext4_get_max_inline_size() argument
102 if (EXT4_I(inode)->i_extra_isize == 0) in ext4_get_max_inline_size()
105 error = ext4_get_inode_loc(inode, &iloc); in ext4_get_max_inline_size()
107 ext4_error_inode(inode, __func__, __LINE__, 0, in ext4_get_max_inline_size()
109 inode->i_ino); in ext4_get_max_inline_size()
113 down_read(&EXT4_I(inode)->xattr_sem); in ext4_get_max_inline_size()
114 max_inline_size = get_max_inline_xattr_value_size(inode, &iloc); in ext4_get_max_inline_size()
115 up_read(&EXT4_I(inode)->xattr_sem); in ext4_get_max_inline_size()
130 int ext4_find_inline_data_nolock(struct inode *inode) in ext4_find_inline_data_nolock() argument
141 if (EXT4_I(inode)->i_extra_isize == 0) in ext4_find_inline_data_nolock()
144 error = ext4_get_inode_loc(inode, &is.iloc); in ext4_find_inline_data_nolock()
148 error = ext4_xattr_ibody_find(inode, &i, &is); in ext4_find_inline_data_nolock()
153 EXT4_I(inode)->i_inline_off = (u16)((void *)is.s.here - in ext4_find_inline_data_nolock()
155 EXT4_I(inode)->i_inline_size = EXT4_MIN_INLINE_DATA_SIZE + in ext4_find_inline_data_nolock()
157 ext4_set_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA); in ext4_find_inline_data_nolock()
164 static int ext4_read_inline_data(struct inode *inode, void *buffer, in ext4_read_inline_data() argument
176 BUG_ON(len > EXT4_I(inode)->i_inline_size); in ext4_read_inline_data()
190 header = IHDR(inode, raw_inode); in ext4_read_inline_data()
192 EXT4_I(inode)->i_inline_off); in ext4_read_inline_data()
210 static void ext4_write_inline_data(struct inode *inode, struct ext4_iloc *iloc, in ext4_write_inline_data() argument
218 BUG_ON(!EXT4_I(inode)->i_inline_off); in ext4_write_inline_data()
219 BUG_ON(pos + len > EXT4_I(inode)->i_inline_size); in ext4_write_inline_data()
238 header = IHDR(inode, raw_inode); in ext4_write_inline_data()
240 EXT4_I(inode)->i_inline_off); in ext4_write_inline_data()
247 struct inode *inode, unsigned len) in ext4_create_inline_data() argument
259 error = ext4_get_inode_loc(inode, &is.iloc); in ext4_create_inline_data()
280 error = ext4_xattr_ibody_find(inode, &i, &is); in ext4_create_inline_data()
286 error = ext4_xattr_ibody_inline_set(handle, inode, &i, &is); in ext4_create_inline_data()
289 ext4_clear_inode_state(inode, in ext4_create_inline_data()
297 EXT4_I(inode)->i_inline_off = (u16)((void *)is.s.here - in ext4_create_inline_data()
299 EXT4_I(inode)->i_inline_size = len + EXT4_MIN_INLINE_DATA_SIZE; in ext4_create_inline_data()
300 ext4_clear_inode_flag(inode, EXT4_INODE_EXTENTS); in ext4_create_inline_data()
301 ext4_set_inode_flag(inode, EXT4_INODE_INLINE_DATA); in ext4_create_inline_data()
303 error = ext4_mark_iloc_dirty(handle, inode, &is.iloc); in ext4_create_inline_data()
310 static int ext4_update_inline_data(handle_t *handle, struct inode *inode, in ext4_update_inline_data() argument
324 if (len <= EXT4_I(inode)->i_inline_size) in ext4_update_inline_data()
327 error = ext4_get_inode_loc(inode, &is.iloc); in ext4_update_inline_data()
331 error = ext4_xattr_ibody_find(inode, &i, &is); in ext4_update_inline_data()
342 error = ext4_xattr_ibody_get(inode, i.name_index, i.name, in ext4_update_inline_data()
356 error = ext4_xattr_ibody_inline_set(handle, inode, &i, &is); in ext4_update_inline_data()
360 EXT4_I(inode)->i_inline_off = (u16)((void *)is.s.here - in ext4_update_inline_data()
362 EXT4_I(inode)->i_inline_size = EXT4_MIN_INLINE_DATA_SIZE + in ext4_update_inline_data()
364 ext4_set_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA); in ext4_update_inline_data()
366 error = ext4_mark_iloc_dirty(handle, inode, &is.iloc); in ext4_update_inline_data()
374 static int ext4_prepare_inline_data(handle_t *handle, struct inode *inode, in ext4_prepare_inline_data() argument
378 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_prepare_inline_data()
380 if (!ext4_test_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA)) in ext4_prepare_inline_data()
383 size = ext4_get_max_inline_size(inode); in ext4_prepare_inline_data()
387 down_write(&EXT4_I(inode)->xattr_sem); in ext4_prepare_inline_data()
390 ret = ext4_update_inline_data(handle, inode, len); in ext4_prepare_inline_data()
392 ret = ext4_create_inline_data(handle, inode, len); in ext4_prepare_inline_data()
394 up_write(&EXT4_I(inode)->xattr_sem); in ext4_prepare_inline_data()
400 struct inode *inode) in ext4_destroy_inline_data_nolock() argument
402 struct ext4_inode_info *ei = EXT4_I(inode); in ext4_destroy_inline_data_nolock()
417 error = ext4_get_inode_loc(inode, &is.iloc); in ext4_destroy_inline_data_nolock()
421 error = ext4_xattr_ibody_find(inode, &i, &is); in ext4_destroy_inline_data_nolock()
430 error = ext4_xattr_ibody_inline_set(handle, inode, &i, &is); in ext4_destroy_inline_data_nolock()
437 if (EXT4_HAS_INCOMPAT_FEATURE(inode->i_sb, in ext4_destroy_inline_data_nolock()
439 if (S_ISDIR(inode->i_mode) || in ext4_destroy_inline_data_nolock()
440 S_ISREG(inode->i_mode) || S_ISLNK(inode->i_mode)) { in ext4_destroy_inline_data_nolock()
441 ext4_set_inode_flag(inode, EXT4_INODE_EXTENTS); in ext4_destroy_inline_data_nolock()
442 ext4_ext_tree_init(handle, inode); in ext4_destroy_inline_data_nolock()
445 ext4_clear_inode_flag(inode, EXT4_INODE_INLINE_DATA); in ext4_destroy_inline_data_nolock()
448 error = ext4_mark_iloc_dirty(handle, inode, &is.iloc); in ext4_destroy_inline_data_nolock()
450 EXT4_I(inode)->i_inline_off = 0; in ext4_destroy_inline_data_nolock()
451 EXT4_I(inode)->i_inline_size = 0; in ext4_destroy_inline_data_nolock()
452 ext4_clear_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA); in ext4_destroy_inline_data_nolock()
460 static int ext4_read_inline_page(struct inode *inode, struct page *page) in ext4_read_inline_page() argument
468 BUG_ON(!ext4_has_inline_data(inode)); in ext4_read_inline_page()
471 if (!EXT4_I(inode)->i_inline_off) { in ext4_read_inline_page()
472 ext4_warning(inode->i_sb, "inode %lu doesn't have inline data.", in ext4_read_inline_page()
473 inode->i_ino); in ext4_read_inline_page()
477 ret = ext4_get_inode_loc(inode, &iloc); in ext4_read_inline_page()
481 len = min_t(size_t, ext4_get_inline_size(inode), i_size_read(inode)); in ext4_read_inline_page()
483 ret = ext4_read_inline_data(inode, kaddr, len, &iloc); in ext4_read_inline_page()
494 int ext4_readpage_inline(struct inode *inode, struct page *page) in ext4_readpage_inline() argument
498 down_read(&EXT4_I(inode)->xattr_sem); in ext4_readpage_inline()
499 if (!ext4_has_inline_data(inode)) { in ext4_readpage_inline()
500 up_read(&EXT4_I(inode)->xattr_sem); in ext4_readpage_inline()
509 ret = ext4_read_inline_page(inode, page); in ext4_readpage_inline()
515 up_read(&EXT4_I(inode)->xattr_sem); in ext4_readpage_inline()
522 struct inode *inode, in ext4_convert_inline_data_to_extent() argument
532 if (!ext4_has_inline_data(inode)) { in ext4_convert_inline_data_to_extent()
537 ext4_clear_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA); in ext4_convert_inline_data_to_extent()
541 needed_blocks = ext4_writepage_trans_blocks(inode); in ext4_convert_inline_data_to_extent()
543 ret = ext4_get_inode_loc(inode, &iloc); in ext4_convert_inline_data_to_extent()
548 handle = ext4_journal_start(inode, EXT4_HT_WRITE_PAGE, needed_blocks); in ext4_convert_inline_data_to_extent()
565 down_write(&EXT4_I(inode)->xattr_sem); in ext4_convert_inline_data_to_extent()
568 if (!ext4_has_inline_data(inode)) { in ext4_convert_inline_data_to_extent()
574 to = ext4_get_inline_size(inode); in ext4_convert_inline_data_to_extent()
576 ret = ext4_read_inline_page(inode, page); in ext4_convert_inline_data_to_extent()
581 ret = ext4_destroy_inline_data_nolock(handle, inode); in ext4_convert_inline_data_to_extent()
585 if (ext4_should_dioread_nolock(inode)) in ext4_convert_inline_data_to_extent()
590 if (!ret && ext4_should_journal_data(inode)) { in ext4_convert_inline_data_to_extent()
600 ext4_orphan_add(handle, inode); in ext4_convert_inline_data_to_extent()
601 up_write(&EXT4_I(inode)->xattr_sem); in ext4_convert_inline_data_to_extent()
605 ext4_truncate_failed_write(inode); in ext4_convert_inline_data_to_extent()
612 if (inode->i_nlink) in ext4_convert_inline_data_to_extent()
613 ext4_orphan_del(NULL, inode); in ext4_convert_inline_data_to_extent()
616 if (ret == -ENOSPC && ext4_should_retry_alloc(inode->i_sb, &retries)) in ext4_convert_inline_data_to_extent()
627 up_write(&EXT4_I(inode)->xattr_sem); in ext4_convert_inline_data_to_extent()
641 struct inode *inode, in ext4_try_to_write_inline_data() argument
651 if (pos + len > ext4_get_max_inline_size(inode)) in ext4_try_to_write_inline_data()
654 ret = ext4_get_inode_loc(inode, &iloc); in ext4_try_to_write_inline_data()
662 handle = ext4_journal_start(inode, EXT4_HT_INODE, 1); in ext4_try_to_write_inline_data()
669 ret = ext4_prepare_inline_data(handle, inode, pos + len); in ext4_try_to_write_inline_data()
689 down_read(&EXT4_I(inode)->xattr_sem); in ext4_try_to_write_inline_data()
690 if (!ext4_has_inline_data(inode)) { in ext4_try_to_write_inline_data()
698 ret = ext4_read_inline_page(inode, page); in ext4_try_to_write_inline_data()
706 up_read(&EXT4_I(inode)->xattr_sem); in ext4_try_to_write_inline_data()
714 inode, flags); in ext4_try_to_write_inline_data()
717 int ext4_write_inline_data_end(struct inode *inode, loff_t pos, unsigned len, in ext4_write_inline_data_end() argument
731 ret = ext4_get_inode_loc(inode, &iloc); in ext4_write_inline_data_end()
733 ext4_std_error(inode->i_sb, ret); in ext4_write_inline_data_end()
738 down_write(&EXT4_I(inode)->xattr_sem); in ext4_write_inline_data_end()
739 BUG_ON(!ext4_has_inline_data(inode)); in ext4_write_inline_data_end()
742 ext4_write_inline_data(inode, &iloc, kaddr, pos, len); in ext4_write_inline_data_end()
748 up_write(&EXT4_I(inode)->xattr_sem); in ext4_write_inline_data_end()
755 ext4_journalled_write_inline_data(struct inode *inode, in ext4_journalled_write_inline_data() argument
763 ret = ext4_get_inode_loc(inode, &iloc); in ext4_journalled_write_inline_data()
765 ext4_std_error(inode->i_sb, ret); in ext4_journalled_write_inline_data()
769 down_write(&EXT4_I(inode)->xattr_sem); in ext4_journalled_write_inline_data()
771 ext4_write_inline_data(inode, &iloc, kaddr, 0, len); in ext4_journalled_write_inline_data()
773 up_write(&EXT4_I(inode)->xattr_sem); in ext4_journalled_write_inline_data()
788 struct inode *inode, in ext4_da_convert_inline_data_to_extent() argument
799 down_read(&EXT4_I(inode)->xattr_sem); in ext4_da_convert_inline_data_to_extent()
800 if (!ext4_has_inline_data(inode)) { in ext4_da_convert_inline_data_to_extent()
801 ext4_clear_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA); in ext4_da_convert_inline_data_to_extent()
805 inline_size = ext4_get_inline_size(inode); in ext4_da_convert_inline_data_to_extent()
808 ret = ext4_read_inline_page(inode, page); in ext4_da_convert_inline_data_to_extent()
816 up_read(&EXT4_I(inode)->xattr_sem); in ext4_da_convert_inline_data_to_extent()
819 ext4_truncate_failed_write(inode); in ext4_da_convert_inline_data_to_extent()
825 ext4_clear_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA); in ext4_da_convert_inline_data_to_extent()
829 up_read(&EXT4_I(inode)->xattr_sem); in ext4_da_convert_inline_data_to_extent()
846 struct inode *inode, in ext4_da_write_inline_data_begin() argument
858 ret = ext4_get_inode_loc(inode, &iloc); in ext4_da_write_inline_data_begin()
863 handle = ext4_journal_start(inode, EXT4_HT_INODE, 1); in ext4_da_write_inline_data_begin()
869 inline_size = ext4_get_max_inline_size(inode); in ext4_da_write_inline_data_begin()
873 ret = ext4_prepare_inline_data(handle, inode, pos + len); in ext4_da_write_inline_data_begin()
886 inode, in ext4_da_write_inline_data_begin()
891 ext4_should_retry_alloc(inode->i_sb, &retries)) in ext4_da_write_inline_data_begin()
903 down_read(&EXT4_I(inode)->xattr_sem); in ext4_da_write_inline_data_begin()
904 if (!ext4_has_inline_data(inode)) { in ext4_da_write_inline_data_begin()
910 ret = ext4_read_inline_page(inode, page); in ext4_da_write_inline_data_begin()
915 up_read(&EXT4_I(inode)->xattr_sem); in ext4_da_write_inline_data_begin()
920 up_read(&EXT4_I(inode)->xattr_sem); in ext4_da_write_inline_data_begin()
930 int ext4_da_write_inline_data_end(struct inode *inode, loff_t pos, in ext4_da_write_inline_data_end() argument
936 copied = ext4_write_inline_data_end(inode, pos, len, copied, page); in ext4_da_write_inline_data_end()
945 if (pos+copied > inode->i_size) { in ext4_da_write_inline_data_end()
946 i_size_write(inode, pos+copied); in ext4_da_write_inline_data_end()
959 mark_inode_dirty(inode); in ext4_da_write_inline_data_end()
965 void ext4_show_inline_dir(struct inode *dir, struct buffer_head *bh, in ext4_show_inline_dir()
979 de->name_len, le32_to_cpu(de->inode)); in ext4_show_inline_dir()
999 struct inode *inode, in ext4_add_dirent_to_inline() argument
1003 struct inode *dir = d_inode(dentry->d_parent); in ext4_add_dirent_to_inline()
1009 err = ext4_find_dest_de(dir, inode, iloc->bh, in ext4_add_dirent_to_inline()
1019 ext4_insert_dentry(dir, inode, de, inline_size, &dentry->d_name, in ext4_add_dirent_to_inline()
1042 static void *ext4_get_inline_xattr_pos(struct inode *inode, in ext4_get_inline_xattr_pos() argument
1048 BUG_ON(!EXT4_I(inode)->i_inline_off); in ext4_get_inline_xattr_pos()
1050 header = IHDR(inode, ext4_raw_inode(iloc)); in ext4_get_inline_xattr_pos()
1052 EXT4_I(inode)->i_inline_off); in ext4_get_inline_xattr_pos()
1078 de->inode = 0; in ext4_update_final_de()
1083 static int ext4_update_inline_dir(handle_t *handle, struct inode *dir, in ext4_update_inline_dir()
1105 static void ext4_restore_inline_data(handle_t *handle, struct inode *inode, in ext4_restore_inline_data() argument
1109 ext4_create_inline_data(handle, inode, inline_size); in ext4_restore_inline_data()
1110 ext4_write_inline_data(inode, iloc, buf, 0, inline_size); in ext4_restore_inline_data()
1111 ext4_set_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA); in ext4_restore_inline_data()
1115 struct inode *inode, in ext4_finish_convert_inline_dir() argument
1130 de = ext4_init_dot_dotdot(inode, de, in ext4_finish_convert_inline_dir()
1131 inode->i_sb->s_blocksize, csum_size, in ext4_finish_convert_inline_dir()
1132 le32_to_cpu(((struct ext4_dir_entry_2 *)buf)->inode), 1); in ext4_finish_convert_inline_dir()
1138 if (ext4_has_metadata_csum(inode->i_sb)) in ext4_finish_convert_inline_dir()
1141 inode->i_size = inode->i_sb->s_blocksize; in ext4_finish_convert_inline_dir()
1142 i_size_write(inode, inode->i_sb->s_blocksize); in ext4_finish_convert_inline_dir()
1143 EXT4_I(inode)->i_disksize = inode->i_sb->s_blocksize; in ext4_finish_convert_inline_dir()
1146 inode->i_sb->s_blocksize - csum_size); in ext4_finish_convert_inline_dir()
1150 inode->i_sb->s_blocksize); in ext4_finish_convert_inline_dir()
1151 initialize_dirent_tail(t, inode->i_sb->s_blocksize); in ext4_finish_convert_inline_dir()
1154 err = ext4_handle_dirty_dirent_node(handle, inode, dir_block); in ext4_finish_convert_inline_dir()
1163 struct inode *inode, in ext4_convert_inline_data_nolock() argument
1172 inline_size = ext4_get_inline_size(inode); in ext4_convert_inline_data_nolock()
1179 error = ext4_read_inline_data(inode, buf, inline_size, iloc); in ext4_convert_inline_data_nolock()
1187 if (S_ISDIR(inode->i_mode)) { in ext4_convert_inline_data_nolock()
1188 error = ext4_check_all_de(inode, iloc->bh, in ext4_convert_inline_data_nolock()
1195 error = ext4_destroy_inline_data_nolock(handle, inode); in ext4_convert_inline_data_nolock()
1202 error = ext4_map_blocks(handle, inode, &map, EXT4_GET_BLOCKS_CREATE); in ext4_convert_inline_data_nolock()
1210 data_bh = sb_getblk(inode->i_sb, map.m_pblk); in ext4_convert_inline_data_nolock()
1223 memset(data_bh->b_data, 0, inode->i_sb->s_blocksize); in ext4_convert_inline_data_nolock()
1225 if (!S_ISDIR(inode->i_mode)) { in ext4_convert_inline_data_nolock()
1229 inode, data_bh); in ext4_convert_inline_data_nolock()
1231 error = ext4_finish_convert_inline_dir(handle, inode, data_bh, in ext4_convert_inline_data_nolock()
1238 ext4_restore_inline_data(handle, inode, iloc, buf, inline_size); in ext4_convert_inline_data_nolock()
1252 struct inode *inode) in ext4_try_add_inline_entry() argument
1257 struct inode *dir = d_inode(dentry->d_parent); in ext4_try_add_inline_entry()
1271 ret = ext4_add_dirent_to_inline(handle, dentry, inode, &iloc, in ext4_try_add_inline_entry()
1292 ret = ext4_add_dirent_to_inline(handle, dentry, inode, &iloc, in ext4_try_add_inline_entry()
1319 struct inode *dir, ext4_lblk_t block, in htree_inlinedir_to_tree()
1328 struct inode *inode = file_inode(dir_file); in htree_inlinedir_to_tree() local
1335 ret = ext4_get_inode_loc(inode, &iloc); in htree_inlinedir_to_tree()
1339 down_read(&EXT4_I(inode)->xattr_sem); in htree_inlinedir_to_tree()
1340 if (!ext4_has_inline_data(inode)) { in htree_inlinedir_to_tree()
1341 up_read(&EXT4_I(inode)->xattr_sem); in htree_inlinedir_to_tree()
1346 inline_size = ext4_get_inline_size(inode); in htree_inlinedir_to_tree()
1350 up_read(&EXT4_I(inode)->xattr_sem); in htree_inlinedir_to_tree()
1354 ret = ext4_read_inline_data(inode, dir_buf, inline_size, &iloc); in htree_inlinedir_to_tree()
1355 up_read(&EXT4_I(inode)->xattr_sem); in htree_inlinedir_to_tree()
1360 parent_ino = le32_to_cpu(((struct ext4_dir_entry_2 *)dir_buf)->inode); in htree_inlinedir_to_tree()
1368 fake.inode = cpu_to_le32(inode->i_ino); in htree_inlinedir_to_tree()
1374 ext4_set_de_type(inode->i_sb, &fake, S_IFDIR); in htree_inlinedir_to_tree()
1378 fake.inode = cpu_to_le32(parent_ino); in htree_inlinedir_to_tree()
1384 ext4_set_de_type(inode->i_sb, &fake, S_IFDIR); in htree_inlinedir_to_tree()
1390 if (ext4_check_dir_entry(inode, dir_file, de, in htree_inlinedir_to_tree()
1403 if (de->inode == 0) in htree_inlinedir_to_tree()
1438 struct inode *inode = file_inode(file); in ext4_read_inline_dir() local
1444 ret = ext4_get_inode_loc(inode, &iloc); in ext4_read_inline_dir()
1448 down_read(&EXT4_I(inode)->xattr_sem); in ext4_read_inline_dir()
1449 if (!ext4_has_inline_data(inode)) { in ext4_read_inline_dir()
1450 up_read(&EXT4_I(inode)->xattr_sem); in ext4_read_inline_dir()
1455 inline_size = ext4_get_inline_size(inode); in ext4_read_inline_dir()
1459 up_read(&EXT4_I(inode)->xattr_sem); in ext4_read_inline_dir()
1463 ret = ext4_read_inline_data(inode, dir_buf, inline_size, &iloc); in ext4_read_inline_dir()
1464 up_read(&EXT4_I(inode)->xattr_sem); in ext4_read_inline_dir()
1469 sb = inode->i_sb; in ext4_read_inline_dir()
1470 parent_ino = le32_to_cpu(((struct ext4_dir_entry_2 *)dir_buf)->inode); in ext4_read_inline_dir()
1491 if (file->f_version != inode->i_version) { in ext4_read_inline_dir()
1523 file->f_version = inode->i_version; in ext4_read_inline_dir()
1528 if (!dir_emit(ctx, ".", 1, inode->i_ino, DT_DIR)) in ext4_read_inline_dir()
1543 if (ext4_check_dir_entry(inode, file, de, iloc.bh, dir_buf, in ext4_read_inline_dir()
1546 if (le32_to_cpu(de->inode)) { in ext4_read_inline_dir()
1548 le32_to_cpu(de->inode), in ext4_read_inline_dir()
1560 struct buffer_head *ext4_get_first_inline_block(struct inode *inode, in ext4_get_first_inline_block() argument
1566 *retval = ext4_get_inode_loc(inode, &iloc); in ext4_get_first_inline_block()
1580 int ext4_try_create_inline_dir(handle_t *handle, struct inode *parent, in ext4_try_create_inline_dir()
1581 struct inode *inode) in ext4_try_create_inline_dir() argument
1587 ret = ext4_get_inode_loc(inode, &iloc); in ext4_try_create_inline_dir()
1591 ret = ext4_prepare_inline_data(handle, inode, inline_size); in ext4_try_create_inline_dir()
1600 de->inode = cpu_to_le32(parent->i_ino); in ext4_try_create_inline_dir()
1602 de->inode = 0; in ext4_try_create_inline_dir()
1606 set_nlink(inode, 2); in ext4_try_create_inline_dir()
1607 inode->i_size = EXT4_I(inode)->i_disksize = inline_size; in ext4_try_create_inline_dir()
1613 struct buffer_head *ext4_find_inline_entry(struct inode *dir, in ext4_find_inline_entry()
1662 struct inode *dir, in ext4_delete_inline_entry()
1721 ext4_get_inline_entry(struct inode *inode, in ext4_get_inline_entry() argument
1729 BUG_ON(offset > ext4_get_inline_size(inode)); in ext4_get_inline_entry()
1735 inline_pos = ext4_get_inline_xattr_pos(inode, iloc); in ext4_get_inline_entry()
1737 *inline_size = ext4_get_inline_size(inode) - in ext4_get_inline_entry()
1746 int empty_inline_dir(struct inode *dir, int *has_inline_data) in empty_inline_dir()
1769 if (!le32_to_cpu(de->inode)) { in empty_inline_dir()
1788 dir->i_ino, le32_to_cpu(de->inode), in empty_inline_dir()
1794 if (le32_to_cpu(de->inode)) { in empty_inline_dir()
1807 int ext4_destroy_inline_data(handle_t *handle, struct inode *inode) in ext4_destroy_inline_data() argument
1811 down_write(&EXT4_I(inode)->xattr_sem); in ext4_destroy_inline_data()
1812 ret = ext4_destroy_inline_data_nolock(handle, inode); in ext4_destroy_inline_data()
1813 up_write(&EXT4_I(inode)->xattr_sem); in ext4_destroy_inline_data()
1818 int ext4_inline_data_fiemap(struct inode *inode, in ext4_inline_data_fiemap() argument
1829 down_read(&EXT4_I(inode)->xattr_sem); in ext4_inline_data_fiemap()
1830 if (!ext4_has_inline_data(inode)) { in ext4_inline_data_fiemap()
1834 inline_len = min_t(size_t, ext4_get_inline_size(inode), in ext4_inline_data_fiemap()
1835 i_size_read(inode)); in ext4_inline_data_fiemap()
1842 error = ext4_get_inode_loc(inode, &iloc); in ext4_inline_data_fiemap()
1846 physical = (__u64)iloc.bh->b_blocknr << inode->i_sb->s_blocksize_bits; in ext4_inline_data_fiemap()
1855 up_read(&EXT4_I(inode)->xattr_sem); in ext4_inline_data_fiemap()
1868 struct inode *inode, in ext4_try_to_evict_inline_data() argument
1876 error = ext4_get_inode_loc(inode, &iloc); in ext4_try_to_evict_inline_data()
1882 EXT4_I(inode)->i_inline_off); in ext4_try_to_evict_inline_data()
1889 error = ext4_convert_inline_data_nolock(handle, inode, &iloc); in ext4_try_to_evict_inline_data()
1895 void ext4_inline_data_truncate(struct inode *inode, int *has_inline) in ext4_inline_data_truncate() argument
1910 needed_blocks = ext4_writepage_trans_blocks(inode); in ext4_inline_data_truncate()
1911 handle = ext4_journal_start(inode, EXT4_HT_INODE, needed_blocks); in ext4_inline_data_truncate()
1915 down_write(&EXT4_I(inode)->xattr_sem); in ext4_inline_data_truncate()
1916 if (!ext4_has_inline_data(inode)) { in ext4_inline_data_truncate()
1922 if (ext4_orphan_add(handle, inode)) in ext4_inline_data_truncate()
1925 if (ext4_get_inode_loc(inode, &is.iloc)) in ext4_inline_data_truncate()
1928 down_write(&EXT4_I(inode)->i_data_sem); in ext4_inline_data_truncate()
1929 i_size = inode->i_size; in ext4_inline_data_truncate()
1930 inline_size = ext4_get_inline_size(inode); in ext4_inline_data_truncate()
1931 EXT4_I(inode)->i_disksize = i_size; in ext4_inline_data_truncate()
1936 if (ext4_xattr_ibody_find(inode, &i, &is)) in ext4_inline_data_truncate()
1946 if (ext4_xattr_ibody_get(inode, i.name_index, i.name, in ext4_inline_data_truncate()
1953 if (ext4_xattr_ibody_inline_set(handle, inode, &i, &is)) in ext4_inline_data_truncate()
1964 EXT4_I(inode)->i_inline_size = i_size < in ext4_inline_data_truncate()
1970 up_write(&EXT4_I(inode)->i_data_sem); in ext4_inline_data_truncate()
1973 up_write(&EXT4_I(inode)->xattr_sem); in ext4_inline_data_truncate()
1975 if (inode->i_nlink) in ext4_inline_data_truncate()
1976 ext4_orphan_del(handle, inode); in ext4_inline_data_truncate()
1978 inode->i_mtime = inode->i_ctime = ext4_current_time(inode); in ext4_inline_data_truncate()
1979 ext4_mark_inode_dirty(handle, inode); in ext4_inline_data_truncate()
1980 if (IS_SYNC(inode)) in ext4_inline_data_truncate()
1987 int ext4_convert_inline_data(struct inode *inode) in ext4_convert_inline_data() argument
1993 if (!ext4_has_inline_data(inode)) { in ext4_convert_inline_data()
1994 ext4_clear_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA); in ext4_convert_inline_data()
1998 needed_blocks = ext4_writepage_trans_blocks(inode); in ext4_convert_inline_data()
2001 error = ext4_get_inode_loc(inode, &iloc); in ext4_convert_inline_data()
2005 handle = ext4_journal_start(inode, EXT4_HT_WRITE_PAGE, needed_blocks); in ext4_convert_inline_data()
2011 down_write(&EXT4_I(inode)->xattr_sem); in ext4_convert_inline_data()
2012 if (!ext4_has_inline_data(inode)) { in ext4_convert_inline_data()
2013 up_write(&EXT4_I(inode)->xattr_sem); in ext4_convert_inline_data()
2017 error = ext4_convert_inline_data_nolock(handle, inode, &iloc); in ext4_convert_inline_data()
2018 up_write(&EXT4_I(inode)->xattr_sem); in ext4_convert_inline_data()