+
+ blocks = pages * (CFS_PAGE_SIZE >> osd_sb(d)->s_blocksize_bits);
+ if (iobuf->dr_bl_buf.lb_len >= blocks * sizeof(iobuf->dr_blocks[0])) {
+ LASSERT(iobuf->dr_pg_buf.lb_len >=
+ pages * sizeof(iobuf->dr_pages[0]));
+ return 0;
+ }
+
+ /* start with 1MB for 4K blocks */
+ i = 256;
+ while (i <= PTLRPC_MAX_BRW_PAGES && i < pages)
+ i <<= 1;
+
+ CDEBUG(D_OTHER, "realloc %u for %u (%u) pages\n",
+ (unsigned)(pages * sizeof(iobuf->dr_pages[0])), i, pages);
+ pages = i;
+ blocks = pages * (CFS_PAGE_SIZE >> osd_sb(d)->s_blocksize_bits);
+ iobuf->dr_max_pages = 0;
+ CDEBUG(D_OTHER, "realloc %u for %u blocks\n",
+ (unsigned)(blocks * sizeof(iobuf->dr_blocks[0])), blocks);
+
+ lu_buf_realloc(&iobuf->dr_bl_buf, blocks * sizeof(iobuf->dr_blocks[0]));
+ iobuf->dr_blocks = iobuf->dr_bl_buf.lb_buf;
+ if (unlikely(iobuf->dr_blocks == NULL))
+ return -ENOMEM;
+
+ lu_buf_realloc(&iobuf->dr_pg_buf, pages * sizeof(iobuf->dr_pages[0]));
+ iobuf->dr_pages = iobuf->dr_pg_buf.lb_buf;
+ if (unlikely(iobuf->dr_pages == NULL))
+ return -ENOMEM;
+
+ iobuf->dr_max_pages = pages;
+
+ return 0;