+
+ sector = blocks[block_idx + i] << sector_bits;
+
+ /* Additional contiguous file blocks? */
+ while (i + nblocks < blocks_per_page &&
+ (sector + nblocks*(blocksize>>9)) ==
+ (blocks[block_idx + i + nblocks] << sector_bits))
+ nblocks++;
+
+ if (bio != NULL &&
+ can_be_merged(bio, sector) &&
+ bio_add_page(bio, page,
+ blocksize * nblocks, page_offset) != 0)
+ continue; /* added this frag OK */
+
+ if (bio != NULL) {
+ request_queue_t *q = bdev_get_queue(bio->bi_bdev);
+
+ /* Dang! I have to fragment this I/O */
+ CDEBUG(D_INODE, "bio++ sz %d vcnt %d(%d) "
+ "sectors %d(%d) psg %d(%d) hsg %d(%d)\n",
+ bio->bi_size,
+ bio->bi_vcnt, bio->bi_max_vecs,
+ bio->bi_size >> 9, q->max_sectors,
+ bio_phys_segments(q, bio),
+ q->max_phys_segments,
+ bio_hw_segments(q, bio),
+ q->max_hw_segments);
+
+ atomic_inc(&dreq->dr_numreqs);
+ rc = fsfilt_send_bio(rw, obd, inode, bio);
+ if (rc < 0) {
+ CERROR("Can't send bio: %d\n", rc);
+ /* OK do dec; we do the waiting */
+ atomic_dec(&dreq->dr_numreqs);
+ goto out;
+ }
+ rc = 0;
+
+ bio = NULL;
+ }
+