lightnvm: make ppa_list const in nvm_set_rqd_list
authorMatias Bjørling <m@bjorling.me>
Thu, 7 Jul 2016 07:54:22 +0000 (09:54 +0200)
committerJens Axboe <axboe@fb.com>
Thu, 7 Jul 2016 14:51:52 +0000 (08:51 -0600)
The passed by reference ppa list in nvm_set_rqd_list() is updated when
multiple planes are available. In that case, each PPA plane is
incremented when the device side PPA list is created. This prevents the
caller to rely on the PPA list to be unmodified after a call.

Signed-off-by: Matias Bjørling <m@bjorling.me>
Signed-off-by: Jens Axboe <axboe@fb.com>
drivers/lightnvm/core.c
include/linux/lightnvm.h

index ddc809803084f687ad843f57bc44428c1ab6445e..00b64f78887dd54f36f0839af0259bd5917480f0 100644 (file)
@@ -237,9 +237,10 @@ void nvm_generic_to_addr_mode(struct nvm_dev *dev, struct nvm_rq *rqd)
 EXPORT_SYMBOL(nvm_generic_to_addr_mode);
 
 int nvm_set_rqd_ppalist(struct nvm_dev *dev, struct nvm_rq *rqd,
-                               struct ppa_addr *ppas, int nr_ppas, int vblk)
+                       const struct ppa_addr *ppas, int nr_ppas, int vblk)
 {
        int i, plane_cnt, pl_idx;
+       struct ppa_addr ppa;
 
        if ((!vblk || dev->plane_mode == NVM_PLANE_SINGLE) && nr_ppas == 1) {
                rqd->nr_ppas = nr_ppas;
@@ -264,8 +265,9 @@ int nvm_set_rqd_ppalist(struct nvm_dev *dev, struct nvm_rq *rqd,
 
                for (i = 0; i < nr_ppas; i++) {
                        for (pl_idx = 0; pl_idx < plane_cnt; pl_idx++) {
-                               ppas[i].g.pl = pl_idx;
-                               rqd->ppa_list[(pl_idx * nr_ppas) + i] = ppas[i];
+                               ppa = ppas[i];
+                               ppa.g.pl = pl_idx;
+                               rqd->ppa_list[(pl_idx * nr_ppas) + i] = ppa;
                        }
                }
        }
index e9836cfb6fdeb5098bb25ea22a33f46e9f7ffa02..ba78b830667435838e787055d0cb2012f1404d56 100644 (file)
@@ -534,7 +534,7 @@ extern int nvm_submit_io(struct nvm_dev *, struct nvm_rq *);
 extern void nvm_generic_to_addr_mode(struct nvm_dev *, struct nvm_rq *);
 extern void nvm_addr_to_generic_mode(struct nvm_dev *, struct nvm_rq *);
 extern int nvm_set_rqd_ppalist(struct nvm_dev *, struct nvm_rq *,
-                                               struct ppa_addr *, int, int);
+                                       const struct ppa_addr *, int, int);
 extern void nvm_free_rqd_ppalist(struct nvm_dev *, struct nvm_rq *);
 extern int nvm_erase_ppa(struct nvm_dev *, struct ppa_addr *, int);
 extern int nvm_erase_blk(struct nvm_dev *, struct nvm_block *);