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; } } }
void probe_block_rq_requeue(void *data, struct request_queue *q, struct request *rq) { int rw = rq->cmd_flags & 0x03; if (blk_discard_rq(rq)) rw |= (1 << BIO_RW_DISCARD); if (blk_pc_request(rq)) { trace_mark_tp(block, rq_requeue_pc, block_rq_requeue, probe_block_rq_requeue, "data_len %u rw %d errors %d", blk_rq_bytes(rq), rw, rq->errors); } else { /* * FIXME Using a simple trace_mark for the second event * possibility because tracepoints do not support multiple * connections to the same probe yet. They should have some * refcounting. Need to enable both rq_requeue_pc and * rq_requeue_fs markers to have the rq_requeue_fs marker * enabled. */ trace_mark(block, rq_requeue_fs, "hard_sector %llu " "rw %d errors %d", (unsigned long long)blk_rq_pos(rq), rw, rq->errors); } }
void blk_fill_rwbs_rq(char *rwbs, struct request *rq) { int rw = rq->cmd_flags & 0x03; int bytes; if (blk_discard_rq(rq)) rw |= (1 << BIO_RW_DISCARD); bytes = blk_rq_bytes(rq); blk_fill_rwbs(rwbs, rw, bytes); }
/** * blk_add_trace_rq - Add a trace for a request oriented action * @q: queue the io is for * @rq: the source request * @what: the action * * Description: * Records an action against a request. Will log the bio offset + size. * **/ static void blk_add_trace_rq(struct request_queue *q, struct request *rq, u32 what) { struct blk_trace *bt = q->blk_trace; int rw = rq->cmd_flags & 0x03; if (likely(!bt)) return; if (blk_discard_rq(rq)) rw |= (1 << BIO_RW_DISCARD); if (blk_pc_request(rq)) { what |= BLK_TC_ACT(BLK_TC_PC); __blk_add_trace(bt, 0, rq->data_len, rw, what, rq->errors, sizeof(rq->cmd), rq->cmd); } else { what |= BLK_TC_ACT(BLK_TC_FS); __blk_add_trace(bt, rq->hard_sector, rq->hard_nr_sectors << 9, rw, what, rq->errors, 0, NULL); } }