struct page *page = bvec->bv_page;
                enum count_type type = WB_DATA_TYPE(page);
 
+               if (IS_DUMMY_WRITTEN_PAGE(page)) {
+                       set_page_private(page, (unsigned long)NULL);
+                       ClearPagePrivate(page);
+                       unlock_page(page);
+                       mempool_free(page, sbi->write_io_dummy);
+
+                       if (unlikely(bio->bi_error))
+                               f2fs_stop_checkpoint(sbi, true);
+                       continue;
+               }
+
                fscrypt_pullback_bio_page(&page, true);
 
                if (unlikely(bio->bi_error)) {
                                struct bio *bio, enum page_type type)
 {
        if (!is_read_io(bio_op(bio))) {
+               unsigned int start;
+
                if (f2fs_sb_mounted_blkzoned(sbi->sb) &&
                        current->plug && (type == DATA || type == NODE))
                        blk_finish_plug(current->plug);
+
+               if (type != DATA && type != NODE)
+                       goto submit_io;
+
+               start = bio->bi_iter.bi_size >> F2FS_BLKSIZE_BITS;
+               start %= F2FS_IO_SIZE(sbi);
+
+               if (start == 0)
+                       goto submit_io;
+
+               /* fill dummy pages */
+               for (; start < F2FS_IO_SIZE(sbi); start++) {
+                       struct page *page =
+                               mempool_alloc(sbi->write_io_dummy,
+                                       GFP_NOIO | __GFP_ZERO | __GFP_NOFAIL);
+                       f2fs_bug_on(sbi, !page);
+
+                       SetPagePrivate(page);
+                       set_page_private(page, (unsigned long)DUMMY_WRITTEN_PAGE);
+                       lock_page(page);
+                       if (bio_add_page(bio, page, PAGE_SIZE, 0) < PAGE_SIZE)
+                               f2fs_bug_on(sbi, 1);
+               }
+               /*
+                * In the NODE case, we lose next block address chain. So, we
+                * need to do checkpoint in f2fs_sync_file.
+                */
+               if (type == NODE)
+                       set_sbi_flag(sbi, SBI_NEED_CP);
        }
+submit_io:
        if (is_read_io(bio_op(bio)))
                trace_f2fs_submit_read_bio(sbi->sb, type, bio);
        else
        return 0;
 }
 
-void f2fs_submit_page_mbio(struct f2fs_io_info *fio)
+int f2fs_submit_page_mbio(struct f2fs_io_info *fio)
 {
        struct f2fs_sb_info *sbi = fio->sbi;
        enum page_type btype = PAGE_TYPE_OF_BIO(fio->type);
        struct f2fs_bio_info *io;
        bool is_read = is_read_io(fio->op);
        struct page *bio_page;
+       int err = 0;
 
        io = is_read ? &sbi->read_io : &sbi->write_io[btype];
 
                __submit_merged_bio(io);
 alloc_new:
        if (io->bio == NULL) {
+               if ((fio->type == DATA || fio->type == NODE) &&
+                               fio->new_blkaddr & F2FS_IO_SIZE_MASK(sbi)) {
+                       err = -EAGAIN;
+                       dec_page_count(sbi, WB_DATA_TYPE(bio_page));
+                       goto out_fail;
+               }
                io->bio = __bio_alloc(sbi, fio->new_blkaddr,
                                                BIO_MAX_PAGES, is_read);
                io->fio = *fio;
 
        io->last_block_in_bio = fio->new_blkaddr;
        f2fs_trace_ios(fio, 0);
-
+out_fail:
        up_write(&io->io_rwsem);
        trace_f2fs_submit_page_mbio(fio->page, fio);
+       return err;
 }
 
 static void __set_data_blkaddr(struct dnode_of_data *dn)
 
        struct f2fs_bio_info read_io;                   /* for read bios */
        struct f2fs_bio_info write_io[NR_PAGE_TYPE];    /* for write bios */
        struct mutex wio_mutex[NODE + 1];       /* bio ordering for NODE/DATA */
+       int write_io_size_bits;                 /* Write IO size bits */
+       mempool_t *write_io_dummy;              /* Dummy pages */
 
        /* for checkpoint */
        struct f2fs_checkpoint *ckpt;           /* raw checkpoint pointer */
                                struct page *, nid_t, enum page_type, int);
 void f2fs_flush_merged_bios(struct f2fs_sb_info *);
 int f2fs_submit_page_bio(struct f2fs_io_info *);
-void f2fs_submit_page_mbio(struct f2fs_io_info *);
+int f2fs_submit_page_mbio(struct f2fs_io_info *);
 struct block_device *f2fs_target_device(struct f2fs_sb_info *,
                                block_t, struct bio *);
 int f2fs_target_device_index(struct f2fs_sb_info *, block_t);
 
 static void do_write_page(struct f2fs_summary *sum, struct f2fs_io_info *fio)
 {
        int type = __get_segment_type(fio->page, fio->type);
+       int err;
 
        if (fio->type == NODE || fio->type == DATA)
                mutex_lock(&fio->sbi->wio_mutex[fio->type]);
-
+reallocate:
        allocate_data_block(fio->sbi, fio->page, fio->old_blkaddr,
                                        &fio->new_blkaddr, sum, type);
 
        /* writeout dirty page into bdev */
-       f2fs_submit_page_mbio(fio);
+       err = f2fs_submit_page_mbio(fio);
+       if (err == -EAGAIN) {
+               fio->old_blkaddr = fio->new_blkaddr;
+               goto reallocate;
+       }
 
        if (fio->type == NODE || fio->type == DATA)
                mutex_unlock(&fio->sbi->wio_mutex[fio->type]);
 
  * the page is atomically written, and it is in inmem_pages list.
  */
 #define ATOMIC_WRITTEN_PAGE            ((unsigned long)-1)
+#define DUMMY_WRITTEN_PAGE             ((unsigned long)-2)
 
 #define IS_ATOMIC_WRITTEN_PAGE(page)                   \
                (page_private(page) == (unsigned long)ATOMIC_WRITTEN_PAGE)
+#define IS_DUMMY_WRITTEN_PAGE(page)                    \
+               (page_private(page) == (unsigned long)DUMMY_WRITTEN_PAGE)
 
 struct inmem_pages {
        struct list_head list;
 
                                FDEV(i).total_segments,
                                FDEV(i).start_blk, FDEV(i).end_blk);
        }
+       f2fs_msg(sbi->sb, KERN_INFO,
+                       "IO Block Size: %8d KB", F2FS_IO_SIZE_KB(sbi));
        return 0;
 }
 
        if (err)
                goto free_options;
 
+       if (F2FS_IO_SIZE(sbi) > 1) {
+               sbi->write_io_dummy =
+                       mempool_create_page_pool(F2FS_IO_SIZE(sbi) - 1, 0);
+               if (!sbi->write_io_dummy)
+                       goto free_options;
+       }
+
        /* get an inode for meta space */
        sbi->meta_inode = f2fs_iget(sb, F2FS_META_INO(sbi));
        if (IS_ERR(sbi->meta_inode)) {
                f2fs_msg(sb, KERN_ERR, "Failed to read F2FS meta data inode");
                err = PTR_ERR(sbi->meta_inode);
-               goto free_options;
+               goto free_io_dummy;
        }
 
        err = get_valid_checkpoint(sbi);
 free_meta_inode:
        make_bad_inode(sbi->meta_inode);
        iput(sbi->meta_inode);
+free_io_dummy:
+       mempool_destroy(sbi->write_io_dummy);
 free_options:
        destroy_percpu_info(sbi);
        kfree(options);
 
 #define F2FS_NODE_INO(sbi)     (sbi->node_ino_num)
 #define F2FS_META_INO(sbi)     (sbi->meta_ino_num)
 
+#define F2FS_IO_SIZE(sbi)      (1 << (sbi)->write_io_size_bits) /* Blocks */
+#define F2FS_IO_SIZE_KB(sbi)   (1 << ((sbi)->write_io_size_bits + 2)) /* KB */
+#define F2FS_IO_SIZE_BYTES(sbi)        (1 << ((sbi)->write_io_size_bits + 12)) /* B */
+#define F2FS_IO_SIZE_BITS(sbi) ((sbi)->write_io_size_bits) /* power of 2 */
+#define F2FS_IO_SIZE_MASK(sbi) (F2FS_IO_SIZE(sbi) - 1)
+
 /* This flag is used by node and meta inodes, and by recovery */
 #define GFP_F2FS_ZERO          (GFP_NOFS | __GFP_ZERO)
 #define GFP_F2FS_HIGH_ZERO     (GFP_NOFS | __GFP_ZERO | __GFP_HIGHMEM)