|
@@ -43,6 +43,17 @@ enum { BIO_MAX_PAGES_KMALLOC =
|
|
|
PAGE_SIZE / sizeof(struct page *),
|
|
|
};
|
|
|
|
|
|
+unsigned exofs_max_io_pages(struct exofs_layout *layout,
|
|
|
+ unsigned expected_pages)
|
|
|
+{
|
|
|
+ unsigned pages = min_t(unsigned, expected_pages, MAX_PAGES_KMALLOC);
|
|
|
+
|
|
|
+ /* TODO: easily support bio chaining */
|
|
|
+ pages = min_t(unsigned, pages,
|
|
|
+ layout->group_width * BIO_MAX_PAGES_KMALLOC);
|
|
|
+ return pages;
|
|
|
+}
|
|
|
+
|
|
|
struct page_collect {
|
|
|
struct exofs_sb_info *sbi;
|
|
|
struct inode *inode;
|
|
@@ -97,8 +108,7 @@ static void _pcol_reset(struct page_collect *pcol)
|
|
|
|
|
|
static int pcol_try_alloc(struct page_collect *pcol)
|
|
|
{
|
|
|
- unsigned pages = min_t(unsigned, pcol->expected_pages,
|
|
|
- MAX_PAGES_KMALLOC);
|
|
|
+ unsigned pages;
|
|
|
|
|
|
if (!pcol->ios) { /* First time allocate io_state */
|
|
|
int ret = exofs_get_io_state(&pcol->sbi->layout, &pcol->ios);
|
|
@@ -108,8 +118,7 @@ static int pcol_try_alloc(struct page_collect *pcol)
|
|
|
}
|
|
|
|
|
|
/* TODO: easily support bio chaining */
|
|
|
- pages = min_t(unsigned, pages,
|
|
|
- pcol->sbi->layout.group_width * BIO_MAX_PAGES_KMALLOC);
|
|
|
+ pages = exofs_max_io_pages(&pcol->sbi->layout, pcol->expected_pages);
|
|
|
|
|
|
for (; pages; pages >>= 1) {
|
|
|
pcol->pages = kmalloc(pages * sizeof(struct page *),
|
|
@@ -1049,6 +1058,7 @@ struct inode *exofs_iget(struct super_block *sb, unsigned long ino)
|
|
|
memcpy(oi->i_data, fcb.i_data, sizeof(fcb.i_data));
|
|
|
}
|
|
|
|
|
|
+ inode->i_mapping->backing_dev_info = sb->s_bdi;
|
|
|
if (S_ISREG(inode->i_mode)) {
|
|
|
inode->i_op = &exofs_file_inode_operations;
|
|
|
inode->i_fop = &exofs_file_operations;
|
|
@@ -1149,6 +1159,7 @@ struct inode *exofs_new_inode(struct inode *dir, int mode)
|
|
|
|
|
|
sbi = sb->s_fs_info;
|
|
|
|
|
|
+ inode->i_mapping->backing_dev_info = sb->s_bdi;
|
|
|
sb->s_dirt = 1;
|
|
|
inode_init_owner(inode, dir, mode);
|
|
|
inode->i_ino = sbi->s_nextid++;
|