Merge branch 'for-3.14/core' of git://git.kernel.dk/linux-block
Pull core block IO changes from Jens Axboe: "The major piece in here is the immutable bio_ve series from Kent, the rest is fairly minor. It was supposed to go in last round, but various issues pushed it to this release instead. The pull request contains: - Various smaller blk-mq fixes from different folks. Nothing major here, just minor fixes and cleanups. - Fix for a memory leak in the error path in the block ioctl code from Christian Engelmayer. - Header export fix from CaiZhiyong. - Finally the immutable biovec changes from Kent Overstreet. This enables some nice future work on making arbitrarily sized bios possible, and splitting more efficient. Related fixes to immutable bio_vecs: - dm-cache immutable fixup from Mike Snitzer. - btrfs immutable fixup from Muthu Kumar. - bio-integrity fix from Nic Bellinger, which is also going to stable" * 'for-3.14/core' of git://git.kernel.dk/linux-block: (44 commits) xtensa: fixup simdisk driver to work with immutable bio_vecs block/blk-mq-cpu.c: use hotcpu_notifier() blk-mq: for_each_* macro correctness block: Fix memory leak in rw_copy_check_uvector() handling bio-integrity: Fix bio_integrity_verify segment start bug block: remove unrelated header files and export symbol blk-mq: uses page->list incorrectly blk-mq: use __smp_call_function_single directly btrfs: fix missing increment of bi_remaining Revert "block: Warn and free bio if bi_end_io is not set" block: Warn and free bio if bi_end_io is not set blk-mq: fix initializing request's start time block: blk-mq: don't export blk_mq_free_queue() block: blk-mq: make blk_sync_queue support mq block: blk-mq: support draining mq queue dm cache: increment bi_remaining when bi_end_io is restored block: fixup for generic bio chaining block: Really silence spurious compiler warnings block: Silence spurious compiler warnings block: Kill bio_pair_split() ...
This commit is contained in:
@@ -1901,7 +1901,7 @@ _transport_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy,
|
||||
struct MPT2SAS_ADAPTER *ioc = shost_priv(shost);
|
||||
Mpi2SmpPassthroughRequest_t *mpi_request;
|
||||
Mpi2SmpPassthroughReply_t *mpi_reply;
|
||||
int rc, i;
|
||||
int rc;
|
||||
u16 smid;
|
||||
u32 ioc_state;
|
||||
unsigned long timeleft;
|
||||
@@ -1916,7 +1916,8 @@ _transport_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy,
|
||||
void *pci_addr_out = NULL;
|
||||
u16 wait_state_count;
|
||||
struct request *rsp = req->next_rq;
|
||||
struct bio_vec *bvec = NULL;
|
||||
struct bio_vec bvec;
|
||||
struct bvec_iter iter;
|
||||
|
||||
if (!rsp) {
|
||||
printk(MPT2SAS_ERR_FMT "%s: the smp response space is "
|
||||
@@ -1942,7 +1943,7 @@ _transport_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy,
|
||||
ioc->transport_cmds.status = MPT2_CMD_PENDING;
|
||||
|
||||
/* Check if the request is split across multiple segments */
|
||||
if (bio_segments(req->bio) > 1) {
|
||||
if (bio_multiple_segments(req->bio)) {
|
||||
u32 offset = 0;
|
||||
|
||||
/* Allocate memory and copy the request */
|
||||
@@ -1955,11 +1956,11 @@ _transport_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy,
|
||||
goto out;
|
||||
}
|
||||
|
||||
bio_for_each_segment(bvec, req->bio, i) {
|
||||
bio_for_each_segment(bvec, req->bio, iter) {
|
||||
memcpy(pci_addr_out + offset,
|
||||
page_address(bvec->bv_page) + bvec->bv_offset,
|
||||
bvec->bv_len);
|
||||
offset += bvec->bv_len;
|
||||
page_address(bvec.bv_page) + bvec.bv_offset,
|
||||
bvec.bv_len);
|
||||
offset += bvec.bv_len;
|
||||
}
|
||||
} else {
|
||||
dma_addr_out = pci_map_single(ioc->pdev, bio_data(req->bio),
|
||||
@@ -1974,7 +1975,7 @@ _transport_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy,
|
||||
|
||||
/* Check if the response needs to be populated across
|
||||
* multiple segments */
|
||||
if (bio_segments(rsp->bio) > 1) {
|
||||
if (bio_multiple_segments(rsp->bio)) {
|
||||
pci_addr_in = pci_alloc_consistent(ioc->pdev, blk_rq_bytes(rsp),
|
||||
&pci_dma_in);
|
||||
if (!pci_addr_in) {
|
||||
@@ -2041,7 +2042,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;
|
||||
if (bio_segments(req->bio) > 1) {
|
||||
if (bio_multiple_segments(req->bio)) {
|
||||
ioc->base_add_sg_single(psge, sgl_flags |
|
||||
(blk_rq_bytes(req) - 4), pci_dma_out);
|
||||
} else {
|
||||
@@ -2057,7 +2058,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;
|
||||
if (bio_segments(rsp->bio) > 1) {
|
||||
if (bio_multiple_segments(rsp->bio)) {
|
||||
ioc->base_add_sg_single(psge, sgl_flags |
|
||||
(blk_rq_bytes(rsp) + 4), pci_dma_in);
|
||||
} else {
|
||||
@@ -2102,23 +2103,23 @@ _transport_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy,
|
||||
le16_to_cpu(mpi_reply->ResponseDataLength);
|
||||
/* check if the resp needs to be copied from the allocated
|
||||
* pci mem */
|
||||
if (bio_segments(rsp->bio) > 1) {
|
||||
if (bio_multiple_segments(rsp->bio)) {
|
||||
u32 offset = 0;
|
||||
u32 bytes_to_copy =
|
||||
le16_to_cpu(mpi_reply->ResponseDataLength);
|
||||
bio_for_each_segment(bvec, rsp->bio, i) {
|
||||
if (bytes_to_copy <= bvec->bv_len) {
|
||||
memcpy(page_address(bvec->bv_page) +
|
||||
bvec->bv_offset, pci_addr_in +
|
||||
bio_for_each_segment(bvec, rsp->bio, iter) {
|
||||
if (bytes_to_copy <= bvec.bv_len) {
|
||||
memcpy(page_address(bvec.bv_page) +
|
||||
bvec.bv_offset, pci_addr_in +
|
||||
offset, bytes_to_copy);
|
||||
break;
|
||||
} else {
|
||||
memcpy(page_address(bvec->bv_page) +
|
||||
bvec->bv_offset, pci_addr_in +
|
||||
offset, bvec->bv_len);
|
||||
bytes_to_copy -= bvec->bv_len;
|
||||
memcpy(page_address(bvec.bv_page) +
|
||||
bvec.bv_offset, pci_addr_in +
|
||||
offset, bvec.bv_len);
|
||||
bytes_to_copy -= bvec.bv_len;
|
||||
}
|
||||
offset += bvec->bv_len;
|
||||
offset += bvec.bv_len;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
Reference in New Issue
Block a user