Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

lightnvm: use end_io callback instead of instance

When the lightnvm core had the "gennvm" layer between the device and the
target, there was a need for the core to be able to figure out which
target it should send an end_io callback to. Leading to a "double"
end_io, first for the media manager instance, and then for the target
instance. Now that core and gennvm is merged, there is no longer a need
for this, and a single end_io callback will do.

Signed-off-by: Matias Bjørling <matias@cnexlabs.com>
Signed-off-by: Jens Axboe <axboe@fb.com>

authored by

Matias Bjørling and committed by
Jens Axboe
06894efe 84d4add7

+13 -20
+2 -1
drivers/block/null_blk.c
··· 420 420 { 421 421 struct nvm_rq *rqd = rq->end_io_data; 422 422 423 - nvm_end_io(rqd, error); 423 + rqd->error = error; 424 + nvm_end_io(rqd); 424 425 425 426 blk_put_request(rq); 426 427 }
+3 -4
drivers/lightnvm/core.c
··· 773 773 } 774 774 EXPORT_SYMBOL(nvm_free_rqd_ppalist); 775 775 776 - void nvm_end_io(struct nvm_rq *rqd, int error) 776 + void nvm_end_io(struct nvm_rq *rqd) 777 777 { 778 778 struct nvm_tgt_dev *tgt_dev = rqd->dev; 779 - struct nvm_tgt_instance *ins = rqd->ins; 780 779 781 780 /* Convert address space */ 782 781 if (tgt_dev) 783 782 nvm_rq_dev_to_tgt(tgt_dev, rqd); 784 783 785 - rqd->error = error; 786 - ins->tt->end_io(rqd); 784 + if (rqd->end_io) 785 + rqd->end_io(rqd); 787 786 } 788 787 EXPORT_SYMBOL(nvm_end_io); 789 788
+3 -4
drivers/lightnvm/rrpc.c
··· 779 779 780 780 static void rrpc_end_io(struct nvm_rq *rqd) 781 781 { 782 - struct rrpc *rrpc = container_of(rqd->ins, struct rrpc, instance); 782 + struct rrpc *rrpc = rqd->private; 783 783 struct nvm_tgt_dev *dev = rrpc->dev; 784 784 struct rrpc_rq *rrqd = nvm_rq_to_pdu(rqd); 785 785 uint8_t npages = rqd->nr_ppas; ··· 972 972 973 973 bio_get(bio); 974 974 rqd->bio = bio; 975 - rqd->ins = &rrpc->instance; 975 + rqd->private = rrpc; 976 976 rqd->nr_ppas = nr_pages; 977 + rqd->end_io = rrpc_end_io; 977 978 rrq->flags = flags; 978 979 979 980 err = nvm_submit_io(dev, rqd); ··· 1533 1532 if (!rrpc) 1534 1533 return ERR_PTR(-ENOMEM); 1535 1534 1536 - rrpc->instance.tt = &tt_rrpc; 1537 1535 rrpc->dev = dev; 1538 1536 rrpc->disk = tdisk; 1539 1537 ··· 1611 1611 1612 1612 .make_rq = rrpc_make_rq, 1613 1613 .capacity = rrpc_capacity, 1614 - .end_io = rrpc_end_io, 1615 1614 1616 1615 .init = rrpc_init, 1617 1616 .exit = rrpc_exit,
-3
drivers/lightnvm/rrpc.h
··· 102 102 }; 103 103 104 104 struct rrpc { 105 - /* instance must be kept in top to resolve rrpc in unprep */ 106 - struct nvm_tgt_instance instance; 107 - 108 105 struct nvm_tgt_dev *dev; 109 106 struct gendisk *disk; 110 107
+2 -1
drivers/nvme/host/lightnvm.c
··· 484 484 struct nvm_rq *rqd = rq->end_io_data; 485 485 486 486 rqd->ppa_status = nvme_req(rq)->result.u64; 487 - nvm_end_io(rqd, error); 487 + rqd->error = error; 488 + nvm_end_io(rqd); 488 489 489 490 kfree(nvme_req(rq)->cmd); 490 491 blk_mq_free_request(rq);
+3 -7
include/linux/lightnvm.h
··· 213 213 struct gendisk *disk; 214 214 }; 215 215 216 - struct nvm_tgt_instance { 217 - struct nvm_tgt_type *tt; 218 - }; 219 - 220 216 #define ADDR_EMPTY (~0ULL) 221 217 222 218 #define NVM_VERSION_MAJOR 1 ··· 223 227 typedef void (nvm_end_io_fn)(struct nvm_rq *); 224 228 225 229 struct nvm_rq { 226 - struct nvm_tgt_instance *ins; 227 230 struct nvm_tgt_dev *dev; 228 231 229 232 struct bio *bio; ··· 246 251 247 252 u64 ppa_status; /* ppa media status */ 248 253 int error; 254 + 255 + void *private; 249 256 }; 250 257 251 258 static inline struct nvm_rq *nvm_rq_from_pdu(void *pdu) ··· 447 450 /* target entry points */ 448 451 nvm_tgt_make_rq_fn *make_rq; 449 452 nvm_tgt_capacity_fn *capacity; 450 - nvm_end_io_fn *end_io; 451 453 452 454 /* module-specific init/teardown */ 453 455 nvm_tgt_init_fn *init; ··· 480 484 void *); 481 485 extern int nvm_get_area(struct nvm_tgt_dev *, sector_t *, sector_t); 482 486 extern void nvm_put_area(struct nvm_tgt_dev *, sector_t); 483 - extern void nvm_end_io(struct nvm_rq *, int); 487 + extern void nvm_end_io(struct nvm_rq *); 484 488 extern int nvm_bb_tbl_fold(struct nvm_dev *, u8 *, int); 485 489 extern int nvm_get_tgt_bb_tbl(struct nvm_tgt_dev *, struct ppa_addr, u8 *); 486 490