]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/block/pktcdvd.c
Merge remote-tracking branch 'trivial/for-next'
[karo-tx-linux.git] / drivers / block / pktcdvd.c
index 49375a42feb91fc8a8864e7c193120b876898a71..cd813f9110bfc99314604fcf0ae93e58242ac413 100644 (file)
@@ -977,7 +977,7 @@ static void pkt_make_local_copy(struct packet_data *pkt, struct bio_vec *bvec)
        }
 }
 
-static void pkt_end_io_read(struct bio *bio, int err)
+static void pkt_end_io_read(struct bio *bio)
 {
        struct packet_data *pkt = bio->bi_private;
        struct pktcdvd_device *pd = pkt->pd;
@@ -985,9 +985,9 @@ static void pkt_end_io_read(struct bio *bio, int err)
 
        pkt_dbg(2, pd, "bio=%p sec0=%llx sec=%llx err=%d\n",
                bio, (unsigned long long)pkt->sector,
-               (unsigned long long)bio->bi_iter.bi_sector, err);
+               (unsigned long long)bio->bi_iter.bi_sector, bio->bi_error);
 
-       if (err)
+       if (bio->bi_error)
                atomic_inc(&pkt->io_errors);
        if (atomic_dec_and_test(&pkt->io_wait)) {
                atomic_inc(&pkt->run_sm);
@@ -996,13 +996,13 @@ static void pkt_end_io_read(struct bio *bio, int err)
        pkt_bio_finished(pd);
 }
 
-static void pkt_end_io_packet_write(struct bio *bio, int err)
+static void pkt_end_io_packet_write(struct bio *bio)
 {
        struct packet_data *pkt = bio->bi_private;
        struct pktcdvd_device *pd = pkt->pd;
        BUG_ON(!pd);
 
-       pkt_dbg(2, pd, "id=%d, err=%d\n", pkt->id, err);
+       pkt_dbg(2, pd, "id=%d, err=%d\n", pkt->id, bio->bi_error);
 
        pd->stats.pkt_ended++;
 
@@ -1340,22 +1340,22 @@ static void pkt_start_write(struct pktcdvd_device *pd, struct packet_data *pkt)
        pkt_queue_bio(pd, pkt->w_bio);
 }
 
-static void pkt_finish_packet(struct packet_data *pkt, int uptodate)
+static void pkt_finish_packet(struct packet_data *pkt, int error)
 {
        struct bio *bio;
 
-       if (!uptodate)
+       if (error)
                pkt->cache_valid = 0;
 
        /* Finish all bios corresponding to this packet */
-       while ((bio = bio_list_pop(&pkt->orig_bios)))
-               bio_endio(bio, uptodate ? 0 : -EIO);
+       while ((bio = bio_list_pop(&pkt->orig_bios))) {
+               bio->bi_error = error;
+               bio_endio(bio);
+       }
 }
 
 static void pkt_run_state_machine(struct pktcdvd_device *pd, struct packet_data *pkt)
 {
-       int uptodate;
-
        pkt_dbg(2, pd, "pkt %d\n", pkt->id);
 
        for (;;) {
@@ -1384,7 +1384,7 @@ static void pkt_run_state_machine(struct pktcdvd_device *pd, struct packet_data
                        if (atomic_read(&pkt->io_wait) > 0)
                                return;
 
-                       if (test_bit(BIO_UPTODATE, &pkt->w_bio->bi_flags)) {
+                       if (!pkt->w_bio->bi_error) {
                                pkt_set_state(pkt, PACKET_FINISHED_STATE);
                        } else {
                                pkt_set_state(pkt, PACKET_RECOVERY_STATE);
@@ -1401,8 +1401,7 @@ static void pkt_run_state_machine(struct pktcdvd_device *pd, struct packet_data
                        break;
 
                case PACKET_FINISHED_STATE:
-                       uptodate = test_bit(BIO_UPTODATE, &pkt->w_bio->bi_flags);
-                       pkt_finish_packet(pkt, uptodate);
+                       pkt_finish_packet(pkt, pkt->w_bio->bi_error);
                        return;
 
                default:
@@ -2332,13 +2331,14 @@ static void pkt_close(struct gendisk *disk, fmode_t mode)
 }
 
 
-static void pkt_end_io_read_cloned(struct bio *bio, int err)
+static void pkt_end_io_read_cloned(struct bio *bio)
 {
        struct packet_stacked_data *psd = bio->bi_private;
        struct pktcdvd_device *pd = psd->pd;
 
+       psd->bio->bi_error = bio->bi_error;
        bio_put(bio);
-       bio_endio(psd->bio, err);
+       bio_endio(psd->bio);
        mempool_free(psd, psd_pool);
        pkt_bio_finished(pd);
 }
@@ -2447,6 +2447,10 @@ static void pkt_make_request(struct request_queue *q, struct bio *bio)
        char b[BDEVNAME_SIZE];
        struct bio *split;
 
+       blk_queue_bounce(q, &bio);
+
+       blk_queue_split(q, &bio, q->bio_split);
+
        pd = q->queuedata;
        if (!pd) {
                pr_err("%s incorrect request queue\n",
@@ -2477,8 +2481,6 @@ static void pkt_make_request(struct request_queue *q, struct bio *bio)
                goto end_io;
        }
 
-       blk_queue_bounce(q, &bio);
-
        do {
                sector_t zone = get_zone(bio->bi_iter.bi_sector, pd);
                sector_t last_zone = get_zone(bio_end_sector(bio) - 1, pd);
@@ -2504,26 +2506,6 @@ end_io:
 
 
 
-static int pkt_merge_bvec(struct request_queue *q, struct bvec_merge_data *bmd,
-                         struct bio_vec *bvec)
-{
-       struct pktcdvd_device *pd = q->queuedata;
-       sector_t zone = get_zone(bmd->bi_sector, pd);
-       int used = ((bmd->bi_sector - zone) << 9) + bmd->bi_size;
-       int remaining = (pd->settings.size << 9) - used;
-       int remaining2;
-
-       /*
-        * A bio <= PAGE_SIZE must be allowed. If it crosses a packet
-        * boundary, pkt_make_request() will split the bio.
-        */
-       remaining2 = PAGE_SIZE - bmd->bi_size;
-       remaining = max(remaining, remaining2);
-
-       BUG_ON(remaining < 0);
-       return remaining;
-}
-
 static void pkt_init_queue(struct pktcdvd_device *pd)
 {
        struct request_queue *q = pd->disk->queue;
@@ -2531,7 +2513,6 @@ static void pkt_init_queue(struct pktcdvd_device *pd)
        blk_queue_make_request(q, pkt_make_request);
        blk_queue_logical_block_size(q, CD_FRAMESIZE);
        blk_queue_max_hw_sectors(q, PACKET_MAX_SECTORS);
-       blk_queue_merge_bvec(q, pkt_merge_bvec);
        q->queuedata = pd;
 }