static void vr_add_request(struct request_queue *q, struct request *rq) { struct sio_data *sd = q->elevator->elevator_data; const int sync = rq_is_sync(rq); const int data_dir = rq_data_dir(rq); /* * We might be deleting our cached next request. * If so, find its sucessor. */ /* * add rq to rbtree and fifo */ static void vr_add_request(struct request_queue *q, struct request *rq) struct request *next) { struct vr_data *vd = vr_get_data(q); const int dir = rq_is_sync(rq); } /* * If next expires before rq, assign its expire time to rq * and move into next position (next will be deleted) in fifo. */ if (!list_empty(&rq->queuelist) && !list_empty(&next->queuelist)) { if (time_before(rq_fifo_time(next), rq_fifo_time(rq))) { list_move(&rq->queuelist, &next->queuelist); rq_set_fifo_time(rq, rq_fifo_time(next)); } } /* Delete next request */ rq_fifo_clear(next); }
/* * remove rq from rbtree and fifo. */ static void vr_remove_request(struct request_queue *q, struct request *rq) { struct vr_data *vd = vr_get_data(q); rq_fifo_clear(rq); vr_del_rq_rb(vd, rq); }
static void vr_merged_request(struct request_queue *q, struct request *req, int type) { struct vr_data *vd = vr_get_data(q); /* * if the merge was a front merge, we need to reposition request */ if (type == ELEVATOR_FRONT_MERGE) { vr_del_rq_rb(vd, req); vr_add_rq_rb(vd, req); } }
static int vr_merge(struct request_queue *q, struct request **rqp, struct bio *bio) { sector_t sector = bio->bi_sector + bio_sectors(bio); struct vr_data *vd = vr_get_data(q); struct request *rq = elv_rb_find(&vd->sort_list, sector); if (rq && elv_rq_merge_ok(rq, bio)) { *rqp = rq; return ELEVATOR_FRONT_MERGE; } return ELEVATOR_NO_MERGE; }
/* * add rq to rbtree and fifo */ static void vr_add_request(struct request_queue *q, struct request *rq) { struct vr_data *vd = vr_get_data(q); const int dir = rq_is_sync(rq); vr_add_rq_rb(vd, rq); if (vd->fifo_expire[dir]) { rq_set_fifo_time(rq, jiffies + vd->fifo_expire[dir]); list_add_tail(&rq->queuelist, &vd->fifo_list[dir]); } }
static int vr_dispatch_requests(struct request_queue *q, int force) { struct vr_data *vd = vr_get_data(q); struct request *rq = NULL; /* Check for and issue expired requests */ if (vd->nbatched > vd->fifo_batch) { vd->nbatched = 0; rq = vr_check_fifo(vd); } if (!rq) { rq = vr_choose_request(vd); if (!rq) return 0; } vr_move_request(vd, rq); return 1; }
static int vr_queue_empty(struct request_queue *q) { struct vr_data *vd = vr_get_data(q); return RB_EMPTY_ROOT(&vd->sort_list); }