mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 11:11:45 -04:00
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:
commit
f568849eda
139 changed files with 2144 additions and 2683 deletions
|
|
@ -2163,10 +2163,10 @@ int sas_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy,
|
|||
}
|
||||
|
||||
/* do we need to support multiple segments? */
|
||||
if (bio_segments(req->bio) > 1 || bio_segments(rsp->bio) > 1) {
|
||||
printk("%s: multiple segments req %u %u, rsp %u %u\n",
|
||||
__func__, bio_segments(req->bio), blk_rq_bytes(req),
|
||||
bio_segments(rsp->bio), blk_rq_bytes(rsp));
|
||||
if (bio_multiple_segments(req->bio) ||
|
||||
bio_multiple_segments(rsp->bio)) {
|
||||
printk("%s: multiple segments req %u, rsp %u\n",
|
||||
__func__, blk_rq_bytes(req), blk_rq_bytes(rsp));
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -1884,7 +1884,7 @@ _transport_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy,
|
|||
struct MPT3SAS_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;
|
||||
|
|
@ -1898,7 +1898,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) {
|
||||
pr_err(MPT3SAS_FMT "%s: the smp response space is missing\n",
|
||||
|
|
@ -1925,7 +1926,7 @@ _transport_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy,
|
|||
ioc->transport_cmds.status = MPT3_CMD_PENDING;
|
||||
|
||||
/* Check if the request is split across multiple segments */
|
||||
if (req->bio->bi_vcnt > 1) {
|
||||
if (bio_multiple_segments(req->bio)) {
|
||||
u32 offset = 0;
|
||||
|
||||
/* Allocate memory and copy the request */
|
||||
|
|
@ -1938,11 +1939,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),
|
||||
|
|
@ -1957,7 +1958,7 @@ _transport_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy,
|
|||
|
||||
/* Check if the response needs to be populated across
|
||||
* multiple segments */
|
||||
if (rsp->bio->bi_vcnt > 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) {
|
||||
|
|
@ -2018,7 +2019,7 @@ _transport_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy,
|
|||
mpi_request->RequestDataLength = cpu_to_le16(blk_rq_bytes(req) - 4);
|
||||
psge = &mpi_request->SGL;
|
||||
|
||||
if (req->bio->bi_vcnt > 1)
|
||||
if (bio_multiple_segments(req->bio))
|
||||
ioc->build_sg(ioc, psge, pci_dma_out, (blk_rq_bytes(req) - 4),
|
||||
pci_dma_in, (blk_rq_bytes(rsp) + 4));
|
||||
else
|
||||
|
|
@ -2063,23 +2064,23 @@ _transport_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy,
|
|||
|
||||
/* check if the resp needs to be copied from the allocated
|
||||
* pci mem */
|
||||
if (rsp->bio->bi_vcnt > 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 {
|
||||
|
|
|
|||
|
|
@ -731,7 +731,7 @@ static int _osd_req_list_objects(struct osd_request *or,
|
|||
|
||||
bio->bi_rw &= ~REQ_WRITE;
|
||||
or->in.bio = bio;
|
||||
or->in.total_bytes = bio->bi_size;
|
||||
or->in.total_bytes = bio->bi_iter.bi_size;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -801,7 +801,7 @@ static int sd_setup_write_same_cmnd(struct scsi_device *sdp, struct request *rq)
|
|||
if (sdkp->device->no_write_same)
|
||||
return BLKPREP_KILL;
|
||||
|
||||
BUG_ON(bio_offset(bio) || bio_iovec(bio)->bv_len != sdp->sector_size);
|
||||
BUG_ON(bio_offset(bio) || bio_iovec(bio).bv_len != sdp->sector_size);
|
||||
|
||||
sector >>= ilog2(sdp->sector_size) - 9;
|
||||
nr_sectors >>= ilog2(sdp->sector_size) - 9;
|
||||
|
|
|
|||
|
|
@ -365,7 +365,6 @@ void sd_dif_prepare(struct request *rq, sector_t hw_sector,
|
|||
struct bio *bio;
|
||||
struct scsi_disk *sdkp;
|
||||
struct sd_dif_tuple *sdt;
|
||||
unsigned int i, j;
|
||||
u32 phys, virt;
|
||||
|
||||
sdkp = rq->bio->bi_bdev->bd_disk->private_data;
|
||||
|
|
@ -376,19 +375,21 @@ void sd_dif_prepare(struct request *rq, sector_t hw_sector,
|
|||
phys = hw_sector & 0xffffffff;
|
||||
|
||||
__rq_for_each_bio(bio, rq) {
|
||||
struct bio_vec *iv;
|
||||
struct bio_vec iv;
|
||||
struct bvec_iter iter;
|
||||
unsigned int j;
|
||||
|
||||
/* Already remapped? */
|
||||
if (bio_flagged(bio, BIO_MAPPED_INTEGRITY))
|
||||
break;
|
||||
|
||||
virt = bio->bi_integrity->bip_sector & 0xffffffff;
|
||||
virt = bio->bi_integrity->bip_iter.bi_sector & 0xffffffff;
|
||||
|
||||
bip_for_each_vec(iv, bio->bi_integrity, i) {
|
||||
sdt = kmap_atomic(iv->bv_page)
|
||||
+ iv->bv_offset;
|
||||
bip_for_each_vec(iv, bio->bi_integrity, iter) {
|
||||
sdt = kmap_atomic(iv.bv_page)
|
||||
+ iv.bv_offset;
|
||||
|
||||
for (j = 0 ; j < iv->bv_len ; j += tuple_sz, sdt++) {
|
||||
for (j = 0; j < iv.bv_len; j += tuple_sz, sdt++) {
|
||||
|
||||
if (be32_to_cpu(sdt->ref_tag) == virt)
|
||||
sdt->ref_tag = cpu_to_be32(phys);
|
||||
|
|
@ -414,7 +415,7 @@ void sd_dif_complete(struct scsi_cmnd *scmd, unsigned int good_bytes)
|
|||
struct scsi_disk *sdkp;
|
||||
struct bio *bio;
|
||||
struct sd_dif_tuple *sdt;
|
||||
unsigned int i, j, sectors, sector_sz;
|
||||
unsigned int j, sectors, sector_sz;
|
||||
u32 phys, virt;
|
||||
|
||||
sdkp = scsi_disk(scmd->request->rq_disk);
|
||||
|
|
@ -430,15 +431,16 @@ void sd_dif_complete(struct scsi_cmnd *scmd, unsigned int good_bytes)
|
|||
phys >>= 3;
|
||||
|
||||
__rq_for_each_bio(bio, scmd->request) {
|
||||
struct bio_vec *iv;
|
||||
struct bio_vec iv;
|
||||
struct bvec_iter iter;
|
||||
|
||||
virt = bio->bi_integrity->bip_sector & 0xffffffff;
|
||||
virt = bio->bi_integrity->bip_iter.bi_sector & 0xffffffff;
|
||||
|
||||
bip_for_each_vec(iv, bio->bi_integrity, i) {
|
||||
sdt = kmap_atomic(iv->bv_page)
|
||||
+ iv->bv_offset;
|
||||
bip_for_each_vec(iv, bio->bi_integrity, iter) {
|
||||
sdt = kmap_atomic(iv.bv_page)
|
||||
+ iv.bv_offset;
|
||||
|
||||
for (j = 0 ; j < iv->bv_len ; j += tuple_sz, sdt++) {
|
||||
for (j = 0; j < iv.bv_len; j += tuple_sz, sdt++) {
|
||||
|
||||
if (sectors == 0) {
|
||||
kunmap_atomic(sdt);
|
||||
|
|
|
|||
Loading…
Reference in a new issue