diff options
Diffstat (limited to 'fs/ext4/inode.c')
| -rw-r--r-- | fs/ext4/inode.c | 31 | 
1 files changed, 30 insertions, 1 deletions
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index e23f114e2cf..1668abf8054 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -649,6 +649,9 @@ static int _ext4_get_block(struct inode *inode, sector_t iblock,  	int ret = 0, started = 0;  	int dio_credits; +	if (ext4_has_inline_data(inode)) +		return -ERANGE; +  	map.m_lblk = iblock;  	map.m_len = bh->b_size >> inode->i_blkbits; @@ -2687,6 +2690,12 @@ static sector_t ext4_bmap(struct address_space *mapping, sector_t block)  	journal_t *journal;  	int err; +	/* +	 * We can get here for an inline file via the FIBMAP ioctl +	 */ +	if (ext4_has_inline_data(inode)) +		return 0; +  	if (mapping_tagged(mapping, PAGECACHE_TAG_DIRTY) &&  			test_opt(inode->i_sb, DELALLOC)) {  		/* @@ -2732,14 +2741,30 @@ static sector_t ext4_bmap(struct address_space *mapping, sector_t block)  static int ext4_readpage(struct file *file, struct page *page)  { +	int ret = -EAGAIN; +	struct inode *inode = page->mapping->host; +  	trace_ext4_readpage(page); -	return mpage_readpage(page, ext4_get_block); + +	if (ext4_has_inline_data(inode)) +		ret = ext4_readpage_inline(inode, page); + +	if (ret == -EAGAIN) +		return mpage_readpage(page, ext4_get_block); + +	return ret;  }  static int  ext4_readpages(struct file *file, struct address_space *mapping,  		struct list_head *pages, unsigned nr_pages)  { +	struct inode *inode = mapping->host; + +	/* If the file has inline data, no need to do readpages. */ +	if (ext4_has_inline_data(inode)) +		return 0; +  	return mpage_readpages(mapping, pages, nr_pages, ext4_get_block);  } @@ -3078,6 +3103,10 @@ static ssize_t ext4_direct_IO(int rw, struct kiocb *iocb,  	if (ext4_should_journal_data(inode))  		return 0; +	/* Let buffer I/O handle the inline data case. */ +	if (ext4_has_inline_data(inode)) +		return 0; +  	trace_ext4_direct_IO_enter(inode, offset, iov_length(iov, nr_segs), rw);  	if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))  		ret = ext4_ext_direct_IO(rw, iocb, iov, offset, nr_segs);  |