|
@@ -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);
|