aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBart Van Assche <bart.vanassche@wdc.com>2018-01-05 11:26:48 -0500
committerJens Axboe <axboe@kernel.dk>2018-01-06 11:18:00 -0500
commit4442b56fb5151e9a7e21c0f73aba5a071f559dce (patch)
tree89aa8a62e66637870fc0f6c020c74ce389394278
parent8cd579d2794b90f810e534e75783ba78cdc91a07 (diff)
nvmet/fc: Use sgl_alloc() and sgl_free()
Use the sgl_alloc() and sgl_free() functions instead of open coding these functions. Signed-off-by: Bart Van Assche <bart.vanassche@wdc.com> Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de> Reviewed-by: Hannes Reinecke <hare@suse.com> Reviewed-by: James Smart <james.smart@broadcom.com> Cc: Keith Busch <keith.busch@intel.com> Cc: Christoph Hellwig <hch@lst.de> Cc: Sagi Grimberg <sagi@grimberg.me> Signed-off-by: Jens Axboe <axboe@kernel.dk>
-rw-r--r--drivers/nvme/target/Kconfig1
-rw-r--r--drivers/nvme/target/fc.c36
2 files changed, 3 insertions, 34 deletions
diff --git a/drivers/nvme/target/Kconfig b/drivers/nvme/target/Kconfig
index 03e4ab65fe77..4d9715630e21 100644
--- a/drivers/nvme/target/Kconfig
+++ b/drivers/nvme/target/Kconfig
@@ -39,6 +39,7 @@ config NVME_TARGET_FC
39 tristate "NVMe over Fabrics FC target driver" 39 tristate "NVMe over Fabrics FC target driver"
40 depends on NVME_TARGET 40 depends on NVME_TARGET
41 depends on HAS_DMA 41 depends on HAS_DMA
42 select SGL_ALLOC
42 help 43 help
43 This enables the NVMe FC target support, which allows exporting NVMe 44 This enables the NVMe FC target support, which allows exporting NVMe
44 devices over FC. 45 devices over FC.
diff --git a/drivers/nvme/target/fc.c b/drivers/nvme/target/fc.c
index 5fd86039e353..840d1a39de33 100644
--- a/drivers/nvme/target/fc.c
+++ b/drivers/nvme/target/fc.c
@@ -1697,31 +1697,12 @@ static int
1697nvmet_fc_alloc_tgt_pgs(struct nvmet_fc_fcp_iod *fod) 1697nvmet_fc_alloc_tgt_pgs(struct nvmet_fc_fcp_iod *fod)
1698{ 1698{
1699 struct scatterlist *sg; 1699 struct scatterlist *sg;
1700 struct page *page;
1701 unsigned int nent; 1700 unsigned int nent;
1702 u32 page_len, length;
1703 int i = 0;
1704 1701
1705 length = fod->req.transfer_len; 1702 sg = sgl_alloc(fod->req.transfer_len, GFP_KERNEL, &nent);
1706 nent = DIV_ROUND_UP(length, PAGE_SIZE);
1707 sg = kmalloc_array(nent, sizeof(struct scatterlist), GFP_KERNEL);
1708 if (!sg) 1703 if (!sg)
1709 goto out; 1704 goto out;
1710 1705
1711 sg_init_table(sg, nent);
1712
1713 while (length) {
1714 page_len = min_t(u32, length, PAGE_SIZE);
1715
1716 page = alloc_page(GFP_KERNEL);
1717 if (!page)
1718 goto out_free_pages;
1719
1720 sg_set_page(&sg[i], page, page_len, 0);
1721 length -= page_len;
1722 i++;
1723 }
1724
1725 fod->data_sg = sg; 1706 fod->data_sg = sg;
1726 fod->data_sg_cnt = nent; 1707 fod->data_sg_cnt = nent;
1727 fod->data_sg_cnt = fc_dma_map_sg(fod->tgtport->dev, sg, nent, 1708 fod->data_sg_cnt = fc_dma_map_sg(fod->tgtport->dev, sg, nent,
@@ -1731,14 +1712,6 @@ nvmet_fc_alloc_tgt_pgs(struct nvmet_fc_fcp_iod *fod)
1731 1712
1732 return 0; 1713 return 0;
1733 1714
1734out_free_pages:
1735 while (i > 0) {
1736 i--;
1737 __free_page(sg_page(&sg[i]));
1738 }
1739 kfree(sg);
1740 fod->data_sg = NULL;
1741 fod->data_sg_cnt = 0;
1742out: 1715out:
1743 return NVME_SC_INTERNAL; 1716 return NVME_SC_INTERNAL;
1744} 1717}
@@ -1746,18 +1719,13 @@ out:
1746static void 1719static void
1747nvmet_fc_free_tgt_pgs(struct nvmet_fc_fcp_iod *fod) 1720nvmet_fc_free_tgt_pgs(struct nvmet_fc_fcp_iod *fod)
1748{ 1721{
1749 struct scatterlist *sg;
1750 int count;
1751
1752 if (!fod->data_sg || !fod->data_sg_cnt) 1722 if (!fod->data_sg || !fod->data_sg_cnt)
1753 return; 1723 return;
1754 1724
1755 fc_dma_unmap_sg(fod->tgtport->dev, fod->data_sg, fod->data_sg_cnt, 1725 fc_dma_unmap_sg(fod->tgtport->dev, fod->data_sg, fod->data_sg_cnt,
1756 ((fod->io_dir == NVMET_FCP_WRITE) ? 1726 ((fod->io_dir == NVMET_FCP_WRITE) ?
1757 DMA_FROM_DEVICE : DMA_TO_DEVICE)); 1727 DMA_FROM_DEVICE : DMA_TO_DEVICE));
1758 for_each_sg(fod->data_sg, sg, fod->data_sg_cnt, count) 1728 sgl_free(fod->data_sg);
1759 __free_page(sg_page(sg));
1760 kfree(fod->data_sg);
1761 fod->data_sg = NULL; 1729 fod->data_sg = NULL;
1762 fod->data_sg_cnt = 0; 1730 fod->data_sg_cnt = 0;
1763} 1731}