diff options
| -rw-r--r-- | fs/ext4/extents.c | 2 | ||||
| -rw-r--r-- | fs/ext4/inline.c | 26 | ||||
| -rw-r--r-- | fs/ext4/inode.c | 11 | ||||
| -rw-r--r-- | fs/ext4/ioctl.c | 6 | ||||
| -rw-r--r-- | fs/ext4/namei.c | 5 | 
5 files changed, 22 insertions, 28 deletions
| diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index 3384dc4bed40..10cff4736b11 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c @@ -3477,7 +3477,7 @@ static int ext4_ext_convert_to_initialized(handle_t *handle,  	WARN_ON(map->m_lblk < ee_block);  	/*  	 * It is safe to convert extent to initialized via explicit -	 * zeroout only if extent is fully insde i_size or new_size. +	 * zeroout only if extent is fully inside i_size or new_size.  	 */  	split_flag |= ee_block + ee_len <= eof_block ? EXT4_EXT_MAY_ZEROOUT : 0; diff --git a/fs/ext4/inline.c b/fs/ext4/inline.c index bae987549dc3..82edf5b93352 100644 --- a/fs/ext4/inline.c +++ b/fs/ext4/inline.c @@ -849,15 +849,16 @@ int ext4_da_write_inline_data_begin(struct address_space *mapping,  	handle_t *handle;  	struct page *page;  	struct ext4_iloc iloc; +	int retries;  	ret = ext4_get_inode_loc(inode, &iloc);  	if (ret)  		return ret; +retry_journal:  	handle = ext4_journal_start(inode, EXT4_HT_INODE, 1);  	if (IS_ERR(handle)) {  		ret = PTR_ERR(handle); -		handle = NULL;  		goto out;  	} @@ -867,7 +868,7 @@ int ext4_da_write_inline_data_begin(struct address_space *mapping,  	if (inline_size >= pos + len) {  		ret = ext4_prepare_inline_data(handle, inode, pos + len);  		if (ret && ret != -ENOSPC) -			goto out; +			goto out_journal;  	}  	if (ret == -ENOSPC) { @@ -875,6 +876,10 @@ int ext4_da_write_inline_data_begin(struct address_space *mapping,  							    inode,  							    flags,  							    fsdata); +		ext4_journal_stop(handle); +		if (ret == -ENOSPC && +		    ext4_should_retry_alloc(inode->i_sb, &retries)) +			goto retry_journal;  		goto out;  	} @@ -887,7 +892,7 @@ int ext4_da_write_inline_data_begin(struct address_space *mapping,  	page = grab_cache_page_write_begin(mapping, 0, flags);  	if (!page) {  		ret = -ENOMEM; -		goto out; +		goto out_journal;  	}  	down_read(&EXT4_I(inode)->xattr_sem); @@ -904,16 +909,15 @@ int ext4_da_write_inline_data_begin(struct address_space *mapping,  	up_read(&EXT4_I(inode)->xattr_sem);  	*pagep = page; -	handle = NULL;  	brelse(iloc.bh);  	return 1;  out_release_page:  	up_read(&EXT4_I(inode)->xattr_sem);  	unlock_page(page);  	page_cache_release(page); +out_journal: +	ext4_journal_stop(handle);  out: -	if (handle) -		ext4_journal_stop(handle);  	brelse(iloc.bh);  	return ret;  } @@ -1837,7 +1841,6 @@ int ext4_try_to_evict_inline_data(handle_t *handle,  {  	int error;  	struct ext4_xattr_entry *entry; -	struct ext4_xattr_ibody_header *header;  	struct ext4_inode *raw_inode;  	struct ext4_iloc iloc; @@ -1846,7 +1849,6 @@ int ext4_try_to_evict_inline_data(handle_t *handle,  		return error;  	raw_inode = ext4_raw_inode(&iloc); -	header = IHDR(inode, raw_inode);  	entry = (struct ext4_xattr_entry *)((void *)raw_inode +  					    EXT4_I(inode)->i_inline_off);  	if (EXT4_XATTR_LEN(entry->e_name_len) + @@ -1924,9 +1926,11 @@ void ext4_inline_data_truncate(struct inode *inode, int *has_inline)  		}  		/* Clear the content within i_blocks. */ -		if (i_size < EXT4_MIN_INLINE_DATA_SIZE) -			memset(ext4_raw_inode(&is.iloc)->i_block + i_size, 0, -					EXT4_MIN_INLINE_DATA_SIZE - i_size); +		if (i_size < EXT4_MIN_INLINE_DATA_SIZE) { +			void *p = (void *) ext4_raw_inode(&is.iloc)->i_block; +			memset(p + i_size, 0, +			       EXT4_MIN_INLINE_DATA_SIZE - i_size); +		}  		EXT4_I(inode)->i_inline_size = i_size <  					EXT4_MIN_INLINE_DATA_SIZE ? diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index fe4793e754d1..6e39895a91b8 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -144,8 +144,8 @@ static int ext4_meta_trans_blocks(struct inode *inode, int lblocks,   */  static int ext4_inode_is_fast_symlink(struct inode *inode)  { -	int ea_blocks = EXT4_I(inode)->i_file_acl ? -		(inode->i_sb->s_blocksize >> 9) : 0; +        int ea_blocks = EXT4_I(inode)->i_file_acl ? +		EXT4_CLUSTER_SIZE(inode->i_sb) >> 9 : 0;  	return (S_ISLNK(inode->i_mode) && inode->i_blocks - ea_blocks == 0);  } @@ -1772,7 +1772,7 @@ static int __ext4_journalled_writepage(struct page *page,  		ret = err;  	if (!ext4_has_inline_data(inode)) -		ext4_walk_page_buffers(handle, page_bufs, 0, len, +		ext4_walk_page_buffers(NULL, page_bufs, 0, len,  				       NULL, bput_one);  	ext4_set_inode_state(inode, EXT4_STATE_JDATA);  out: @@ -3501,11 +3501,6 @@ int ext4_punch_hole(struct inode *inode, loff_t offset, loff_t length)  	if (!S_ISREG(inode->i_mode))  		return -EOPNOTSUPP; -	if (EXT4_SB(sb)->s_cluster_ratio > 1) { -		/* TODO: Add support for bigalloc file systems */ -		return -EOPNOTSUPP; -	} -  	trace_ext4_punch_hole(inode, offset, length);  	/* diff --git a/fs/ext4/ioctl.c b/fs/ext4/ioctl.c index 60589b60e9b0..6bea80614d77 100644 --- a/fs/ext4/ioctl.c +++ b/fs/ext4/ioctl.c @@ -101,9 +101,8 @@ static long swap_inode_boot_loader(struct super_block *sb,  	handle_t *handle;  	int err;  	struct inode *inode_bl; -	struct ext4_inode_info *ei;  	struct ext4_inode_info *ei_bl; -	struct ext4_sb_info *sbi; +	struct ext4_sb_info *sbi = EXT4_SB(sb);  	if (inode->i_nlink != 1 || !S_ISREG(inode->i_mode)) {  		err = -EINVAL; @@ -115,9 +114,6 @@ static long swap_inode_boot_loader(struct super_block *sb,  		goto swap_boot_out;  	} -	sbi = EXT4_SB(sb); -	ei = EXT4_I(inode); -  	inode_bl = ext4_iget(sb, EXT4_BOOT_LOADER_INO);  	if (IS_ERR(inode_bl)) {  		err = PTR_ERR(inode_bl); diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c index e77c1ba6c8af..d050e043e884 100644 --- a/fs/ext4/namei.c +++ b/fs/ext4/namei.c @@ -1425,9 +1425,8 @@ static struct dentry *ext4_lookup(struct inode *dir, struct dentry *dentry, unsi  			return ERR_PTR(-EIO);  		}  		if (unlikely(ino == dir->i_ino)) { -			EXT4_ERROR_INODE(dir, "'%.*s' linked to parent dir", -					 dentry->d_name.len, -					 dentry->d_name.name); +			EXT4_ERROR_INODE(dir, "'%pd' linked to parent dir", +					 dentry);  			return ERR_PTR(-EIO);  		}  		inode = ext4_iget(dir->i_sb, ino); | 
