]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - drivers/lightnvm/pblk-recovery.c
Merge tag 'nfs-for-4.13-1' of git://git.linux-nfs.org/projects/anna/linux-nfs
[mirror_ubuntu-artful-kernel.git] / drivers / lightnvm / pblk-recovery.c
index 0e48d3e4e143773fb937b2d3713c5e0c34adf799..cb556e06673e7465bf856cab8e3329867e676382 100644 (file)
@@ -340,9 +340,14 @@ static void pblk_end_io_recov(struct nvm_rq *rqd)
        struct pblk *pblk = pad_rq->pblk;
        struct nvm_tgt_dev *dev = pblk->dev;
 
-       kref_put(&pad_rq->ref, pblk_recov_complete);
+       pblk_up_page(pblk, rqd->ppa_list, rqd->nr_ppas);
+
+       bio_put(rqd->bio);
        nvm_dev_dma_free(dev->parent, rqd->meta_list, rqd->dma_meta_list);
        pblk_free_rqd(pblk, rqd, WRITE);
+
+       atomic_dec(&pblk->inflight_io);
+       kref_put(&pad_rq->ref, pblk_recov_complete);
 }
 
 static int pblk_recov_pad_oob(struct pblk *pblk, struct pblk_line *line,
@@ -385,7 +390,7 @@ next_pad_rq:
        rq_ppas = pblk_calc_secs(pblk, left_ppas, 0);
        if (rq_ppas < pblk->min_write_pgs) {
                pr_err("pblk: corrupted pad line %d\n", line->id);
-               goto free_rq;
+               goto fail_free_pad;
        }
 
        rq_len = rq_ppas * geo->sec_size;
@@ -393,7 +398,7 @@ next_pad_rq:
        meta_list = nvm_dev_dma_alloc(dev->parent, GFP_KERNEL, &dma_meta_list);
        if (!meta_list) {
                ret = -ENOMEM;
-               goto free_data;
+               goto fail_free_pad;
        }
 
        ppa_list = (void *)(meta_list) + pblk_dma_meta_size;
@@ -404,9 +409,9 @@ next_pad_rq:
                ret = PTR_ERR(rqd);
                goto fail_free_meta;
        }
-       memset(rqd, 0, pblk_w_rq_size);
 
-       bio = bio_map_kern(dev->q, data, rq_len, GFP_KERNEL);
+       bio = pblk_bio_map_addr(pblk, data, rq_ppas, rq_len,
+                                               PBLK_VMALLOC_META, GFP_KERNEL);
        if (IS_ERR(bio)) {
                ret = PTR_ERR(bio);
                goto fail_free_rqd;
@@ -453,15 +458,15 @@ next_pad_rq:
        }
 
        kref_get(&pad_rq->ref);
+       pblk_down_page(pblk, rqd->ppa_list, rqd->nr_ppas);
 
        ret = pblk_submit_io(pblk, rqd);
        if (ret) {
                pr_err("pblk: I/O submission failed: %d\n", ret);
-               goto free_data;
+               pblk_up_page(pblk, rqd->ppa_list, rqd->nr_ppas);
+               goto fail_free_bio;
        }
 
-       atomic_dec(&pblk->inflight_io);
-
        left_line_ppas -= rq_ppas;
        left_ppas -= rq_ppas;
        if (left_ppas && left_line_ppas)
@@ -475,17 +480,23 @@ next_pad_rq:
                ret = -ETIME;
        }
 
+       if (!pblk_line_is_full(line))
+               pr_err("pblk: corrupted padded line: %d\n", line->id);
+
+       vfree(data);
 free_rq:
        kfree(pad_rq);
-free_data:
-       vfree(data);
        return ret;
 
+fail_free_bio:
+       bio_put(bio);
 fail_free_rqd:
        pblk_free_rqd(pblk, rqd, WRITE);
 fail_free_meta:
        nvm_dev_dma_free(dev->parent, meta_list, dma_meta_list);
+fail_free_pad:
        kfree(pad_rq);
+       vfree(data);
        return ret;
 }