static int mem_block_no_elevator_request_fn(request_queue_t* q,struct bio* bio) { int status = 0,i = 0; struct bio_vec* bvec = NULL; bio_for_each_segment(bvec,bio,i) { char* buffer = __bio_kmap_atomic(bio,i,KM_USER0); switch(bio_data_dir(bio)) { case WRITE: { memcpy(g_mem_buf + (bio->bi_sector << 9),buffer,bio_cur_sectors(bio) << 9); status = 0; break; } case READ: { memcpy(buffer,g_mem_buf + (bio->bi_sector << 9),bio_cur_sectors(bio) << 9); status = 0; break; } default: { Log("[Error] Unknown opetator."); status = -EIO; break; } } bio_endio(bio,bio->bi_size,status); __bio_kunmap_atomic(bio,KM_USER0); }
/* * Transfer a single BIO. */ static int sbull_xfer_bio(struct sbull_dev *dev, struct bio *bio) { int i; struct bio_vec *bvec; sector_t sector = bio->bi_sector; /* Do each segment independently. */ bio_for_each_segment(bvec, bio, i) { char *buffer = __bio_kmap_atomic(bio, i, KM_USER0); sbull_transfer(dev, sector, bio_cur_sectors(bio), buffer, bio_data_dir(bio) == WRITE); sector += bio_cur_sectors(bio); __bio_kunmap_atomic(bio, KM_USER0); }
void blk_recalc_rq_sectors(struct request *rq, int nsect) { if (blk_fs_request(rq) || blk_discard_rq(rq)) { rq->hard_sector += nsect; rq->hard_nr_sectors -= nsect; /* * Move the I/O submission pointers ahead if required. */ if ((rq->nr_sectors >= rq->hard_nr_sectors) && (rq->sector <= rq->hard_sector)) { rq->sector = rq->hard_sector; rq->nr_sectors = rq->hard_nr_sectors; rq->hard_cur_sectors = bio_cur_sectors(rq->bio); rq->current_nr_sectors = rq->hard_cur_sectors; rq->buffer = bio_data(rq->bio); } /* * if total number of sectors is less than the first segment * size, something has gone terribly wrong */ if (rq->nr_sectors < rq->current_nr_sectors) { printk(KERN_ERR "blk: request botched\n"); rq->nr_sectors = rq->current_nr_sectors; } } }
static int brd_make_request(struct request_queue *q, struct bio *bio) { struct brd_device * brd = q->queuedata; int i, status; struct bio_vec *bvec; sector_t sector = bio->bi_sector; //spin_lock(&brd->brd_lock); /* Do each segment independently. */ bio_for_each_segment(bvec, bio, i) { char *buffer = __bio_kmap_atomic(bio, i, KM_USER0); brd_transfer(brd, sector, bio_cur_sectors(bio), buffer, bio_data_dir(bio) == WRITE); sector += bio_cur_sectors(bio); __bio_kunmap_atomic(bio, KM_USER0); }