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);
    }
Пример #2
0
/*
 * 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);
	}
Пример #3
0
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;
		}
	}
}
Пример #4
0
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);
	}