diff options
author | Bart Van Assche <bart.vanassche@wdc.com> | 2018-01-05 11:26:48 -0500 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2018-01-06 11:18:00 -0500 |
commit | 4442b56fb5151e9a7e21c0f73aba5a071f559dce (patch) | |
tree | 89aa8a62e66637870fc0f6c020c74ce389394278 | |
parent | 8cd579d2794b90f810e534e75783ba78cdc91a07 (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/Kconfig | 1 | ||||
-rw-r--r-- | drivers/nvme/target/fc.c | 36 |
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 | |||
1697 | nvmet_fc_alloc_tgt_pgs(struct nvmet_fc_fcp_iod *fod) | 1697 | nvmet_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 | ||
1734 | out_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; | ||
1742 | out: | 1715 | out: |
1743 | return NVME_SC_INTERNAL; | 1716 | return NVME_SC_INTERNAL; |
1744 | } | 1717 | } |
@@ -1746,18 +1719,13 @@ out: | |||
1746 | static void | 1719 | static void |
1747 | nvmet_fc_free_tgt_pgs(struct nvmet_fc_fcp_iod *fod) | 1720 | nvmet_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 | } |