commit 861c7c88e1eca795fdd879ac703d5d52fc18a837 Author: Jeff Garzik <jeff@xxxxxxxxxx> Date: Sun Apr 19 11:51:08 2009 -0400 struct request: replace bio, biotail with struct bio_list->{head,tail} Signed-off-by: Jeff Garzik <jgarzik@xxxxxxxxxx> block/blk-barrier.c | 6 ++++-- block/blk-core.c | 30 +++++++++++++++--------------- block/blk-map.c | 11 +++++------ block/blk-merge.c | 28 ++++++++++++++-------------- block/bsg.c | 10 +++++----- block/elevator.c | 2 +- block/scsi_ioctl.c | 2 +- drivers/block/floppy.c | 2 +- drivers/block/hd.c | 3 ++- drivers/cdrom/cdrom.c | 2 +- drivers/ide/ide-cd.c | 9 +++++---- drivers/ide/ide-dma.c | 8 ++++---- drivers/ide/ide-floppy.c | 2 +- drivers/ide/ide-io.c | 2 +- drivers/message/fusion/mptsas.c | 11 ++++++----- drivers/scsi/libsas/sas_expander.c | 11 ++++++----- drivers/scsi/libsas/sas_host_smp.c | 16 +++++++++------- drivers/scsi/mpt2sas/mpt2sas_transport.c | 11 ++++++----- drivers/scsi/osd/osd_initiator.c | 7 ++++--- drivers/scsi/osst.c | 2 +- drivers/scsi/scsi_lib.c | 2 +- drivers/scsi/scsi_tgt_lib.c | 2 +- drivers/scsi/sd_dif.c | 2 +- drivers/scsi/sg.c | 2 +- drivers/scsi/sr.c | 4 ++-- drivers/scsi/st.c | 2 +- include/linux/blkdev.h | 11 +++++------ 27 files changed, 104 insertions(+), 96 deletions(-) diff --git a/block/blk-barrier.c b/block/blk-barrier.c index 20b4111..17a76b6 100644 --- a/block/blk-barrier.c +++ b/block/blk-barrier.c @@ -200,15 +200,17 @@ static inline bool start_ordered(struct request_queue *q, struct request **rqp) skip |= QUEUE_ORDSEQ_POSTFLUSH; if (q->ordered & QUEUE_ORDERED_DO_BAR) { + struct bio *obb_bio; rq = &q->bar_rq; /* initialize proxy request and queue it */ blk_rq_init(q, rq); - if (bio_data_dir(q->orig_bar_rq->bio) == WRITE) + obb_bio = q->orig_bar_rq->bio_list.head; + if (bio_data_dir(obb_bio) == WRITE) rq->cmd_flags |= REQ_RW; if (q->ordered & QUEUE_ORDERED_DO_FUA) rq->cmd_flags |= REQ_FUA; - init_request_from_bio(rq, q->orig_bar_rq->bio); + init_request_from_bio(rq, obb_bio); rq->end_io = bar_end_io; elv_insert(q, rq, ELEVATOR_INSERT_FRONT); diff --git a/block/blk-core.c b/block/blk-core.c index 07ab754..0ec8621 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -189,7 +189,8 @@ void blk_dump_rq_flags(struct request *rq, char *msg) rq->nr_sectors, rq->current_nr_sectors); printk(KERN_INFO " bio %p, biotail %p, buffer %p, data %p, len %u\n", - rq->bio, rq->biotail, + rq->bio_list.head, + rq->bio_list.tail, rq->buffer, rq->data, rq->data_len); @@ -1063,7 +1064,7 @@ void __blk_put_request(struct request_queue *q, struct request *req) elv_completed_request(q, req); /* this is a bio leak */ - WARN_ON(req->bio != NULL); + WARN_ON(!bio_list_empty(&req->bio_list)); /* * Request may not have originated from ll_rw_blk. if not, @@ -1178,8 +1179,7 @@ static int __make_request(struct request_queue *q, struct bio *bio) trace_block_bio_backmerge(q, bio); - req->biotail->bi_next = bio; - req->biotail = bio; + bio_list_add(&req->bio_list, bio); req->nr_sectors = req->hard_nr_sectors += nr_sectors; req->ioprio = ioprio_best(req->ioprio, prio); if (!blk_rq_cpu_valid(req)) @@ -1197,8 +1197,7 @@ static int __make_request(struct request_queue *q, struct bio *bio) trace_block_bio_frontmerge(q, bio); - bio->bi_next = req->bio; - req->bio = bio; + bio_list_add_head(&req->bio_list, bio); /* * may not be valid. if the low level driver said @@ -1754,11 +1753,11 @@ static int __end_that_request_first(struct request *req, int error, blk_account_io_completion(req, nr_bytes); total_bytes = bio_nbytes = 0; - while ((bio = req->bio) != NULL) { + while ((bio = req->bio_list.head) != NULL) { int nbytes; if (nr_bytes >= bio->bi_size) { - req->bio = bio->bi_next; + req->bio_list.head = bio->bi_next; nbytes = bio->bi_size; req_bio_endio(req, bio, nbytes, error); next_idx = 0; @@ -1795,7 +1794,7 @@ static int __end_that_request_first(struct request *req, int error, total_bytes += nbytes; nr_bytes -= nbytes; - bio = req->bio; + bio = req->bio_list.head; if (bio) { /* * end more in this run, or just return 'not-done' @@ -1808,7 +1807,7 @@ static int __end_that_request_first(struct request *req, int error, /* * completely done */ - if (!req->bio) + if (bio_list_empty(&req->bio_list)) return 0; /* @@ -1876,8 +1875,8 @@ unsigned int blk_rq_cur_bytes(struct request *rq) if (blk_fs_request(rq)) return rq->current_nr_sectors << 9; - if (rq->bio) - return rq->bio->bi_size; + if (!bio_list_empty(&rq->bio_list)) + return rq->bio_list.head->bi_size; return rq->data_len; } @@ -1913,7 +1912,7 @@ EXPORT_SYMBOL(end_request); static int end_that_request_data(struct request *rq, int error, unsigned int nr_bytes, unsigned int bidi_bytes) { - if (rq->bio) { + if (!bio_list_empty(&rq->bio_list)) { if (__end_that_request_first(rq, error, nr_bytes)) return 1; @@ -2003,7 +2002,8 @@ EXPORT_SYMBOL_GPL(blk_end_request); **/ int __blk_end_request(struct request *rq, int error, unsigned int nr_bytes) { - if (rq->bio && __end_that_request_first(rq, error, nr_bytes)) + if (!bio_list_empty(&rq->bio_list) && + __end_that_request_first(rq, error, nr_bytes)) return 1; add_disk_randomness(rq->rq_disk); @@ -2114,7 +2114,7 @@ void blk_rq_bio_prep(struct request_queue *q, struct request *rq, rq->hard_nr_sectors = rq->nr_sectors = bio_sectors(bio); rq->data_len = bio->bi_size; - rq->bio = rq->biotail = bio; + rq->bio_list.head = rq->bio_list.tail = bio; if (bio->bi_bdev) rq->rq_disk = bio->bi_bdev->bd_disk; diff --git a/block/blk-map.c b/block/blk-map.c index f103729..437b916 100644 --- a/block/blk-map.c +++ b/block/blk-map.c @@ -12,13 +12,12 @@ int blk_rq_append_bio(struct request_queue *q, struct request *rq, struct bio *bio) { - if (!rq->bio) + if (bio_list_empty(&rq->bio_list)) blk_rq_bio_prep(q, rq, bio); else if (!ll_back_merge_fn(q, rq, bio)) return -EINVAL; else { - rq->biotail->bi_next = bio; - rq->biotail = bio; + bio_list_add(&rq->bio_list, bio); rq->data_len += bio->bi_size; } @@ -145,7 +144,7 @@ int blk_rq_map_user(struct request_queue *q, struct request *rq, if (ret < 0) goto unmap_rq; if (!bio) - bio = rq->bio; + bio = rq->bio_list.head; bytes_read += ret; ubuf += ret; @@ -160,7 +159,7 @@ int blk_rq_map_user(struct request_queue *q, struct request *rq, return 0; unmap_rq: blk_rq_unmap_user(bio); - rq->bio = NULL; + rq->bio_list.head = NULL; return ret; } EXPORT_SYMBOL(blk_rq_map_user); @@ -312,7 +311,7 @@ int blk_rq_map_kern(struct request_queue *q, struct request *rq, void *kbuf, rq->cmd_flags |= REQ_COPY_USER; blk_rq_bio_prep(q, rq, bio); - blk_queue_bounce(q, &rq->bio); + blk_queue_bounce(q, &rq->bio_list.head); rq->buffer = rq->data = NULL; return 0; } diff --git a/block/blk-merge.c b/block/blk-merge.c index 63760ca..a1a23ae 100644 --- a/block/blk-merge.c +++ b/block/blk-merge.c @@ -22,9 +22,9 @@ void blk_recalc_rq_sectors(struct request *rq, int nsect) (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->hard_cur_sectors = bio_cur_sectors(rq->bio_list.head); rq->current_nr_sectors = rq->hard_cur_sectors; - rq->buffer = bio_data(rq->bio); + rq->buffer = bio_data(rq->bio_list.head); } /* @@ -99,7 +99,7 @@ new_segment: void blk_recalc_rq_segments(struct request *rq) { - rq->nr_phys_segments = __blk_recalc_rq_segments(rq->q, rq->bio); + rq->nr_phys_segments = __blk_recalc_rq_segments(rq->q, rq->bio_list.head); } void blk_recount_segments(struct request_queue *q, struct bio *bio) @@ -265,8 +265,8 @@ int ll_back_merge_fn(struct request_queue *q, struct request *req, q->last_merge = NULL; return 0; } - if (!bio_flagged(req->biotail, BIO_SEG_VALID)) - blk_recount_segments(q, req->biotail); + if (!bio_flagged(req->bio_list.tail, BIO_SEG_VALID)) + blk_recount_segments(q, req->bio_list.tail); if (!bio_flagged(bio, BIO_SEG_VALID)) blk_recount_segments(q, bio); @@ -292,8 +292,8 @@ int ll_front_merge_fn(struct request_queue *q, struct request *req, } if (!bio_flagged(bio, BIO_SEG_VALID)) blk_recount_segments(q, bio); - if (!bio_flagged(req->bio, BIO_SEG_VALID)) - blk_recount_segments(q, req->bio); + if (!bio_flagged(req->bio_list.head, BIO_SEG_VALID)) + blk_recount_segments(q, req->bio_list.head); return ll_new_hw_segment(q, req, bio); } @@ -303,7 +303,8 @@ static int ll_merge_requests_fn(struct request_queue *q, struct request *req, { int total_phys_segments; unsigned int seg_size = - req->biotail->bi_seg_back_size + next->bio->bi_seg_front_size; + req->bio_list.tail->bi_seg_back_size + + next->bio_list.head->bi_seg_front_size; /* * First check if the either of the requests are re-queued @@ -319,11 +320,11 @@ static int ll_merge_requests_fn(struct request_queue *q, struct request *req, return 0; total_phys_segments = req->nr_phys_segments + next->nr_phys_segments; - if (blk_phys_contig_segment(q, req->biotail, next->bio)) { + if (blk_phys_contig_segment(q, req->bio_list.tail, next->bio_list.head)) { if (req->nr_phys_segments == 1) - req->bio->bi_seg_front_size = seg_size; + req->bio_list.head->bi_seg_front_size = seg_size; if (next->nr_phys_segments == 1) - next->biotail->bi_seg_back_size = seg_size; + next->bio_list.tail->bi_seg_back_size = seg_size; total_phys_segments--; } @@ -395,8 +396,7 @@ static int attempt_merge(struct request_queue *q, struct request *req, if (time_after(req->start_time, next->start_time)) req->start_time = next->start_time; - req->biotail->bi_next = next->bio; - req->biotail = next->biotail; + bio_list_merge(&req->bio_list, &next->bio_list); req->nr_sectors = req->hard_nr_sectors += next->hard_nr_sectors; @@ -409,7 +409,7 @@ static int attempt_merge(struct request_queue *q, struct request *req, req->cpu = next->cpu; /* owner-ship of bio passed from next to req */ - next->bio = NULL; + next->bio_list.head = NULL; __blk_put_request(q, next); return 1; } diff --git a/block/bsg.c b/block/bsg.c index 206060e..80ff23a 100644 --- a/block/bsg.c +++ b/block/bsg.c @@ -314,7 +314,7 @@ out: kfree(rq->cmd); blk_put_request(rq); if (next_rq) { - blk_rq_unmap_user(next_rq->bio); + blk_rq_unmap_user(next_rq->bio_list.head); blk_put_request(next_rq); } return ERR_PTR(ret); @@ -356,9 +356,9 @@ static void bsg_add_command(struct bsg_device *bd, struct request_queue *q, * add bc command to busy queue and submit rq for io */ bc->rq = rq; - bc->bio = rq->bio; + bc->bio = rq->bio_list.head; if (rq->next_rq) - bc->bidi_bio = rq->next_rq->bio; + bc->bidi_bio = rq->next_rq->bio_list.head; bc->hdr.duration = jiffies; spin_lock_irq(&bd->lock); list_add_tail(&bc->list, &bd->busy_list); @@ -933,9 +933,9 @@ static long bsg_ioctl(struct file *file, unsigned int cmd, unsigned long arg) if (IS_ERR(rq)) return PTR_ERR(rq); - bio = rq->bio; + bio = rq->bio_list.head; if (rq->next_rq) - bidi_bio = rq->next_rq->bio; + bidi_bio = rq->next_rq->bio_list.head; at_head = (0 == (hdr.flags & BSG_FLAG_Q_AT_TAIL)); blk_execute_rq(bd->queue, NULL, rq, at_head); diff --git a/block/elevator.c b/block/elevator.c index 7073a90..6e59138 100644 --- a/block/elevator.c +++ b/block/elevator.c @@ -84,7 +84,7 @@ int elv_rq_merge_ok(struct request *rq, struct bio *bio) /* * Don't merge file system requests and discard requests */ - if (bio_discard(bio) != bio_discard(rq->bio)) + if (bio_discard(bio) != bio_discard(rq->bio_list.head)) return 0; /* diff --git a/block/scsi_ioctl.c b/block/scsi_ioctl.c index 84b7f87..688e80d 100644 --- a/block/scsi_ioctl.c +++ b/block/scsi_ioctl.c @@ -314,7 +314,7 @@ static int sg_io(struct request_queue *q, struct gendisk *bd_disk, if (ret) goto out; - bio = rq->bio; + bio = rq->bio_list.head; memset(sense, 0, sizeof(sense)); rq->sense = sense; rq->sense_len = 0; diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c index 1300df6..b015e2d 100644 --- a/drivers/block/floppy.c +++ b/drivers/block/floppy.c @@ -2462,7 +2462,7 @@ static int buffer_chain_size(void) struct req_iterator iter; char *base; - base = bio_data(current_req->bio); + base = bio_data(current_req->bio_list.head); size = 0; rq_for_each_segment(bv, current_req, iter) { diff --git a/drivers/block/hd.c b/drivers/block/hd.c index 3c11f06..deb76a4 100644 --- a/drivers/block/hd.c +++ b/drivers/block/hd.c @@ -504,7 +504,8 @@ ok_to_write: i = --req->nr_sectors; --req->current_nr_sectors; req->buffer += 512; - if (!i || (req->bio && req->current_nr_sectors <= 0)) + if (!i || (!bio_list_empty(&req->bio_list) && + req->current_nr_sectors <= 0)) end_request(req, 1); if (i > 0) { SET_HANDLER(&write_intr); diff --git a/drivers/cdrom/cdrom.c b/drivers/cdrom/cdrom.c index cceace6..da8beda 100644 --- a/drivers/cdrom/cdrom.c +++ b/drivers/cdrom/cdrom.c @@ -2132,7 +2132,7 @@ static int cdrom_read_cdda_bpc(struct cdrom_device_info *cdi, __u8 __user *ubuf, rq->cmd_len = 12; rq->cmd_type = REQ_TYPE_BLOCK_PC; rq->timeout = 60 * HZ; - bio = rq->bio; + bio = rq->bio_list.head; if (blk_execute_rq(q, cdi->disk, rq, 0)) { struct request_sense *s = rq->sense; diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index 3aec19d..3303646 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c @@ -186,7 +186,7 @@ static void cdrom_analyze_sense_data(ide_drive_t *drive, /* device sector size is 2K */ sector <<= 2; - bio_sectors = max(bio_sectors(failed_command->bio), 4U); + bio_sectors = max(bio_sectors(failed_command->bio_list.head), 4U); sector &= ~(bio_sectors - 1); /* @@ -839,13 +839,14 @@ static void cdrom_do_block_pc(ide_drive_t *drive, struct request *rq) drive->dma = 0; /* sg request */ - if (rq->bio || ((rq->cmd_type == REQ_TYPE_ATA_PC) && rq->data_len)) { + if (!bio_list_empty(&rq->bio_list) || + ((rq->cmd_type == REQ_TYPE_ATA_PC) && rq->data_len)) { struct request_queue *q = drive->queue; unsigned int alignment; char *buf; - if (rq->bio) - buf = bio_data(rq->bio); + if (!bio_list_empty(&rq->bio_list)) + buf = bio_data(rq->bio_list.head); else buf = rq->data; diff --git a/drivers/ide/ide-dma.c b/drivers/ide/ide-dma.c index a0b8cab..b67fee3 100644 --- a/drivers/ide/ide-dma.c +++ b/drivers/ide/ide-dma.c @@ -519,13 +519,13 @@ ide_startstop_t ide_dma_timeout_retry(ide_drive_t *drive, int error) rq->errors = 0; - if (!rq->bio) + if (bio_list_empty(&rq->bio_list)) goto out; - rq->sector = rq->bio->bi_sector; - rq->current_nr_sectors = bio_iovec(rq->bio)->bv_len >> 9; + rq->sector = rq->bio_list.head->bi_sector; + rq->current_nr_sectors = bio_iovec(rq->bio_list.head)->bv_len >> 9; rq->hard_cur_sectors = rq->current_nr_sectors; - rq->buffer = bio_data(rq->bio); + rq->buffer = bio_data(rq->bio_list.head); out: return ret; } diff --git a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c index 2b4868d..548f243 100644 --- a/drivers/ide/ide-floppy.c +++ b/drivers/ide/ide-floppy.c @@ -219,7 +219,7 @@ static void idefloppy_blockpc_cmd(struct ide_disk_obj *floppy, if (rq->data_len && rq_data_dir(rq) == WRITE) pc->flags |= PC_FLAG_WRITING; pc->buf = rq->data; - if (rq->bio) + if (!bio_list_empty(&rq->bio_list)) pc->flags |= PC_FLAG_DMA_OK; /* * possibly problematic, doesn't look like ide-floppy correctly diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c index 35dc38d..f7ce3dd 100644 --- a/drivers/ide/ide-io.c +++ b/drivers/ide/ide-io.c @@ -251,7 +251,7 @@ void ide_map_sg(ide_drive_t *drive, struct ide_cmd *cmd) if (rq->cmd_type == REQ_TYPE_ATA_TASKFILE) { sg_init_one(sg, rq->buffer, rq->nr_sectors * SECTOR_SIZE); cmd->sg_nents = 1; - } else if (!rq->bio) { + } else if (bio_list_empty(&rq->bio_list)) { sg_init_one(sg, rq->data, rq->data_len); cmd->sg_nents = 1; } else diff --git a/drivers/message/fusion/mptsas.c b/drivers/message/fusion/mptsas.c index a9019f0..76f9738 100644 --- a/drivers/message/fusion/mptsas.c +++ b/drivers/message/fusion/mptsas.c @@ -1275,10 +1275,11 @@ static int mptsas_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy, } /* do we need to support multiple segments? */ - if (req->bio->bi_vcnt > 1 || rsp->bio->bi_vcnt > 1) { + if (req->bio_list.head->bi_vcnt > 1 || + rsp->bio_list.head->bi_vcnt > 1) { printk(MYIOC_s_ERR_FMT "%s: multiple segments req %u %u, rsp %u %u\n", - ioc->name, __func__, req->bio->bi_vcnt, req->data_len, - rsp->bio->bi_vcnt, rsp->data_len); + ioc->name, __func__, req->bio_list.head->bi_vcnt, + req->data_len, rsp->bio_list.head->bi_vcnt, rsp->data_len); return -EINVAL; } @@ -1323,7 +1324,7 @@ static int mptsas_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy, mpt_addr_size()) << MPI_SGE_FLAGS_SHIFT; flagsLength |= (req->data_len - 4); - dma_addr_out = pci_map_single(ioc->pcidev, bio_data(req->bio), + dma_addr_out = pci_map_single(ioc->pcidev, bio_data(req->bio_list.head), req->data_len, PCI_DMA_BIDIRECTIONAL); if (!dma_addr_out) goto put_mf; @@ -1333,7 +1334,7 @@ static int mptsas_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy, /* response */ flagsLength = MPT_SGE_FLAGS_SSIMPLE_READ; flagsLength |= rsp->data_len + 4; - dma_addr_in = pci_map_single(ioc->pcidev, bio_data(rsp->bio), + dma_addr_in = pci_map_single(ioc->pcidev, bio_data(rsp->bio_list.head), rsp->data_len, PCI_DMA_BIDIRECTIONAL); if (!dma_addr_in) goto unmap; diff --git a/drivers/scsi/libsas/sas_expander.c b/drivers/scsi/libsas/sas_expander.c index 3da02e4..26daefd 100644 --- a/drivers/scsi/libsas/sas_expander.c +++ b/drivers/scsi/libsas/sas_expander.c @@ -1925,15 +1925,16 @@ int sas_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy, } /* do we need to support multiple segments? */ - if (req->bio->bi_vcnt > 1 || rsp->bio->bi_vcnt > 1) { + if (req->bio_list.head->bi_vcnt > 1 || + rsp->bio_list.head->bi_vcnt > 1) { printk("%s: multiple segments req %u %u, rsp %u %u\n", - __func__, req->bio->bi_vcnt, req->data_len, - rsp->bio->bi_vcnt, rsp->data_len); + __func__, req->bio_list.head->bi_vcnt, req->data_len, + rsp->bio_list.head->bi_vcnt, rsp->data_len); return -EINVAL; } - ret = smp_execute_task(dev, bio_data(req->bio), req->data_len, - bio_data(rsp->bio), rsp->data_len); + ret = smp_execute_task(dev, bio_data(req->bio_list.head), req->data_len, + bio_data(rsp->bio_list.head), rsp->data_len); if (ret > 0) { /* positive number is the untransferred residual */ rsp->data_len = ret; diff --git a/drivers/scsi/libsas/sas_host_smp.c b/drivers/scsi/libsas/sas_host_smp.c index d110a36..405e97e 100644 --- a/drivers/scsi/libsas/sas_host_smp.c +++ b/drivers/scsi/libsas/sas_host_smp.c @@ -140,8 +140,8 @@ int sas_smp_host_handler(struct Scsi_Host *shost, struct request *req, if (req->data_len < 8 || rsp->data_len < 8) goto out; - if (bio_offset(req->bio) + req->data_len > PAGE_SIZE || - bio_offset(rsp->bio) + rsp->data_len > PAGE_SIZE) { + if (bio_offset(req->bio_list.head) + req->data_len > PAGE_SIZE || + bio_offset(rsp->bio_list.head) + rsp->data_len > PAGE_SIZE) { shost_printk(KERN_ERR, shost, "SMP request/response frame crosses page boundary"); goto out; @@ -159,9 +159,10 @@ int sas_smp_host_handler(struct Scsi_Host *shost, struct request *req, } local_irq_disable(); - buf = kmap_atomic(bio_page(req->bio), KM_USER0) + bio_offset(req->bio); + buf = kmap_atomic(bio_page(req->bio_list.head), KM_USER0) + + bio_offset(req->bio_list.head); memcpy(req_data, buf, req->data_len); - kunmap_atomic(buf - bio_offset(req->bio), KM_USER0); + kunmap_atomic(buf - bio_offset(req->bio_list.head), KM_USER0); local_irq_enable(); if (req_data[0] != SMP_REQUEST) @@ -260,10 +261,11 @@ int sas_smp_host_handler(struct Scsi_Host *shost, struct request *req, } local_irq_disable(); - buf = kmap_atomic(bio_page(rsp->bio), KM_USER0) + bio_offset(rsp->bio); + buf = kmap_atomic(bio_page(rsp->bio_list.head), KM_USER0) + + bio_offset(rsp->bio_list.head); memcpy(buf, resp_data, rsp->data_len); - flush_kernel_dcache_page(bio_page(rsp->bio)); - kunmap_atomic(buf - bio_offset(rsp->bio), KM_USER0); + flush_kernel_dcache_page(bio_page(rsp->bio_list.head)); + kunmap_atomic(buf - bio_offset(rsp->bio_list.head), KM_USER0); local_irq_enable(); rsp->data_len = resp_data_len; diff --git a/drivers/scsi/mpt2sas/mpt2sas_transport.c b/drivers/scsi/mpt2sas/mpt2sas_transport.c index e03dc0b..99f1262 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_transport.c +++ b/drivers/scsi/mpt2sas/mpt2sas_transport.c @@ -1038,10 +1038,11 @@ transport_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy, } /* do we need to support multiple segments? */ - if (req->bio->bi_vcnt > 1 || rsp->bio->bi_vcnt > 1) { + if (req->bio_list.head->bi_vcnt > 1 || + rsp->bio_list.head->bi_vcnt > 1) { printk(MPT2SAS_ERR_FMT "%s: multiple segments req %u %u, " - "rsp %u %u\n", ioc->name, __func__, req->bio->bi_vcnt, - req->data_len, rsp->bio->bi_vcnt, rsp->data_len); + "rsp %u %u\n", ioc->name, __func__, req->bio_list.head->bi_vcnt, + req->data_len, rsp->bio_list.head->bi_vcnt, rsp->data_len); return -EINVAL; } @@ -1111,7 +1112,7 @@ transport_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy, sgl_flags = (MPI2_SGE_FLAGS_SIMPLE_ELEMENT | MPI2_SGE_FLAGS_END_OF_BUFFER | MPI2_SGE_FLAGS_HOST_TO_IOC); sgl_flags = sgl_flags << MPI2_SGE_FLAGS_SHIFT; - dma_addr_out = pci_map_single(ioc->pdev, bio_data(req->bio), + dma_addr_out = pci_map_single(ioc->pdev, bio_data(req->bio_list.head), req->data_len, PCI_DMA_BIDIRECTIONAL); if (!dma_addr_out) { mpt2sas_base_free_smid(ioc, le16_to_cpu(smid)); @@ -1129,7 +1130,7 @@ transport_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy, MPI2_SGE_FLAGS_LAST_ELEMENT | MPI2_SGE_FLAGS_END_OF_BUFFER | MPI2_SGE_FLAGS_END_OF_LIST); sgl_flags = sgl_flags << MPI2_SGE_FLAGS_SHIFT; - dma_addr_in = pci_map_single(ioc->pdev, bio_data(rsp->bio), + dma_addr_in = pci_map_single(ioc->pdev, bio_data(rsp->bio_list.head), rsp->data_len, PCI_DMA_BIDIRECTIONAL); if (!dma_addr_in) { mpt2sas_base_free_smid(ioc, le16_to_cpu(smid)); diff --git a/drivers/scsi/osd/osd_initiator.c b/drivers/scsi/osd/osd_initiator.c index 2a5f077..5682796 100644 --- a/drivers/scsi/osd/osd_initiator.c +++ b/drivers/scsi/osd/osd_initiator.c @@ -352,7 +352,7 @@ static void _osd_free_seg(struct osd_request *or __unused, static void _put_request(struct request *rq , bool is_async) { if (is_async) { - WARN_ON(rq->bio); + WARN_ON(!bio_list_empty(&rq->bio_list)); __blk_put_request(rq->q, rq); } else { /* @@ -361,7 +361,7 @@ static void _put_request(struct request *rq , bool is_async) * TODO: Keep error code in or->async_error. Need to audit all * code paths. */ - if (unlikely(rq->bio)) + if (unlikely(!bio_list_empty(&rq->bio_list))) blk_end_request(rq, -ENOMEM, blk_rq_bytes(rq)); else blk_put_request(rq); @@ -1192,7 +1192,8 @@ static int _osd_req_finalize_data_integrity(struct osd_request *or, or->out.last_seg = NULL; /* they are now all chained to request sign them all together */ - osd_sec_sign_data(&or->out_data_integ, or->out.req->bio, + osd_sec_sign_data(&or->out_data_integ, + or->out.req->bio_list.head, cap_key); } diff --git a/drivers/scsi/osst.c b/drivers/scsi/osst.c index acb8358..e4e41fc 100644 --- a/drivers/scsi/osst.c +++ b/drivers/scsi/osst.c @@ -392,7 +392,7 @@ static int osst_execute(struct osst_request *SRpnt, const unsigned char *cmd, kfree(pages); goto free_req; } - SRpnt->bio = req->bio; + SRpnt->bio = req->bio_list.head; mdata->pages = pages; } else if (bufflen) { diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index d1cb64a..e84c9e9 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c @@ -1078,7 +1078,7 @@ int scsi_setup_blk_pc_cmnd(struct scsi_device *sdev, struct request *req) * that does not transfer data, in which case they may optionally * submit a request without an attached bio. */ - if (req->bio) { + if (!bio_list_empty(&req->bio_list)) { int ret; BUG_ON(!req->nr_phys_segments); diff --git a/drivers/scsi/scsi_tgt_lib.c b/drivers/scsi/scsi_tgt_lib.c index 48ba413..28b570e 100644 --- a/drivers/scsi/scsi_tgt_lib.c +++ b/drivers/scsi/scsi_tgt_lib.c @@ -377,7 +377,7 @@ static int scsi_map_user_pages(struct scsi_tgt_cmd *tcmd, struct scsi_cmnd *cmd, return err; } - tcmd->bio = rq->bio; + tcmd->bio = rq->bio_list.head; err = scsi_init_io(cmd, GFP_KERNEL); if (err) { scsi_release_buffers(cmd); diff --git a/drivers/scsi/sd_dif.c b/drivers/scsi/sd_dif.c index 184dff4..011bd1e 100644 --- a/drivers/scsi/sd_dif.c +++ b/drivers/scsi/sd_dif.c @@ -444,7 +444,7 @@ int sd_dif_prepare(struct request *rq, sector_t hw_sector, unsigned int sector_s if (rq->cmd_flags & REQ_INTEGRITY) return 0; - sdkp = rq->bio->bi_bdev->bd_disk->private_data; + sdkp = rq->bio_list.head->bi_bdev->bd_disk->private_data; if (sdkp->protection_type == SD_DIF_TYPE3_PROTECTION) return 0; diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c index 82312df..f59f30f 100644 --- a/drivers/scsi/sg.c +++ b/drivers/scsi/sg.c @@ -1686,7 +1686,7 @@ static int sg_start_req(Sg_request *srp, unsigned char *cmd) hp->dxfer_len, GFP_ATOMIC); if (!res) { - srp->bio = rq->bio; + srp->bio = rq->bio_list.head; if (!md) { req_schp->dio_in_use = 1; diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c index 0e1a0f2..d523ec9 100644 --- a/drivers/scsi/sr.c +++ b/drivers/scsi/sr.c @@ -284,9 +284,9 @@ static int sr_done(struct scsi_cmnd *SCpnt) (SCpnt->sense_buffer[4] << 16) | (SCpnt->sense_buffer[5] << 8) | SCpnt->sense_buffer[6]; - if (SCpnt->request->bio != NULL) + if (!bio_list_empty(&SCpnt->request->bio_list)) block_sectors = - bio_sectors(SCpnt->request->bio); + bio_sectors(SCpnt->request->bio_list.head); if (block_sectors < 4) block_sectors = 4; if (cd->device->sector_size == 2048) diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c index eb24efe..595afda 100644 --- a/drivers/scsi/st.c +++ b/drivers/scsi/st.c @@ -500,7 +500,7 @@ static int st_scsi_execute(struct st_request *SRpnt, const unsigned char *cmd, } } - SRpnt->bio = req->bio; + SRpnt->bio = req->bio_list.head; req->cmd_len = COMMAND_SIZE(cmd[0]); memset(req->cmd, 0, BLK_MAX_CDB); memcpy(req->cmd, cmd, req->cmd_len); diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index ba54c83..acb3254 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -178,8 +178,7 @@ struct request { /* no. of sectors left to complete in the current segment */ unsigned int hard_cur_sectors; - struct bio *bio; - struct bio *biotail; + struct bio_list bio_list; struct hlist_node hash; /* merge hash */ /* @@ -730,8 +729,8 @@ struct req_iterator { #define for_each_bio(_bio) \ for (; _bio; _bio = _bio->bi_next) #define __rq_for_each_bio(_bio, rq) \ - if ((rq->bio)) \ - for (_bio = (rq)->bio; _bio; _bio = _bio->bi_next) + if (!bio_list_empty(&(rq)->bio_list)) \ + for (_bio = (rq)->bio_list.head; _bio; _bio = _bio->bi_next) #define rq_for_each_segment(bvl, _rq, _iter) \ __rq_for_each_bio(_iter.bio, _rq) \ @@ -1077,10 +1076,10 @@ static inline struct blk_integrity *blk_get_integrity(struct gendisk *disk) static inline int blk_integrity_rq(struct request *rq) { - if (rq->bio == NULL) + if (bio_list_empty(&rq->bio_list)) return 0; - return bio_integrity(rq->bio); + return bio_integrity(rq->bio_list.head); } #else /* CONFIG_BLK_DEV_INTEGRITY */ -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html