cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

inline.c (51213B)


      1// SPDX-License-Identifier: LGPL-2.1
      2/*
      3 * Copyright (c) 2012 Taobao.
      4 * Written by Tao Ma <boyu.mt@taobao.com>
      5 */
      6
      7#include <linux/iomap.h>
      8#include <linux/fiemap.h>
      9#include <linux/iversion.h>
     10#include <linux/sched/mm.h>
     11
     12#include "ext4_jbd2.h"
     13#include "ext4.h"
     14#include "xattr.h"
     15#include "truncate.h"
     16
     17#define EXT4_XATTR_SYSTEM_DATA	"data"
     18#define EXT4_MIN_INLINE_DATA_SIZE	((sizeof(__le32) * EXT4_N_BLOCKS))
     19#define EXT4_INLINE_DOTDOT_OFFSET	2
     20#define EXT4_INLINE_DOTDOT_SIZE		4
     21
     22static int ext4_get_inline_size(struct inode *inode)
     23{
     24	if (EXT4_I(inode)->i_inline_off)
     25		return EXT4_I(inode)->i_inline_size;
     26
     27	return 0;
     28}
     29
     30static int get_max_inline_xattr_value_size(struct inode *inode,
     31					   struct ext4_iloc *iloc)
     32{
     33	struct ext4_xattr_ibody_header *header;
     34	struct ext4_xattr_entry *entry;
     35	struct ext4_inode *raw_inode;
     36	int free, min_offs;
     37
     38	min_offs = EXT4_SB(inode->i_sb)->s_inode_size -
     39			EXT4_GOOD_OLD_INODE_SIZE -
     40			EXT4_I(inode)->i_extra_isize -
     41			sizeof(struct ext4_xattr_ibody_header);
     42
     43	/*
     44	 * We need to subtract another sizeof(__u32) since an in-inode xattr
     45	 * needs an empty 4 bytes to indicate the gap between the xattr entry
     46	 * and the name/value pair.
     47	 */
     48	if (!ext4_test_inode_state(inode, EXT4_STATE_XATTR))
     49		return EXT4_XATTR_SIZE(min_offs -
     50			EXT4_XATTR_LEN(strlen(EXT4_XATTR_SYSTEM_DATA)) -
     51			EXT4_XATTR_ROUND - sizeof(__u32));
     52
     53	raw_inode = ext4_raw_inode(iloc);
     54	header = IHDR(inode, raw_inode);
     55	entry = IFIRST(header);
     56
     57	/* Compute min_offs. */
     58	for (; !IS_LAST_ENTRY(entry); entry = EXT4_XATTR_NEXT(entry)) {
     59		if (!entry->e_value_inum && entry->e_value_size) {
     60			size_t offs = le16_to_cpu(entry->e_value_offs);
     61			if (offs < min_offs)
     62				min_offs = offs;
     63		}
     64	}
     65	free = min_offs -
     66		((void *)entry - (void *)IFIRST(header)) - sizeof(__u32);
     67
     68	if (EXT4_I(inode)->i_inline_off) {
     69		entry = (struct ext4_xattr_entry *)
     70			((void *)raw_inode + EXT4_I(inode)->i_inline_off);
     71
     72		free += EXT4_XATTR_SIZE(le32_to_cpu(entry->e_value_size));
     73		goto out;
     74	}
     75
     76	free -= EXT4_XATTR_LEN(strlen(EXT4_XATTR_SYSTEM_DATA));
     77
     78	if (free > EXT4_XATTR_ROUND)
     79		free = EXT4_XATTR_SIZE(free - EXT4_XATTR_ROUND);
     80	else
     81		free = 0;
     82
     83out:
     84	return free;
     85}
     86
     87/*
     88 * Get the maximum size we now can store in an inode.
     89 * If we can't find the space for a xattr entry, don't use the space
     90 * of the extents since we have no space to indicate the inline data.
     91 */
     92int ext4_get_max_inline_size(struct inode *inode)
     93{
     94	int error, max_inline_size;
     95	struct ext4_iloc iloc;
     96
     97	if (EXT4_I(inode)->i_extra_isize == 0)
     98		return 0;
     99
    100	error = ext4_get_inode_loc(inode, &iloc);
    101	if (error) {
    102		ext4_error_inode_err(inode, __func__, __LINE__, 0, -error,
    103				     "can't get inode location %lu",
    104				     inode->i_ino);
    105		return 0;
    106	}
    107
    108	down_read(&EXT4_I(inode)->xattr_sem);
    109	max_inline_size = get_max_inline_xattr_value_size(inode, &iloc);
    110	up_read(&EXT4_I(inode)->xattr_sem);
    111
    112	brelse(iloc.bh);
    113
    114	if (!max_inline_size)
    115		return 0;
    116
    117	return max_inline_size + EXT4_MIN_INLINE_DATA_SIZE;
    118}
    119
    120/*
    121 * this function does not take xattr_sem, which is OK because it is
    122 * currently only used in a code path coming form ext4_iget, before
    123 * the new inode has been unlocked
    124 */
    125int ext4_find_inline_data_nolock(struct inode *inode)
    126{
    127	struct ext4_xattr_ibody_find is = {
    128		.s = { .not_found = -ENODATA, },
    129	};
    130	struct ext4_xattr_info i = {
    131		.name_index = EXT4_XATTR_INDEX_SYSTEM,
    132		.name = EXT4_XATTR_SYSTEM_DATA,
    133	};
    134	int error;
    135
    136	if (EXT4_I(inode)->i_extra_isize == 0)
    137		return 0;
    138
    139	error = ext4_get_inode_loc(inode, &is.iloc);
    140	if (error)
    141		return error;
    142
    143	error = ext4_xattr_ibody_find(inode, &i, &is);
    144	if (error)
    145		goto out;
    146
    147	if (!is.s.not_found) {
    148		if (is.s.here->e_value_inum) {
    149			EXT4_ERROR_INODE(inode, "inline data xattr refers "
    150					 "to an external xattr inode");
    151			error = -EFSCORRUPTED;
    152			goto out;
    153		}
    154		EXT4_I(inode)->i_inline_off = (u16)((void *)is.s.here -
    155					(void *)ext4_raw_inode(&is.iloc));
    156		EXT4_I(inode)->i_inline_size = EXT4_MIN_INLINE_DATA_SIZE +
    157				le32_to_cpu(is.s.here->e_value_size);
    158		ext4_set_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA);
    159	}
    160out:
    161	brelse(is.iloc.bh);
    162	return error;
    163}
    164
    165static int ext4_read_inline_data(struct inode *inode, void *buffer,
    166				 unsigned int len,
    167				 struct ext4_iloc *iloc)
    168{
    169	struct ext4_xattr_entry *entry;
    170	struct ext4_xattr_ibody_header *header;
    171	int cp_len = 0;
    172	struct ext4_inode *raw_inode;
    173
    174	if (!len)
    175		return 0;
    176
    177	BUG_ON(len > EXT4_I(inode)->i_inline_size);
    178
    179	cp_len = len < EXT4_MIN_INLINE_DATA_SIZE ?
    180			len : EXT4_MIN_INLINE_DATA_SIZE;
    181
    182	raw_inode = ext4_raw_inode(iloc);
    183	memcpy(buffer, (void *)(raw_inode->i_block), cp_len);
    184
    185	len -= cp_len;
    186	buffer += cp_len;
    187
    188	if (!len)
    189		goto out;
    190
    191	header = IHDR(inode, raw_inode);
    192	entry = (struct ext4_xattr_entry *)((void *)raw_inode +
    193					    EXT4_I(inode)->i_inline_off);
    194	len = min_t(unsigned int, len,
    195		    (unsigned int)le32_to_cpu(entry->e_value_size));
    196
    197	memcpy(buffer,
    198	       (void *)IFIRST(header) + le16_to_cpu(entry->e_value_offs), len);
    199	cp_len += len;
    200
    201out:
    202	return cp_len;
    203}
    204
    205/*
    206 * write the buffer to the inline inode.
    207 * If 'create' is set, we don't need to do the extra copy in the xattr
    208 * value since it is already handled by ext4_xattr_ibody_set.
    209 * That saves us one memcpy.
    210 */
    211static void ext4_write_inline_data(struct inode *inode, struct ext4_iloc *iloc,
    212				   void *buffer, loff_t pos, unsigned int len)
    213{
    214	struct ext4_xattr_entry *entry;
    215	struct ext4_xattr_ibody_header *header;
    216	struct ext4_inode *raw_inode;
    217	int cp_len = 0;
    218
    219	if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb))))
    220		return;
    221
    222	BUG_ON(!EXT4_I(inode)->i_inline_off);
    223	BUG_ON(pos + len > EXT4_I(inode)->i_inline_size);
    224
    225	raw_inode = ext4_raw_inode(iloc);
    226	buffer += pos;
    227
    228	if (pos < EXT4_MIN_INLINE_DATA_SIZE) {
    229		cp_len = pos + len > EXT4_MIN_INLINE_DATA_SIZE ?
    230			 EXT4_MIN_INLINE_DATA_SIZE - pos : len;
    231		memcpy((void *)raw_inode->i_block + pos, buffer, cp_len);
    232
    233		len -= cp_len;
    234		buffer += cp_len;
    235		pos += cp_len;
    236	}
    237
    238	if (!len)
    239		return;
    240
    241	pos -= EXT4_MIN_INLINE_DATA_SIZE;
    242	header = IHDR(inode, raw_inode);
    243	entry = (struct ext4_xattr_entry *)((void *)raw_inode +
    244					    EXT4_I(inode)->i_inline_off);
    245
    246	memcpy((void *)IFIRST(header) + le16_to_cpu(entry->e_value_offs) + pos,
    247	       buffer, len);
    248}
    249
    250static int ext4_create_inline_data(handle_t *handle,
    251				   struct inode *inode, unsigned len)
    252{
    253	int error;
    254	void *value = NULL;
    255	struct ext4_xattr_ibody_find is = {
    256		.s = { .not_found = -ENODATA, },
    257	};
    258	struct ext4_xattr_info i = {
    259		.name_index = EXT4_XATTR_INDEX_SYSTEM,
    260		.name = EXT4_XATTR_SYSTEM_DATA,
    261	};
    262
    263	error = ext4_get_inode_loc(inode, &is.iloc);
    264	if (error)
    265		return error;
    266
    267	BUFFER_TRACE(is.iloc.bh, "get_write_access");
    268	error = ext4_journal_get_write_access(handle, inode->i_sb, is.iloc.bh,
    269					      EXT4_JTR_NONE);
    270	if (error)
    271		goto out;
    272
    273	if (len > EXT4_MIN_INLINE_DATA_SIZE) {
    274		value = EXT4_ZERO_XATTR_VALUE;
    275		len -= EXT4_MIN_INLINE_DATA_SIZE;
    276	} else {
    277		value = "";
    278		len = 0;
    279	}
    280
    281	/* Insert the xttr entry. */
    282	i.value = value;
    283	i.value_len = len;
    284
    285	error = ext4_xattr_ibody_find(inode, &i, &is);
    286	if (error)
    287		goto out;
    288
    289	BUG_ON(!is.s.not_found);
    290
    291	error = ext4_xattr_ibody_set(handle, inode, &i, &is);
    292	if (error) {
    293		if (error == -ENOSPC)
    294			ext4_clear_inode_state(inode,
    295					       EXT4_STATE_MAY_INLINE_DATA);
    296		goto out;
    297	}
    298
    299	memset((void *)ext4_raw_inode(&is.iloc)->i_block,
    300		0, EXT4_MIN_INLINE_DATA_SIZE);
    301
    302	EXT4_I(inode)->i_inline_off = (u16)((void *)is.s.here -
    303				      (void *)ext4_raw_inode(&is.iloc));
    304	EXT4_I(inode)->i_inline_size = len + EXT4_MIN_INLINE_DATA_SIZE;
    305	ext4_clear_inode_flag(inode, EXT4_INODE_EXTENTS);
    306	ext4_set_inode_flag(inode, EXT4_INODE_INLINE_DATA);
    307	get_bh(is.iloc.bh);
    308	error = ext4_mark_iloc_dirty(handle, inode, &is.iloc);
    309
    310out:
    311	brelse(is.iloc.bh);
    312	return error;
    313}
    314
    315static int ext4_update_inline_data(handle_t *handle, struct inode *inode,
    316				   unsigned int len)
    317{
    318	int error;
    319	void *value = NULL;
    320	struct ext4_xattr_ibody_find is = {
    321		.s = { .not_found = -ENODATA, },
    322	};
    323	struct ext4_xattr_info i = {
    324		.name_index = EXT4_XATTR_INDEX_SYSTEM,
    325		.name = EXT4_XATTR_SYSTEM_DATA,
    326	};
    327
    328	/* If the old space is ok, write the data directly. */
    329	if (len <= EXT4_I(inode)->i_inline_size)
    330		return 0;
    331
    332	error = ext4_get_inode_loc(inode, &is.iloc);
    333	if (error)
    334		return error;
    335
    336	error = ext4_xattr_ibody_find(inode, &i, &is);
    337	if (error)
    338		goto out;
    339
    340	BUG_ON(is.s.not_found);
    341
    342	len -= EXT4_MIN_INLINE_DATA_SIZE;
    343	value = kzalloc(len, GFP_NOFS);
    344	if (!value) {
    345		error = -ENOMEM;
    346		goto out;
    347	}
    348
    349	error = ext4_xattr_ibody_get(inode, i.name_index, i.name,
    350				     value, len);
    351	if (error == -ENODATA)
    352		goto out;
    353
    354	BUFFER_TRACE(is.iloc.bh, "get_write_access");
    355	error = ext4_journal_get_write_access(handle, inode->i_sb, is.iloc.bh,
    356					      EXT4_JTR_NONE);
    357	if (error)
    358		goto out;
    359
    360	/* Update the xattr entry. */
    361	i.value = value;
    362	i.value_len = len;
    363
    364	error = ext4_xattr_ibody_set(handle, inode, &i, &is);
    365	if (error)
    366		goto out;
    367
    368	EXT4_I(inode)->i_inline_off = (u16)((void *)is.s.here -
    369				      (void *)ext4_raw_inode(&is.iloc));
    370	EXT4_I(inode)->i_inline_size = EXT4_MIN_INLINE_DATA_SIZE +
    371				le32_to_cpu(is.s.here->e_value_size);
    372	ext4_set_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA);
    373	get_bh(is.iloc.bh);
    374	error = ext4_mark_iloc_dirty(handle, inode, &is.iloc);
    375
    376out:
    377	kfree(value);
    378	brelse(is.iloc.bh);
    379	return error;
    380}
    381
    382static int ext4_prepare_inline_data(handle_t *handle, struct inode *inode,
    383				    unsigned int len)
    384{
    385	int ret, size, no_expand;
    386	struct ext4_inode_info *ei = EXT4_I(inode);
    387
    388	if (!ext4_test_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA))
    389		return -ENOSPC;
    390
    391	size = ext4_get_max_inline_size(inode);
    392	if (size < len)
    393		return -ENOSPC;
    394
    395	ext4_write_lock_xattr(inode, &no_expand);
    396
    397	if (ei->i_inline_off)
    398		ret = ext4_update_inline_data(handle, inode, len);
    399	else
    400		ret = ext4_create_inline_data(handle, inode, len);
    401
    402	ext4_write_unlock_xattr(inode, &no_expand);
    403	return ret;
    404}
    405
    406static int ext4_destroy_inline_data_nolock(handle_t *handle,
    407					   struct inode *inode)
    408{
    409	struct ext4_inode_info *ei = EXT4_I(inode);
    410	struct ext4_xattr_ibody_find is = {
    411		.s = { .not_found = 0, },
    412	};
    413	struct ext4_xattr_info i = {
    414		.name_index = EXT4_XATTR_INDEX_SYSTEM,
    415		.name = EXT4_XATTR_SYSTEM_DATA,
    416		.value = NULL,
    417		.value_len = 0,
    418	};
    419	int error;
    420
    421	if (!ei->i_inline_off)
    422		return 0;
    423
    424	error = ext4_get_inode_loc(inode, &is.iloc);
    425	if (error)
    426		return error;
    427
    428	error = ext4_xattr_ibody_find(inode, &i, &is);
    429	if (error)
    430		goto out;
    431
    432	BUFFER_TRACE(is.iloc.bh, "get_write_access");
    433	error = ext4_journal_get_write_access(handle, inode->i_sb, is.iloc.bh,
    434					      EXT4_JTR_NONE);
    435	if (error)
    436		goto out;
    437
    438	error = ext4_xattr_ibody_set(handle, inode, &i, &is);
    439	if (error)
    440		goto out;
    441
    442	memset((void *)ext4_raw_inode(&is.iloc)->i_block,
    443		0, EXT4_MIN_INLINE_DATA_SIZE);
    444	memset(ei->i_data, 0, EXT4_MIN_INLINE_DATA_SIZE);
    445
    446	if (ext4_has_feature_extents(inode->i_sb)) {
    447		if (S_ISDIR(inode->i_mode) ||
    448		    S_ISREG(inode->i_mode) || S_ISLNK(inode->i_mode)) {
    449			ext4_set_inode_flag(inode, EXT4_INODE_EXTENTS);
    450			ext4_ext_tree_init(handle, inode);
    451		}
    452	}
    453	ext4_clear_inode_flag(inode, EXT4_INODE_INLINE_DATA);
    454
    455	get_bh(is.iloc.bh);
    456	error = ext4_mark_iloc_dirty(handle, inode, &is.iloc);
    457
    458	EXT4_I(inode)->i_inline_off = 0;
    459	EXT4_I(inode)->i_inline_size = 0;
    460	ext4_clear_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA);
    461out:
    462	brelse(is.iloc.bh);
    463	if (error == -ENODATA)
    464		error = 0;
    465	return error;
    466}
    467
    468static int ext4_read_inline_page(struct inode *inode, struct page *page)
    469{
    470	void *kaddr;
    471	int ret = 0;
    472	size_t len;
    473	struct ext4_iloc iloc;
    474
    475	BUG_ON(!PageLocked(page));
    476	BUG_ON(!ext4_has_inline_data(inode));
    477	BUG_ON(page->index);
    478
    479	if (!EXT4_I(inode)->i_inline_off) {
    480		ext4_warning(inode->i_sb, "inode %lu doesn't have inline data.",
    481			     inode->i_ino);
    482		goto out;
    483	}
    484
    485	ret = ext4_get_inode_loc(inode, &iloc);
    486	if (ret)
    487		goto out;
    488
    489	len = min_t(size_t, ext4_get_inline_size(inode), i_size_read(inode));
    490	kaddr = kmap_atomic(page);
    491	ret = ext4_read_inline_data(inode, kaddr, len, &iloc);
    492	flush_dcache_page(page);
    493	kunmap_atomic(kaddr);
    494	zero_user_segment(page, len, PAGE_SIZE);
    495	SetPageUptodate(page);
    496	brelse(iloc.bh);
    497
    498out:
    499	return ret;
    500}
    501
    502int ext4_readpage_inline(struct inode *inode, struct page *page)
    503{
    504	int ret = 0;
    505
    506	down_read(&EXT4_I(inode)->xattr_sem);
    507	if (!ext4_has_inline_data(inode)) {
    508		up_read(&EXT4_I(inode)->xattr_sem);
    509		return -EAGAIN;
    510	}
    511
    512	/*
    513	 * Current inline data can only exist in the 1st page,
    514	 * So for all the other pages, just set them uptodate.
    515	 */
    516	if (!page->index)
    517		ret = ext4_read_inline_page(inode, page);
    518	else if (!PageUptodate(page)) {
    519		zero_user_segment(page, 0, PAGE_SIZE);
    520		SetPageUptodate(page);
    521	}
    522
    523	up_read(&EXT4_I(inode)->xattr_sem);
    524
    525	unlock_page(page);
    526	return ret >= 0 ? 0 : ret;
    527}
    528
    529static int ext4_convert_inline_data_to_extent(struct address_space *mapping,
    530					      struct inode *inode)
    531{
    532	int ret, needed_blocks, no_expand;
    533	handle_t *handle = NULL;
    534	int retries = 0, sem_held = 0;
    535	struct page *page = NULL;
    536	unsigned int flags;
    537	unsigned from, to;
    538	struct ext4_iloc iloc;
    539
    540	if (!ext4_has_inline_data(inode)) {
    541		/*
    542		 * clear the flag so that no new write
    543		 * will trap here again.
    544		 */
    545		ext4_clear_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA);
    546		return 0;
    547	}
    548
    549	needed_blocks = ext4_writepage_trans_blocks(inode);
    550
    551	ret = ext4_get_inode_loc(inode, &iloc);
    552	if (ret)
    553		return ret;
    554
    555retry:
    556	handle = ext4_journal_start(inode, EXT4_HT_WRITE_PAGE, needed_blocks);
    557	if (IS_ERR(handle)) {
    558		ret = PTR_ERR(handle);
    559		handle = NULL;
    560		goto out;
    561	}
    562
    563	/* We cannot recurse into the filesystem as the transaction is already
    564	 * started */
    565	flags = memalloc_nofs_save();
    566	page = grab_cache_page_write_begin(mapping, 0);
    567	memalloc_nofs_restore(flags);
    568	if (!page) {
    569		ret = -ENOMEM;
    570		goto out;
    571	}
    572
    573	ext4_write_lock_xattr(inode, &no_expand);
    574	sem_held = 1;
    575	/* If some one has already done this for us, just exit. */
    576	if (!ext4_has_inline_data(inode)) {
    577		ret = 0;
    578		goto out;
    579	}
    580
    581	from = 0;
    582	to = ext4_get_inline_size(inode);
    583	if (!PageUptodate(page)) {
    584		ret = ext4_read_inline_page(inode, page);
    585		if (ret < 0)
    586			goto out;
    587	}
    588
    589	ret = ext4_destroy_inline_data_nolock(handle, inode);
    590	if (ret)
    591		goto out;
    592
    593	if (ext4_should_dioread_nolock(inode)) {
    594		ret = __block_write_begin(page, from, to,
    595					  ext4_get_block_unwritten);
    596	} else
    597		ret = __block_write_begin(page, from, to, ext4_get_block);
    598
    599	if (!ret && ext4_should_journal_data(inode)) {
    600		ret = ext4_walk_page_buffers(handle, inode, page_buffers(page),
    601					     from, to, NULL,
    602					     do_journal_get_write_access);
    603	}
    604
    605	if (ret) {
    606		unlock_page(page);
    607		put_page(page);
    608		page = NULL;
    609		ext4_orphan_add(handle, inode);
    610		ext4_write_unlock_xattr(inode, &no_expand);
    611		sem_held = 0;
    612		ext4_journal_stop(handle);
    613		handle = NULL;
    614		ext4_truncate_failed_write(inode);
    615		/*
    616		 * If truncate failed early the inode might
    617		 * still be on the orphan list; we need to
    618		 * make sure the inode is removed from the
    619		 * orphan list in that case.
    620		 */
    621		if (inode->i_nlink)
    622			ext4_orphan_del(NULL, inode);
    623	}
    624
    625	if (ret == -ENOSPC && ext4_should_retry_alloc(inode->i_sb, &retries))
    626		goto retry;
    627
    628	if (page)
    629		block_commit_write(page, from, to);
    630out:
    631	if (page) {
    632		unlock_page(page);
    633		put_page(page);
    634	}
    635	if (sem_held)
    636		ext4_write_unlock_xattr(inode, &no_expand);
    637	if (handle)
    638		ext4_journal_stop(handle);
    639	brelse(iloc.bh);
    640	return ret;
    641}
    642
    643/*
    644 * Try to write data in the inode.
    645 * If the inode has inline data, check whether the new write can be
    646 * in the inode also. If not, create the page the handle, move the data
    647 * to the page make it update and let the later codes create extent for it.
    648 */
    649int ext4_try_to_write_inline_data(struct address_space *mapping,
    650				  struct inode *inode,
    651				  loff_t pos, unsigned len,
    652				  struct page **pagep)
    653{
    654	int ret;
    655	handle_t *handle;
    656	unsigned int flags;
    657	struct page *page;
    658	struct ext4_iloc iloc;
    659
    660	if (pos + len > ext4_get_max_inline_size(inode))
    661		goto convert;
    662
    663	ret = ext4_get_inode_loc(inode, &iloc);
    664	if (ret)
    665		return ret;
    666
    667	/*
    668	 * The possible write could happen in the inode,
    669	 * so try to reserve the space in inode first.
    670	 */
    671	handle = ext4_journal_start(inode, EXT4_HT_INODE, 1);
    672	if (IS_ERR(handle)) {
    673		ret = PTR_ERR(handle);
    674		handle = NULL;
    675		goto out;
    676	}
    677
    678	ret = ext4_prepare_inline_data(handle, inode, pos + len);
    679	if (ret && ret != -ENOSPC)
    680		goto out;
    681
    682	/* We don't have space in inline inode, so convert it to extent. */
    683	if (ret == -ENOSPC) {
    684		ext4_journal_stop(handle);
    685		brelse(iloc.bh);
    686		goto convert;
    687	}
    688
    689	ret = ext4_journal_get_write_access(handle, inode->i_sb, iloc.bh,
    690					    EXT4_JTR_NONE);
    691	if (ret)
    692		goto out;
    693
    694	flags = memalloc_nofs_save();
    695	page = grab_cache_page_write_begin(mapping, 0);
    696	memalloc_nofs_restore(flags);
    697	if (!page) {
    698		ret = -ENOMEM;
    699		goto out;
    700	}
    701
    702	*pagep = page;
    703	down_read(&EXT4_I(inode)->xattr_sem);
    704	if (!ext4_has_inline_data(inode)) {
    705		ret = 0;
    706		unlock_page(page);
    707		put_page(page);
    708		goto out_up_read;
    709	}
    710
    711	if (!PageUptodate(page)) {
    712		ret = ext4_read_inline_page(inode, page);
    713		if (ret < 0) {
    714			unlock_page(page);
    715			put_page(page);
    716			goto out_up_read;
    717		}
    718	}
    719
    720	ret = 1;
    721	handle = NULL;
    722out_up_read:
    723	up_read(&EXT4_I(inode)->xattr_sem);
    724out:
    725	if (handle && (ret != 1))
    726		ext4_journal_stop(handle);
    727	brelse(iloc.bh);
    728	return ret;
    729convert:
    730	return ext4_convert_inline_data_to_extent(mapping, inode);
    731}
    732
    733int ext4_write_inline_data_end(struct inode *inode, loff_t pos, unsigned len,
    734			       unsigned copied, struct page *page)
    735{
    736	handle_t *handle = ext4_journal_current_handle();
    737	int no_expand;
    738	void *kaddr;
    739	struct ext4_iloc iloc;
    740	int ret = 0, ret2;
    741
    742	if (unlikely(copied < len) && !PageUptodate(page))
    743		copied = 0;
    744
    745	if (likely(copied)) {
    746		ret = ext4_get_inode_loc(inode, &iloc);
    747		if (ret) {
    748			unlock_page(page);
    749			put_page(page);
    750			ext4_std_error(inode->i_sb, ret);
    751			goto out;
    752		}
    753		ext4_write_lock_xattr(inode, &no_expand);
    754		BUG_ON(!ext4_has_inline_data(inode));
    755
    756		/*
    757		 * ei->i_inline_off may have changed since
    758		 * ext4_write_begin() called
    759		 * ext4_try_to_write_inline_data()
    760		 */
    761		(void) ext4_find_inline_data_nolock(inode);
    762
    763		kaddr = kmap_atomic(page);
    764		ext4_write_inline_data(inode, &iloc, kaddr, pos, copied);
    765		kunmap_atomic(kaddr);
    766		SetPageUptodate(page);
    767		/* clear page dirty so that writepages wouldn't work for us. */
    768		ClearPageDirty(page);
    769
    770		ext4_write_unlock_xattr(inode, &no_expand);
    771		brelse(iloc.bh);
    772
    773		/*
    774		 * It's important to update i_size while still holding page
    775		 * lock: page writeout could otherwise come in and zero
    776		 * beyond i_size.
    777		 */
    778		ext4_update_inode_size(inode, pos + copied);
    779	}
    780	unlock_page(page);
    781	put_page(page);
    782
    783	/*
    784	 * Don't mark the inode dirty under page lock. First, it unnecessarily
    785	 * makes the holding time of page lock longer. Second, it forces lock
    786	 * ordering of page lock and transaction start for journaling
    787	 * filesystems.
    788	 */
    789	if (likely(copied))
    790		mark_inode_dirty(inode);
    791out:
    792	/*
    793	 * If we didn't copy as much data as expected, we need to trim back
    794	 * size of xattr containing inline data.
    795	 */
    796	if (pos + len > inode->i_size && ext4_can_truncate(inode))
    797		ext4_orphan_add(handle, inode);
    798
    799	ret2 = ext4_journal_stop(handle);
    800	if (!ret)
    801		ret = ret2;
    802	if (pos + len > inode->i_size) {
    803		ext4_truncate_failed_write(inode);
    804		/*
    805		 * If truncate failed early the inode might still be
    806		 * on the orphan list; we need to make sure the inode
    807		 * is removed from the orphan list in that case.
    808		 */
    809		if (inode->i_nlink)
    810			ext4_orphan_del(NULL, inode);
    811	}
    812	return ret ? ret : copied;
    813}
    814
    815struct buffer_head *
    816ext4_journalled_write_inline_data(struct inode *inode,
    817				  unsigned len,
    818				  struct page *page)
    819{
    820	int ret, no_expand;
    821	void *kaddr;
    822	struct ext4_iloc iloc;
    823
    824	ret = ext4_get_inode_loc(inode, &iloc);
    825	if (ret) {
    826		ext4_std_error(inode->i_sb, ret);
    827		return NULL;
    828	}
    829
    830	ext4_write_lock_xattr(inode, &no_expand);
    831	kaddr = kmap_atomic(page);
    832	ext4_write_inline_data(inode, &iloc, kaddr, 0, len);
    833	kunmap_atomic(kaddr);
    834	ext4_write_unlock_xattr(inode, &no_expand);
    835
    836	return iloc.bh;
    837}
    838
    839/*
    840 * Try to make the page cache and handle ready for the inline data case.
    841 * We can call this function in 2 cases:
    842 * 1. The inode is created and the first write exceeds inline size. We can
    843 *    clear the inode state safely.
    844 * 2. The inode has inline data, then we need to read the data, make it
    845 *    update and dirty so that ext4_da_writepages can handle it. We don't
    846 *    need to start the journal since the file's metadata isn't changed now.
    847 */
    848static int ext4_da_convert_inline_data_to_extent(struct address_space *mapping,
    849						 struct inode *inode,
    850						 void **fsdata)
    851{
    852	int ret = 0, inline_size;
    853	struct page *page;
    854
    855	page = grab_cache_page_write_begin(mapping, 0);
    856	if (!page)
    857		return -ENOMEM;
    858
    859	down_read(&EXT4_I(inode)->xattr_sem);
    860	if (!ext4_has_inline_data(inode)) {
    861		ext4_clear_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA);
    862		goto out;
    863	}
    864
    865	inline_size = ext4_get_inline_size(inode);
    866
    867	if (!PageUptodate(page)) {
    868		ret = ext4_read_inline_page(inode, page);
    869		if (ret < 0)
    870			goto out;
    871	}
    872
    873	ret = __block_write_begin(page, 0, inline_size,
    874				  ext4_da_get_block_prep);
    875	if (ret) {
    876		up_read(&EXT4_I(inode)->xattr_sem);
    877		unlock_page(page);
    878		put_page(page);
    879		ext4_truncate_failed_write(inode);
    880		return ret;
    881	}
    882
    883	SetPageDirty(page);
    884	SetPageUptodate(page);
    885	ext4_clear_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA);
    886	*fsdata = (void *)CONVERT_INLINE_DATA;
    887
    888out:
    889	up_read(&EXT4_I(inode)->xattr_sem);
    890	if (page) {
    891		unlock_page(page);
    892		put_page(page);
    893	}
    894	return ret;
    895}
    896
    897/*
    898 * Prepare the write for the inline data.
    899 * If the data can be written into the inode, we just read
    900 * the page and make it uptodate, and start the journal.
    901 * Otherwise read the page, makes it dirty so that it can be
    902 * handle in writepages(the i_disksize update is left to the
    903 * normal ext4_da_write_end).
    904 */
    905int ext4_da_write_inline_data_begin(struct address_space *mapping,
    906				    struct inode *inode,
    907				    loff_t pos, unsigned len,
    908				    struct page **pagep,
    909				    void **fsdata)
    910{
    911	int ret;
    912	handle_t *handle;
    913	struct page *page;
    914	struct ext4_iloc iloc;
    915	int retries = 0;
    916	unsigned int flags;
    917
    918	ret = ext4_get_inode_loc(inode, &iloc);
    919	if (ret)
    920		return ret;
    921
    922retry_journal:
    923	handle = ext4_journal_start(inode, EXT4_HT_INODE, 1);
    924	if (IS_ERR(handle)) {
    925		ret = PTR_ERR(handle);
    926		goto out;
    927	}
    928
    929	ret = ext4_prepare_inline_data(handle, inode, pos + len);
    930	if (ret && ret != -ENOSPC)
    931		goto out_journal;
    932
    933	if (ret == -ENOSPC) {
    934		ext4_journal_stop(handle);
    935		ret = ext4_da_convert_inline_data_to_extent(mapping,
    936							    inode,
    937							    fsdata);
    938		if (ret == -ENOSPC &&
    939		    ext4_should_retry_alloc(inode->i_sb, &retries))
    940			goto retry_journal;
    941		goto out;
    942	}
    943
    944	/*
    945	 * We cannot recurse into the filesystem as the transaction
    946	 * is already started.
    947	 */
    948	flags = memalloc_nofs_save();
    949	page = grab_cache_page_write_begin(mapping, 0);
    950	memalloc_nofs_restore(flags);
    951	if (!page) {
    952		ret = -ENOMEM;
    953		goto out_journal;
    954	}
    955
    956	down_read(&EXT4_I(inode)->xattr_sem);
    957	if (!ext4_has_inline_data(inode)) {
    958		ret = 0;
    959		goto out_release_page;
    960	}
    961
    962	if (!PageUptodate(page)) {
    963		ret = ext4_read_inline_page(inode, page);
    964		if (ret < 0)
    965			goto out_release_page;
    966	}
    967	ret = ext4_journal_get_write_access(handle, inode->i_sb, iloc.bh,
    968					    EXT4_JTR_NONE);
    969	if (ret)
    970		goto out_release_page;
    971
    972	up_read(&EXT4_I(inode)->xattr_sem);
    973	*pagep = page;
    974	brelse(iloc.bh);
    975	return 1;
    976out_release_page:
    977	up_read(&EXT4_I(inode)->xattr_sem);
    978	unlock_page(page);
    979	put_page(page);
    980out_journal:
    981	ext4_journal_stop(handle);
    982out:
    983	brelse(iloc.bh);
    984	return ret;
    985}
    986
    987#ifdef INLINE_DIR_DEBUG
    988void ext4_show_inline_dir(struct inode *dir, struct buffer_head *bh,
    989			  void *inline_start, int inline_size)
    990{
    991	int offset;
    992	unsigned short de_len;
    993	struct ext4_dir_entry_2 *de = inline_start;
    994	void *dlimit = inline_start + inline_size;
    995
    996	trace_printk("inode %lu\n", dir->i_ino);
    997	offset = 0;
    998	while ((void *)de < dlimit) {
    999		de_len = ext4_rec_len_from_disk(de->rec_len, inline_size);
   1000		trace_printk("de: off %u rlen %u name %.*s nlen %u ino %u\n",
   1001			     offset, de_len, de->name_len, de->name,
   1002			     de->name_len, le32_to_cpu(de->inode));
   1003		if (ext4_check_dir_entry(dir, NULL, de, bh,
   1004					 inline_start, inline_size, offset))
   1005			BUG();
   1006
   1007		offset += de_len;
   1008		de = (struct ext4_dir_entry_2 *) ((char *) de + de_len);
   1009	}
   1010}
   1011#else
   1012#define ext4_show_inline_dir(dir, bh, inline_start, inline_size)
   1013#endif
   1014
   1015/*
   1016 * Add a new entry into a inline dir.
   1017 * It will return -ENOSPC if no space is available, and -EIO
   1018 * and -EEXIST if directory entry already exists.
   1019 */
   1020static int ext4_add_dirent_to_inline(handle_t *handle,
   1021				     struct ext4_filename *fname,
   1022				     struct inode *dir,
   1023				     struct inode *inode,
   1024				     struct ext4_iloc *iloc,
   1025				     void *inline_start, int inline_size)
   1026{
   1027	int		err;
   1028	struct ext4_dir_entry_2 *de;
   1029
   1030	err = ext4_find_dest_de(dir, inode, iloc->bh, inline_start,
   1031				inline_size, fname, &de);
   1032	if (err)
   1033		return err;
   1034
   1035	BUFFER_TRACE(iloc->bh, "get_write_access");
   1036	err = ext4_journal_get_write_access(handle, dir->i_sb, iloc->bh,
   1037					    EXT4_JTR_NONE);
   1038	if (err)
   1039		return err;
   1040	ext4_insert_dentry(dir, inode, de, inline_size, fname);
   1041
   1042	ext4_show_inline_dir(dir, iloc->bh, inline_start, inline_size);
   1043
   1044	/*
   1045	 * XXX shouldn't update any times until successful
   1046	 * completion of syscall, but too many callers depend
   1047	 * on this.
   1048	 *
   1049	 * XXX similarly, too many callers depend on
   1050	 * ext4_new_inode() setting the times, but error
   1051	 * recovery deletes the inode, so the worst that can
   1052	 * happen is that the times are slightly out of date
   1053	 * and/or different from the directory change time.
   1054	 */
   1055	dir->i_mtime = dir->i_ctime = current_time(dir);
   1056	ext4_update_dx_flag(dir);
   1057	inode_inc_iversion(dir);
   1058	return 1;
   1059}
   1060
   1061static void *ext4_get_inline_xattr_pos(struct inode *inode,
   1062				       struct ext4_iloc *iloc)
   1063{
   1064	struct ext4_xattr_entry *entry;
   1065	struct ext4_xattr_ibody_header *header;
   1066
   1067	BUG_ON(!EXT4_I(inode)->i_inline_off);
   1068
   1069	header = IHDR(inode, ext4_raw_inode(iloc));
   1070	entry = (struct ext4_xattr_entry *)((void *)ext4_raw_inode(iloc) +
   1071					    EXT4_I(inode)->i_inline_off);
   1072
   1073	return (void *)IFIRST(header) + le16_to_cpu(entry->e_value_offs);
   1074}
   1075
   1076/* Set the final de to cover the whole block. */
   1077static void ext4_update_final_de(void *de_buf, int old_size, int new_size)
   1078{
   1079	struct ext4_dir_entry_2 *de, *prev_de;
   1080	void *limit;
   1081	int de_len;
   1082
   1083	de = de_buf;
   1084	if (old_size) {
   1085		limit = de_buf + old_size;
   1086		do {
   1087			prev_de = de;
   1088			de_len = ext4_rec_len_from_disk(de->rec_len, old_size);
   1089			de_buf += de_len;
   1090			de = de_buf;
   1091		} while (de_buf < limit);
   1092
   1093		prev_de->rec_len = ext4_rec_len_to_disk(de_len + new_size -
   1094							old_size, new_size);
   1095	} else {
   1096		/* this is just created, so create an empty entry. */
   1097		de->inode = 0;
   1098		de->rec_len = ext4_rec_len_to_disk(new_size, new_size);
   1099	}
   1100}
   1101
   1102static int ext4_update_inline_dir(handle_t *handle, struct inode *dir,
   1103				  struct ext4_iloc *iloc)
   1104{
   1105	int ret;
   1106	int old_size = EXT4_I(dir)->i_inline_size - EXT4_MIN_INLINE_DATA_SIZE;
   1107	int new_size = get_max_inline_xattr_value_size(dir, iloc);
   1108
   1109	if (new_size - old_size <= ext4_dir_rec_len(1, NULL))
   1110		return -ENOSPC;
   1111
   1112	ret = ext4_update_inline_data(handle, dir,
   1113				      new_size + EXT4_MIN_INLINE_DATA_SIZE);
   1114	if (ret)
   1115		return ret;
   1116
   1117	ext4_update_final_de(ext4_get_inline_xattr_pos(dir, iloc), old_size,
   1118			     EXT4_I(dir)->i_inline_size -
   1119						EXT4_MIN_INLINE_DATA_SIZE);
   1120	dir->i_size = EXT4_I(dir)->i_disksize = EXT4_I(dir)->i_inline_size;
   1121	return 0;
   1122}
   1123
   1124static void ext4_restore_inline_data(handle_t *handle, struct inode *inode,
   1125				     struct ext4_iloc *iloc,
   1126				     void *buf, int inline_size)
   1127{
   1128	int ret;
   1129
   1130	ret = ext4_create_inline_data(handle, inode, inline_size);
   1131	if (ret) {
   1132		ext4_msg(inode->i_sb, KERN_EMERG,
   1133			"error restoring inline_data for inode -- potential data loss! (inode %lu, error %d)",
   1134			inode->i_ino, ret);
   1135		return;
   1136	}
   1137	ext4_write_inline_data(inode, iloc, buf, 0, inline_size);
   1138	ext4_set_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA);
   1139}
   1140
   1141static int ext4_finish_convert_inline_dir(handle_t *handle,
   1142					  struct inode *inode,
   1143					  struct buffer_head *dir_block,
   1144					  void *buf,
   1145					  int inline_size)
   1146{
   1147	int err, csum_size = 0, header_size = 0;
   1148	struct ext4_dir_entry_2 *de;
   1149	void *target = dir_block->b_data;
   1150
   1151	/*
   1152	 * First create "." and ".." and then copy the dir information
   1153	 * back to the block.
   1154	 */
   1155	de = target;
   1156	de = ext4_init_dot_dotdot(inode, de,
   1157		inode->i_sb->s_blocksize, csum_size,
   1158		le32_to_cpu(((struct ext4_dir_entry_2 *)buf)->inode), 1);
   1159	header_size = (void *)de - target;
   1160
   1161	memcpy((void *)de, buf + EXT4_INLINE_DOTDOT_SIZE,
   1162		inline_size - EXT4_INLINE_DOTDOT_SIZE);
   1163
   1164	if (ext4_has_metadata_csum(inode->i_sb))
   1165		csum_size = sizeof(struct ext4_dir_entry_tail);
   1166
   1167	inode->i_size = inode->i_sb->s_blocksize;
   1168	i_size_write(inode, inode->i_sb->s_blocksize);
   1169	EXT4_I(inode)->i_disksize = inode->i_sb->s_blocksize;
   1170	ext4_update_final_de(dir_block->b_data,
   1171			inline_size - EXT4_INLINE_DOTDOT_SIZE + header_size,
   1172			inode->i_sb->s_blocksize - csum_size);
   1173
   1174	if (csum_size)
   1175		ext4_initialize_dirent_tail(dir_block,
   1176					    inode->i_sb->s_blocksize);
   1177	set_buffer_uptodate(dir_block);
   1178	err = ext4_handle_dirty_dirblock(handle, inode, dir_block);
   1179	if (err)
   1180		return err;
   1181	set_buffer_verified(dir_block);
   1182	return ext4_mark_inode_dirty(handle, inode);
   1183}
   1184
   1185static int ext4_convert_inline_data_nolock(handle_t *handle,
   1186					   struct inode *inode,
   1187					   struct ext4_iloc *iloc)
   1188{
   1189	int error;
   1190	void *buf = NULL;
   1191	struct buffer_head *data_bh = NULL;
   1192	struct ext4_map_blocks map;
   1193	int inline_size;
   1194
   1195	inline_size = ext4_get_inline_size(inode);
   1196	buf = kmalloc(inline_size, GFP_NOFS);
   1197	if (!buf) {
   1198		error = -ENOMEM;
   1199		goto out;
   1200	}
   1201
   1202	error = ext4_read_inline_data(inode, buf, inline_size, iloc);
   1203	if (error < 0)
   1204		goto out;
   1205
   1206	/*
   1207	 * Make sure the inline directory entries pass checks before we try to
   1208	 * convert them, so that we avoid touching stuff that needs fsck.
   1209	 */
   1210	if (S_ISDIR(inode->i_mode)) {
   1211		error = ext4_check_all_de(inode, iloc->bh,
   1212					buf + EXT4_INLINE_DOTDOT_SIZE,
   1213					inline_size - EXT4_INLINE_DOTDOT_SIZE);
   1214		if (error)
   1215			goto out;
   1216	}
   1217
   1218	error = ext4_destroy_inline_data_nolock(handle, inode);
   1219	if (error)
   1220		goto out;
   1221
   1222	map.m_lblk = 0;
   1223	map.m_len = 1;
   1224	map.m_flags = 0;
   1225	error = ext4_map_blocks(handle, inode, &map, EXT4_GET_BLOCKS_CREATE);
   1226	if (error < 0)
   1227		goto out_restore;
   1228	if (!(map.m_flags & EXT4_MAP_MAPPED)) {
   1229		error = -EIO;
   1230		goto out_restore;
   1231	}
   1232
   1233	data_bh = sb_getblk(inode->i_sb, map.m_pblk);
   1234	if (!data_bh) {
   1235		error = -ENOMEM;
   1236		goto out_restore;
   1237	}
   1238
   1239	lock_buffer(data_bh);
   1240	error = ext4_journal_get_create_access(handle, inode->i_sb, data_bh,
   1241					       EXT4_JTR_NONE);
   1242	if (error) {
   1243		unlock_buffer(data_bh);
   1244		error = -EIO;
   1245		goto out_restore;
   1246	}
   1247	memset(data_bh->b_data, 0, inode->i_sb->s_blocksize);
   1248
   1249	if (!S_ISDIR(inode->i_mode)) {
   1250		memcpy(data_bh->b_data, buf, inline_size);
   1251		set_buffer_uptodate(data_bh);
   1252		error = ext4_handle_dirty_metadata(handle,
   1253						   inode, data_bh);
   1254	} else {
   1255		error = ext4_finish_convert_inline_dir(handle, inode, data_bh,
   1256						       buf, inline_size);
   1257	}
   1258
   1259	unlock_buffer(data_bh);
   1260out_restore:
   1261	if (error)
   1262		ext4_restore_inline_data(handle, inode, iloc, buf, inline_size);
   1263
   1264out:
   1265	brelse(data_bh);
   1266	kfree(buf);
   1267	return error;
   1268}
   1269
   1270/*
   1271 * Try to add the new entry to the inline data.
   1272 * If succeeds, return 0. If not, extended the inline dir and copied data to
   1273 * the new created block.
   1274 */
   1275int ext4_try_add_inline_entry(handle_t *handle, struct ext4_filename *fname,
   1276			      struct inode *dir, struct inode *inode)
   1277{
   1278	int ret, ret2, inline_size, no_expand;
   1279	void *inline_start;
   1280	struct ext4_iloc iloc;
   1281
   1282	ret = ext4_get_inode_loc(dir, &iloc);
   1283	if (ret)
   1284		return ret;
   1285
   1286	ext4_write_lock_xattr(dir, &no_expand);
   1287	if (!ext4_has_inline_data(dir))
   1288		goto out;
   1289
   1290	inline_start = (void *)ext4_raw_inode(&iloc)->i_block +
   1291						 EXT4_INLINE_DOTDOT_SIZE;
   1292	inline_size = EXT4_MIN_INLINE_DATA_SIZE - EXT4_INLINE_DOTDOT_SIZE;
   1293
   1294	ret = ext4_add_dirent_to_inline(handle, fname, dir, inode, &iloc,
   1295					inline_start, inline_size);
   1296	if (ret != -ENOSPC)
   1297		goto out;
   1298
   1299	/* check whether it can be inserted to inline xattr space. */
   1300	inline_size = EXT4_I(dir)->i_inline_size -
   1301			EXT4_MIN_INLINE_DATA_SIZE;
   1302	if (!inline_size) {
   1303		/* Try to use the xattr space.*/
   1304		ret = ext4_update_inline_dir(handle, dir, &iloc);
   1305		if (ret && ret != -ENOSPC)
   1306			goto out;
   1307
   1308		inline_size = EXT4_I(dir)->i_inline_size -
   1309				EXT4_MIN_INLINE_DATA_SIZE;
   1310	}
   1311
   1312	if (inline_size) {
   1313		inline_start = ext4_get_inline_xattr_pos(dir, &iloc);
   1314
   1315		ret = ext4_add_dirent_to_inline(handle, fname, dir,
   1316						inode, &iloc, inline_start,
   1317						inline_size);
   1318
   1319		if (ret != -ENOSPC)
   1320			goto out;
   1321	}
   1322
   1323	/*
   1324	 * The inline space is filled up, so create a new block for it.
   1325	 * As the extent tree will be created, we have to save the inline
   1326	 * dir first.
   1327	 */
   1328	ret = ext4_convert_inline_data_nolock(handle, dir, &iloc);
   1329
   1330out:
   1331	ext4_write_unlock_xattr(dir, &no_expand);
   1332	ret2 = ext4_mark_inode_dirty(handle, dir);
   1333	if (unlikely(ret2 && !ret))
   1334		ret = ret2;
   1335	brelse(iloc.bh);
   1336	return ret;
   1337}
   1338
   1339/*
   1340 * This function fills a red-black tree with information from an
   1341 * inlined dir.  It returns the number directory entries loaded
   1342 * into the tree.  If there is an error it is returned in err.
   1343 */
   1344int ext4_inlinedir_to_tree(struct file *dir_file,
   1345			   struct inode *dir, ext4_lblk_t block,
   1346			   struct dx_hash_info *hinfo,
   1347			   __u32 start_hash, __u32 start_minor_hash,
   1348			   int *has_inline_data)
   1349{
   1350	int err = 0, count = 0;
   1351	unsigned int parent_ino;
   1352	int pos;
   1353	struct ext4_dir_entry_2 *de;
   1354	struct inode *inode = file_inode(dir_file);
   1355	int ret, inline_size = 0;
   1356	struct ext4_iloc iloc;
   1357	void *dir_buf = NULL;
   1358	struct ext4_dir_entry_2 fake;
   1359	struct fscrypt_str tmp_str;
   1360
   1361	ret = ext4_get_inode_loc(inode, &iloc);
   1362	if (ret)
   1363		return ret;
   1364
   1365	down_read(&EXT4_I(inode)->xattr_sem);
   1366	if (!ext4_has_inline_data(inode)) {
   1367		up_read(&EXT4_I(inode)->xattr_sem);
   1368		*has_inline_data = 0;
   1369		goto out;
   1370	}
   1371
   1372	inline_size = ext4_get_inline_size(inode);
   1373	dir_buf = kmalloc(inline_size, GFP_NOFS);
   1374	if (!dir_buf) {
   1375		ret = -ENOMEM;
   1376		up_read(&EXT4_I(inode)->xattr_sem);
   1377		goto out;
   1378	}
   1379
   1380	ret = ext4_read_inline_data(inode, dir_buf, inline_size, &iloc);
   1381	up_read(&EXT4_I(inode)->xattr_sem);
   1382	if (ret < 0)
   1383		goto out;
   1384
   1385	pos = 0;
   1386	parent_ino = le32_to_cpu(((struct ext4_dir_entry_2 *)dir_buf)->inode);
   1387	while (pos < inline_size) {
   1388		/*
   1389		 * As inlined dir doesn't store any information about '.' and
   1390		 * only the inode number of '..' is stored, we have to handle
   1391		 * them differently.
   1392		 */
   1393		if (pos == 0) {
   1394			fake.inode = cpu_to_le32(inode->i_ino);
   1395			fake.name_len = 1;
   1396			strcpy(fake.name, ".");
   1397			fake.rec_len = ext4_rec_len_to_disk(
   1398					  ext4_dir_rec_len(fake.name_len, NULL),
   1399					  inline_size);
   1400			ext4_set_de_type(inode->i_sb, &fake, S_IFDIR);
   1401			de = &fake;
   1402			pos = EXT4_INLINE_DOTDOT_OFFSET;
   1403		} else if (pos == EXT4_INLINE_DOTDOT_OFFSET) {
   1404			fake.inode = cpu_to_le32(parent_ino);
   1405			fake.name_len = 2;
   1406			strcpy(fake.name, "..");
   1407			fake.rec_len = ext4_rec_len_to_disk(
   1408					  ext4_dir_rec_len(fake.name_len, NULL),
   1409					  inline_size);
   1410			ext4_set_de_type(inode->i_sb, &fake, S_IFDIR);
   1411			de = &fake;
   1412			pos = EXT4_INLINE_DOTDOT_SIZE;
   1413		} else {
   1414			de = (struct ext4_dir_entry_2 *)(dir_buf + pos);
   1415			pos += ext4_rec_len_from_disk(de->rec_len, inline_size);
   1416			if (ext4_check_dir_entry(inode, dir_file, de,
   1417					 iloc.bh, dir_buf,
   1418					 inline_size, pos)) {
   1419				ret = count;
   1420				goto out;
   1421			}
   1422		}
   1423
   1424		if (ext4_hash_in_dirent(dir)) {
   1425			hinfo->hash = EXT4_DIRENT_HASH(de);
   1426			hinfo->minor_hash = EXT4_DIRENT_MINOR_HASH(de);
   1427		} else {
   1428			ext4fs_dirhash(dir, de->name, de->name_len, hinfo);
   1429		}
   1430		if ((hinfo->hash < start_hash) ||
   1431		    ((hinfo->hash == start_hash) &&
   1432		     (hinfo->minor_hash < start_minor_hash)))
   1433			continue;
   1434		if (de->inode == 0)
   1435			continue;
   1436		tmp_str.name = de->name;
   1437		tmp_str.len = de->name_len;
   1438		err = ext4_htree_store_dirent(dir_file, hinfo->hash,
   1439					      hinfo->minor_hash, de, &tmp_str);
   1440		if (err) {
   1441			ret = err;
   1442			goto out;
   1443		}
   1444		count++;
   1445	}
   1446	ret = count;
   1447out:
   1448	kfree(dir_buf);
   1449	brelse(iloc.bh);
   1450	return ret;
   1451}
   1452
   1453/*
   1454 * So this function is called when the volume is mkfsed with
   1455 * dir_index disabled. In order to keep f_pos persistent
   1456 * after we convert from an inlined dir to a blocked based,
   1457 * we just pretend that we are a normal dir and return the
   1458 * offset as if '.' and '..' really take place.
   1459 *
   1460 */
   1461int ext4_read_inline_dir(struct file *file,
   1462			 struct dir_context *ctx,
   1463			 int *has_inline_data)
   1464{
   1465	unsigned int offset, parent_ino;
   1466	int i;
   1467	struct ext4_dir_entry_2 *de;
   1468	struct super_block *sb;
   1469	struct inode *inode = file_inode(file);
   1470	int ret, inline_size = 0;
   1471	struct ext4_iloc iloc;
   1472	void *dir_buf = NULL;
   1473	int dotdot_offset, dotdot_size, extra_offset, extra_size;
   1474
   1475	ret = ext4_get_inode_loc(inode, &iloc);
   1476	if (ret)
   1477		return ret;
   1478
   1479	down_read(&EXT4_I(inode)->xattr_sem);
   1480	if (!ext4_has_inline_data(inode)) {
   1481		up_read(&EXT4_I(inode)->xattr_sem);
   1482		*has_inline_data = 0;
   1483		goto out;
   1484	}
   1485
   1486	inline_size = ext4_get_inline_size(inode);
   1487	dir_buf = kmalloc(inline_size, GFP_NOFS);
   1488	if (!dir_buf) {
   1489		ret = -ENOMEM;
   1490		up_read(&EXT4_I(inode)->xattr_sem);
   1491		goto out;
   1492	}
   1493
   1494	ret = ext4_read_inline_data(inode, dir_buf, inline_size, &iloc);
   1495	up_read(&EXT4_I(inode)->xattr_sem);
   1496	if (ret < 0)
   1497		goto out;
   1498
   1499	ret = 0;
   1500	sb = inode->i_sb;
   1501	parent_ino = le32_to_cpu(((struct ext4_dir_entry_2 *)dir_buf)->inode);
   1502	offset = ctx->pos;
   1503
   1504	/*
   1505	 * dotdot_offset and dotdot_size is the real offset and
   1506	 * size for ".." and "." if the dir is block based while
   1507	 * the real size for them are only EXT4_INLINE_DOTDOT_SIZE.
   1508	 * So we will use extra_offset and extra_size to indicate them
   1509	 * during the inline dir iteration.
   1510	 */
   1511	dotdot_offset = ext4_dir_rec_len(1, NULL);
   1512	dotdot_size = dotdot_offset + ext4_dir_rec_len(2, NULL);
   1513	extra_offset = dotdot_size - EXT4_INLINE_DOTDOT_SIZE;
   1514	extra_size = extra_offset + inline_size;
   1515
   1516	/*
   1517	 * If the version has changed since the last call to
   1518	 * readdir(2), then we might be pointing to an invalid
   1519	 * dirent right now.  Scan from the start of the inline
   1520	 * dir to make sure.
   1521	 */
   1522	if (!inode_eq_iversion(inode, file->f_version)) {
   1523		for (i = 0; i < extra_size && i < offset;) {
   1524			/*
   1525			 * "." is with offset 0 and
   1526			 * ".." is dotdot_offset.
   1527			 */
   1528			if (!i) {
   1529				i = dotdot_offset;
   1530				continue;
   1531			} else if (i == dotdot_offset) {
   1532				i = dotdot_size;
   1533				continue;
   1534			}
   1535			/* for other entry, the real offset in
   1536			 * the buf has to be tuned accordingly.
   1537			 */
   1538			de = (struct ext4_dir_entry_2 *)
   1539				(dir_buf + i - extra_offset);
   1540			/* It's too expensive to do a full
   1541			 * dirent test each time round this
   1542			 * loop, but we do have to test at
   1543			 * least that it is non-zero.  A
   1544			 * failure will be detected in the
   1545			 * dirent test below. */
   1546			if (ext4_rec_len_from_disk(de->rec_len, extra_size)
   1547				< ext4_dir_rec_len(1, NULL))
   1548				break;
   1549			i += ext4_rec_len_from_disk(de->rec_len,
   1550						    extra_size);
   1551		}
   1552		offset = i;
   1553		ctx->pos = offset;
   1554		file->f_version = inode_query_iversion(inode);
   1555	}
   1556
   1557	while (ctx->pos < extra_size) {
   1558		if (ctx->pos == 0) {
   1559			if (!dir_emit(ctx, ".", 1, inode->i_ino, DT_DIR))
   1560				goto out;
   1561			ctx->pos = dotdot_offset;
   1562			continue;
   1563		}
   1564
   1565		if (ctx->pos == dotdot_offset) {
   1566			if (!dir_emit(ctx, "..", 2, parent_ino, DT_DIR))
   1567				goto out;
   1568			ctx->pos = dotdot_size;
   1569			continue;
   1570		}
   1571
   1572		de = (struct ext4_dir_entry_2 *)
   1573			(dir_buf + ctx->pos - extra_offset);
   1574		if (ext4_check_dir_entry(inode, file, de, iloc.bh, dir_buf,
   1575					 extra_size, ctx->pos))
   1576			goto out;
   1577		if (le32_to_cpu(de->inode)) {
   1578			if (!dir_emit(ctx, de->name, de->name_len,
   1579				      le32_to_cpu(de->inode),
   1580				      get_dtype(sb, de->file_type)))
   1581				goto out;
   1582		}
   1583		ctx->pos += ext4_rec_len_from_disk(de->rec_len, extra_size);
   1584	}
   1585out:
   1586	kfree(dir_buf);
   1587	brelse(iloc.bh);
   1588	return ret;
   1589}
   1590
   1591struct buffer_head *ext4_get_first_inline_block(struct inode *inode,
   1592					struct ext4_dir_entry_2 **parent_de,
   1593					int *retval)
   1594{
   1595	struct ext4_iloc iloc;
   1596
   1597	*retval = ext4_get_inode_loc(inode, &iloc);
   1598	if (*retval)
   1599		return NULL;
   1600
   1601	*parent_de = (struct ext4_dir_entry_2 *)ext4_raw_inode(&iloc)->i_block;
   1602
   1603	return iloc.bh;
   1604}
   1605
   1606/*
   1607 * Try to create the inline data for the new dir.
   1608 * If it succeeds, return 0, otherwise return the error.
   1609 * In case of ENOSPC, the caller should create the normal disk layout dir.
   1610 */
   1611int ext4_try_create_inline_dir(handle_t *handle, struct inode *parent,
   1612			       struct inode *inode)
   1613{
   1614	int ret, inline_size = EXT4_MIN_INLINE_DATA_SIZE;
   1615	struct ext4_iloc iloc;
   1616	struct ext4_dir_entry_2 *de;
   1617
   1618	ret = ext4_get_inode_loc(inode, &iloc);
   1619	if (ret)
   1620		return ret;
   1621
   1622	ret = ext4_prepare_inline_data(handle, inode, inline_size);
   1623	if (ret)
   1624		goto out;
   1625
   1626	/*
   1627	 * For inline dir, we only save the inode information for the ".."
   1628	 * and create a fake dentry to cover the left space.
   1629	 */
   1630	de = (struct ext4_dir_entry_2 *)ext4_raw_inode(&iloc)->i_block;
   1631	de->inode = cpu_to_le32(parent->i_ino);
   1632	de = (struct ext4_dir_entry_2 *)((void *)de + EXT4_INLINE_DOTDOT_SIZE);
   1633	de->inode = 0;
   1634	de->rec_len = ext4_rec_len_to_disk(
   1635				inline_size - EXT4_INLINE_DOTDOT_SIZE,
   1636				inline_size);
   1637	set_nlink(inode, 2);
   1638	inode->i_size = EXT4_I(inode)->i_disksize = inline_size;
   1639out:
   1640	brelse(iloc.bh);
   1641	return ret;
   1642}
   1643
   1644struct buffer_head *ext4_find_inline_entry(struct inode *dir,
   1645					struct ext4_filename *fname,
   1646					struct ext4_dir_entry_2 **res_dir,
   1647					int *has_inline_data)
   1648{
   1649	int ret;
   1650	struct ext4_iloc iloc;
   1651	void *inline_start;
   1652	int inline_size;
   1653
   1654	if (ext4_get_inode_loc(dir, &iloc))
   1655		return NULL;
   1656
   1657	down_read(&EXT4_I(dir)->xattr_sem);
   1658	if (!ext4_has_inline_data(dir)) {
   1659		*has_inline_data = 0;
   1660		goto out;
   1661	}
   1662
   1663	inline_start = (void *)ext4_raw_inode(&iloc)->i_block +
   1664						EXT4_INLINE_DOTDOT_SIZE;
   1665	inline_size = EXT4_MIN_INLINE_DATA_SIZE - EXT4_INLINE_DOTDOT_SIZE;
   1666	ret = ext4_search_dir(iloc.bh, inline_start, inline_size,
   1667			      dir, fname, 0, res_dir);
   1668	if (ret == 1)
   1669		goto out_find;
   1670	if (ret < 0)
   1671		goto out;
   1672
   1673	if (ext4_get_inline_size(dir) == EXT4_MIN_INLINE_DATA_SIZE)
   1674		goto out;
   1675
   1676	inline_start = ext4_get_inline_xattr_pos(dir, &iloc);
   1677	inline_size = ext4_get_inline_size(dir) - EXT4_MIN_INLINE_DATA_SIZE;
   1678
   1679	ret = ext4_search_dir(iloc.bh, inline_start, inline_size,
   1680			      dir, fname, 0, res_dir);
   1681	if (ret == 1)
   1682		goto out_find;
   1683
   1684out:
   1685	brelse(iloc.bh);
   1686	iloc.bh = NULL;
   1687out_find:
   1688	up_read(&EXT4_I(dir)->xattr_sem);
   1689	return iloc.bh;
   1690}
   1691
   1692int ext4_delete_inline_entry(handle_t *handle,
   1693			     struct inode *dir,
   1694			     struct ext4_dir_entry_2 *de_del,
   1695			     struct buffer_head *bh,
   1696			     int *has_inline_data)
   1697{
   1698	int err, inline_size, no_expand;
   1699	struct ext4_iloc iloc;
   1700	void *inline_start;
   1701
   1702	err = ext4_get_inode_loc(dir, &iloc);
   1703	if (err)
   1704		return err;
   1705
   1706	ext4_write_lock_xattr(dir, &no_expand);
   1707	if (!ext4_has_inline_data(dir)) {
   1708		*has_inline_data = 0;
   1709		goto out;
   1710	}
   1711
   1712	if ((void *)de_del - ((void *)ext4_raw_inode(&iloc)->i_block) <
   1713		EXT4_MIN_INLINE_DATA_SIZE) {
   1714		inline_start = (void *)ext4_raw_inode(&iloc)->i_block +
   1715					EXT4_INLINE_DOTDOT_SIZE;
   1716		inline_size = EXT4_MIN_INLINE_DATA_SIZE -
   1717				EXT4_INLINE_DOTDOT_SIZE;
   1718	} else {
   1719		inline_start = ext4_get_inline_xattr_pos(dir, &iloc);
   1720		inline_size = ext4_get_inline_size(dir) -
   1721				EXT4_MIN_INLINE_DATA_SIZE;
   1722	}
   1723
   1724	BUFFER_TRACE(bh, "get_write_access");
   1725	err = ext4_journal_get_write_access(handle, dir->i_sb, bh,
   1726					    EXT4_JTR_NONE);
   1727	if (err)
   1728		goto out;
   1729
   1730	err = ext4_generic_delete_entry(dir, de_del, bh,
   1731					inline_start, inline_size, 0);
   1732	if (err)
   1733		goto out;
   1734
   1735	ext4_show_inline_dir(dir, iloc.bh, inline_start, inline_size);
   1736out:
   1737	ext4_write_unlock_xattr(dir, &no_expand);
   1738	if (likely(err == 0))
   1739		err = ext4_mark_inode_dirty(handle, dir);
   1740	brelse(iloc.bh);
   1741	if (err != -ENOENT)
   1742		ext4_std_error(dir->i_sb, err);
   1743	return err;
   1744}
   1745
   1746/*
   1747 * Get the inline dentry at offset.
   1748 */
   1749static inline struct ext4_dir_entry_2 *
   1750ext4_get_inline_entry(struct inode *inode,
   1751		      struct ext4_iloc *iloc,
   1752		      unsigned int offset,
   1753		      void **inline_start,
   1754		      int *inline_size)
   1755{
   1756	void *inline_pos;
   1757
   1758	BUG_ON(offset > ext4_get_inline_size(inode));
   1759
   1760	if (offset < EXT4_MIN_INLINE_DATA_SIZE) {
   1761		inline_pos = (void *)ext4_raw_inode(iloc)->i_block;
   1762		*inline_size = EXT4_MIN_INLINE_DATA_SIZE;
   1763	} else {
   1764		inline_pos = ext4_get_inline_xattr_pos(inode, iloc);
   1765		offset -= EXT4_MIN_INLINE_DATA_SIZE;
   1766		*inline_size = ext4_get_inline_size(inode) -
   1767				EXT4_MIN_INLINE_DATA_SIZE;
   1768	}
   1769
   1770	if (inline_start)
   1771		*inline_start = inline_pos;
   1772	return (struct ext4_dir_entry_2 *)(inline_pos + offset);
   1773}
   1774
   1775bool empty_inline_dir(struct inode *dir, int *has_inline_data)
   1776{
   1777	int err, inline_size;
   1778	struct ext4_iloc iloc;
   1779	size_t inline_len;
   1780	void *inline_pos;
   1781	unsigned int offset;
   1782	struct ext4_dir_entry_2 *de;
   1783	bool ret = false;
   1784
   1785	err = ext4_get_inode_loc(dir, &iloc);
   1786	if (err) {
   1787		EXT4_ERROR_INODE_ERR(dir, -err,
   1788				     "error %d getting inode %lu block",
   1789				     err, dir->i_ino);
   1790		return false;
   1791	}
   1792
   1793	down_read(&EXT4_I(dir)->xattr_sem);
   1794	if (!ext4_has_inline_data(dir)) {
   1795		*has_inline_data = 0;
   1796		ret = true;
   1797		goto out;
   1798	}
   1799
   1800	de = (struct ext4_dir_entry_2 *)ext4_raw_inode(&iloc)->i_block;
   1801	if (!le32_to_cpu(de->inode)) {
   1802		ext4_warning(dir->i_sb,
   1803			     "bad inline directory (dir #%lu) - no `..'",
   1804			     dir->i_ino);
   1805		goto out;
   1806	}
   1807
   1808	inline_len = ext4_get_inline_size(dir);
   1809	offset = EXT4_INLINE_DOTDOT_SIZE;
   1810	while (offset < inline_len) {
   1811		de = ext4_get_inline_entry(dir, &iloc, offset,
   1812					   &inline_pos, &inline_size);
   1813		if (ext4_check_dir_entry(dir, NULL, de,
   1814					 iloc.bh, inline_pos,
   1815					 inline_size, offset)) {
   1816			ext4_warning(dir->i_sb,
   1817				     "bad inline directory (dir #%lu) - "
   1818				     "inode %u, rec_len %u, name_len %d"
   1819				     "inline size %d",
   1820				     dir->i_ino, le32_to_cpu(de->inode),
   1821				     le16_to_cpu(de->rec_len), de->name_len,
   1822				     inline_size);
   1823			goto out;
   1824		}
   1825		if (le32_to_cpu(de->inode)) {
   1826			goto out;
   1827		}
   1828		offset += ext4_rec_len_from_disk(de->rec_len, inline_size);
   1829	}
   1830
   1831	ret = true;
   1832out:
   1833	up_read(&EXT4_I(dir)->xattr_sem);
   1834	brelse(iloc.bh);
   1835	return ret;
   1836}
   1837
   1838int ext4_destroy_inline_data(handle_t *handle, struct inode *inode)
   1839{
   1840	int ret, no_expand;
   1841
   1842	ext4_write_lock_xattr(inode, &no_expand);
   1843	ret = ext4_destroy_inline_data_nolock(handle, inode);
   1844	ext4_write_unlock_xattr(inode, &no_expand);
   1845
   1846	return ret;
   1847}
   1848
   1849int ext4_inline_data_iomap(struct inode *inode, struct iomap *iomap)
   1850{
   1851	__u64 addr;
   1852	int error = -EAGAIN;
   1853	struct ext4_iloc iloc;
   1854
   1855	down_read(&EXT4_I(inode)->xattr_sem);
   1856	if (!ext4_has_inline_data(inode))
   1857		goto out;
   1858
   1859	error = ext4_get_inode_loc(inode, &iloc);
   1860	if (error)
   1861		goto out;
   1862
   1863	addr = (__u64)iloc.bh->b_blocknr << inode->i_sb->s_blocksize_bits;
   1864	addr += (char *)ext4_raw_inode(&iloc) - iloc.bh->b_data;
   1865	addr += offsetof(struct ext4_inode, i_block);
   1866
   1867	brelse(iloc.bh);
   1868
   1869	iomap->addr = addr;
   1870	iomap->offset = 0;
   1871	iomap->length = min_t(loff_t, ext4_get_inline_size(inode),
   1872			      i_size_read(inode));
   1873	iomap->type = IOMAP_INLINE;
   1874	iomap->flags = 0;
   1875
   1876out:
   1877	up_read(&EXT4_I(inode)->xattr_sem);
   1878	return error;
   1879}
   1880
   1881int ext4_inline_data_truncate(struct inode *inode, int *has_inline)
   1882{
   1883	handle_t *handle;
   1884	int inline_size, value_len, needed_blocks, no_expand, err = 0;
   1885	size_t i_size;
   1886	void *value = NULL;
   1887	struct ext4_xattr_ibody_find is = {
   1888		.s = { .not_found = -ENODATA, },
   1889	};
   1890	struct ext4_xattr_info i = {
   1891		.name_index = EXT4_XATTR_INDEX_SYSTEM,
   1892		.name = EXT4_XATTR_SYSTEM_DATA,
   1893	};
   1894
   1895
   1896	needed_blocks = ext4_writepage_trans_blocks(inode);
   1897	handle = ext4_journal_start(inode, EXT4_HT_INODE, needed_blocks);
   1898	if (IS_ERR(handle))
   1899		return PTR_ERR(handle);
   1900
   1901	ext4_write_lock_xattr(inode, &no_expand);
   1902	if (!ext4_has_inline_data(inode)) {
   1903		ext4_write_unlock_xattr(inode, &no_expand);
   1904		*has_inline = 0;
   1905		ext4_journal_stop(handle);
   1906		return 0;
   1907	}
   1908
   1909	if ((err = ext4_orphan_add(handle, inode)) != 0)
   1910		goto out;
   1911
   1912	if ((err = ext4_get_inode_loc(inode, &is.iloc)) != 0)
   1913		goto out;
   1914
   1915	down_write(&EXT4_I(inode)->i_data_sem);
   1916	i_size = inode->i_size;
   1917	inline_size = ext4_get_inline_size(inode);
   1918	EXT4_I(inode)->i_disksize = i_size;
   1919
   1920	if (i_size < inline_size) {
   1921		/*
   1922		 * if there's inline data to truncate and this file was
   1923		 * converted to extents after that inline data was written,
   1924		 * the extent status cache must be cleared to avoid leaving
   1925		 * behind stale delayed allocated extent entries
   1926		 */
   1927		if (!ext4_test_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA)) {
   1928retry:
   1929			err = ext4_es_remove_extent(inode, 0, EXT_MAX_BLOCKS);
   1930			if (err == -ENOMEM) {
   1931				memalloc_retry_wait(GFP_ATOMIC);
   1932				goto retry;
   1933			}
   1934			if (err)
   1935				goto out_error;
   1936		}
   1937
   1938		/* Clear the content in the xattr space. */
   1939		if (inline_size > EXT4_MIN_INLINE_DATA_SIZE) {
   1940			if ((err = ext4_xattr_ibody_find(inode, &i, &is)) != 0)
   1941				goto out_error;
   1942
   1943			BUG_ON(is.s.not_found);
   1944
   1945			value_len = le32_to_cpu(is.s.here->e_value_size);
   1946			value = kmalloc(value_len, GFP_NOFS);
   1947			if (!value) {
   1948				err = -ENOMEM;
   1949				goto out_error;
   1950			}
   1951
   1952			err = ext4_xattr_ibody_get(inode, i.name_index,
   1953						   i.name, value, value_len);
   1954			if (err <= 0)
   1955				goto out_error;
   1956
   1957			i.value = value;
   1958			i.value_len = i_size > EXT4_MIN_INLINE_DATA_SIZE ?
   1959					i_size - EXT4_MIN_INLINE_DATA_SIZE : 0;
   1960			err = ext4_xattr_ibody_set(handle, inode, &i, &is);
   1961			if (err)
   1962				goto out_error;
   1963		}
   1964
   1965		/* Clear the content within i_blocks. */
   1966		if (i_size < EXT4_MIN_INLINE_DATA_SIZE) {
   1967			void *p = (void *) ext4_raw_inode(&is.iloc)->i_block;
   1968			memset(p + i_size, 0,
   1969			       EXT4_MIN_INLINE_DATA_SIZE - i_size);
   1970		}
   1971
   1972		EXT4_I(inode)->i_inline_size = i_size <
   1973					EXT4_MIN_INLINE_DATA_SIZE ?
   1974					EXT4_MIN_INLINE_DATA_SIZE : i_size;
   1975	}
   1976
   1977out_error:
   1978	up_write(&EXT4_I(inode)->i_data_sem);
   1979out:
   1980	brelse(is.iloc.bh);
   1981	ext4_write_unlock_xattr(inode, &no_expand);
   1982	kfree(value);
   1983	if (inode->i_nlink)
   1984		ext4_orphan_del(handle, inode);
   1985
   1986	if (err == 0) {
   1987		inode->i_mtime = inode->i_ctime = current_time(inode);
   1988		err = ext4_mark_inode_dirty(handle, inode);
   1989		if (IS_SYNC(inode))
   1990			ext4_handle_sync(handle);
   1991	}
   1992	ext4_journal_stop(handle);
   1993	return err;
   1994}
   1995
   1996int ext4_convert_inline_data(struct inode *inode)
   1997{
   1998	int error, needed_blocks, no_expand;
   1999	handle_t *handle;
   2000	struct ext4_iloc iloc;
   2001
   2002	if (!ext4_has_inline_data(inode)) {
   2003		ext4_clear_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA);
   2004		return 0;
   2005	} else if (!ext4_test_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA)) {
   2006		/*
   2007		 * Inode has inline data but EXT4_STATE_MAY_INLINE_DATA is
   2008		 * cleared. This means we are in the middle of moving of
   2009		 * inline data to delay allocated block. Just force writeout
   2010		 * here to finish conversion.
   2011		 */
   2012		error = filemap_flush(inode->i_mapping);
   2013		if (error)
   2014			return error;
   2015		if (!ext4_has_inline_data(inode))
   2016			return 0;
   2017	}
   2018
   2019	needed_blocks = ext4_writepage_trans_blocks(inode);
   2020
   2021	iloc.bh = NULL;
   2022	error = ext4_get_inode_loc(inode, &iloc);
   2023	if (error)
   2024		return error;
   2025
   2026	handle = ext4_journal_start(inode, EXT4_HT_WRITE_PAGE, needed_blocks);
   2027	if (IS_ERR(handle)) {
   2028		error = PTR_ERR(handle);
   2029		goto out_free;
   2030	}
   2031
   2032	ext4_write_lock_xattr(inode, &no_expand);
   2033	if (ext4_has_inline_data(inode))
   2034		error = ext4_convert_inline_data_nolock(handle, inode, &iloc);
   2035	ext4_write_unlock_xattr(inode, &no_expand);
   2036	ext4_journal_stop(handle);
   2037out_free:
   2038	brelse(iloc.bh);
   2039	return error;
   2040}