static enum elv_merge deadline_merge(struct request_queue *q, struct request **req, struct bio *bio) { struct deadline_data *dd = q->elevator->elevator_data; struct request *__rq; /* * check for front merge */ if (dd->front_merges) { sector_t sector = bio_end_sector(bio); __rq = elv_rb_find(&dd->sort_list[bio_data_dir(bio)], sector); if (__rq) { BUG_ON(sector != blk_rq_pos(__rq)); if (elv_bio_merge_ok(__rq, bio)) { *req = __rq; return ELEVATOR_FRONT_MERGE; } } } return ELEVATOR_NO_MERGE; }
static int deadline_merge(struct request_queue *q, struct request **req, struct bio *bio) { struct deadline_data *dd = q->elevator->elevator_data; struct request *__rq; int ret; /* * check for front merge */ if (dd->front_merges) { sector_t sector = bio->bi_sector + bio_sectors(bio); __rq = elv_rb_find(&dd->sort_list[bio_data_dir(bio)], sector); if (__rq) { BUG_ON(sector != blk_rq_pos(__rq)); if (elv_rq_merge_ok(__rq, bio)) { ret = ELEVATOR_FRONT_MERGE; goto out; } } } return ELEVATOR_NO_MERGE; out: *req = __rq; return ret; }
int ElvDeadline::ElvMerge(request **rq, ioreq *req) { request *__rq; int rc; rc = Elevator::ElvMerge(rq, req); if (rc != ELEVATOR_NO_MERGE) return rc; if (front_merges) { obd_off off = req->off + req->count; __rq = elv_rb_find(&sort_list[req->cmd], off); if (__rq) { assert(off == __rq->off); if (ElvMergeOK(__rq, req)) { rc = ELEVATOR_FRONT_MERGE; goto out; } } } return ELEVATOR_NO_MERGE; out: *rq = __rq; return 0; }
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; }
static struct request * fiops_find_rq_fmerge(struct fiops_data *fiopsd, struct bio *bio) { struct task_struct *tsk = current; struct fiops_ioc *cic; cic = fiops_cic_lookup(fiopsd, tsk->io_context); if (cic) { sector_t sector = bio->bi_sector + bio_sectors(bio); return elv_rb_find(&cic->sort_list, sector); } return NULL; }