Whamcloud - gitweb
LU-5873 ldiskfs: osd_do_bio()) ASSERTION( iobuf->dr_rw == 0 ) failed
[fs/lustre-release.git] / lustre / osd-ldiskfs / osd_io.c
index d731d4a..e2e08e3 100644 (file)
@@ -790,10 +790,17 @@ static int osd_ldiskfs_map_bm_inode_pages(struct inode *inode,
                                          unsigned long *blocks, int create)
 {
        int blocks_per_page = PAGE_CACHE_SIZE >> inode->i_blkbits;
+       pgoff_t bitmap_max_page_index;
        unsigned long *b;
        int rc = 0, i;
 
+       bitmap_max_page_index = LDISKFS_SB(inode->i_sb)->s_bitmap_maxbytes >>
+                               PAGE_SHIFT;
        for (i = 0, b = blocks; i < pages; i++, page++) {
+               if ((*page)->index + 1 >= bitmap_max_page_index) {
+                       rc = -EFBIG;
+                       break;
+               }
                rc = ldiskfs_map_inode_page(inode, *page, b, create);
                if (rc) {
                        CERROR("ino %lu, blk %lu create %d: rc %d\n",
@@ -814,6 +821,9 @@ static int osd_ldiskfs_map_ext_inode_pages(struct inode *inode,
        int rc = 0, i = 0;
        struct page *fp = NULL;
        int clen = 0;
+       pgoff_t extent_max_page_index;
+
+       extent_max_page_index = inode->i_sb->s_maxbytes >> PAGE_SHIFT;
 
        CDEBUG(D_OTHER, "inode %lu: map %d pages from %lu\n",
                inode->i_ino, pages, (*page)->index);
@@ -835,6 +845,9 @@ static int osd_ldiskfs_map_ext_inode_pages(struct inode *inode,
                        continue;
                }
 
+               if (fp->index + i >= extent_max_page_index)
+                       GOTO(cleanup, rc = -EFBIG);
+
                /* process found extent */
                rc = osd_ldiskfs_map_nblocks(inode, fp->index * blocks_per_page,
                                             clen * blocks_per_page, blocks,
@@ -879,6 +892,9 @@ static int osd_ldiskfs_map_inode_pages(struct inode *inode, struct page **page,
        int rc = 0, i = 0;
        struct page *fp = NULL;
        int clen = 0;
+       pgoff_t max_page_index;
+
+       max_page_index = inode->i_sb->s_maxbytes >> PAGE_SHIFT;
 
        CDEBUG(D_OTHER, "inode %lu: map %d pages from %lu\n",
                inode->i_ino, pages, (*page)->index);
@@ -902,6 +918,8 @@ static int osd_ldiskfs_map_inode_pages(struct inode *inode, struct page **page,
                        if (++i != pages)
                                continue;
                }
+               if (fp->index + i >= max_page_index)
+                       GOTO(cleanup, rc = -EFBIG);
                /* process found extent */
                map.m_lblk = fp->index * blocks_per_page;
                map.m_len = blen = clen * blocks_per_page;