Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 14db4917 authored by Bart Van Assche's avatar Bart Van Assche Committed by Jens Axboe
Browse files

target: Use sgl_alloc_order() and sgl_free()



Use the sgl_alloc_order() and sgl_free() functions instead of open
coding these functions.

Signed-off-by: default avatarBart Van Assche <bart.vanassche@wdc.com>
Acked-by: default avatarNicholas A. Bellinger <nab@linux-iscsi.org>
Reviewed-by: default avatarHannes Reinecke <hare@suse.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Sagi Grimberg <sagi@grimberg.me>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 68c6e9cd
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -5,6 +5,7 @@ menuconfig TARGET_CORE
	select CONFIGFS_FS
	select CRC_T10DIF
	select BLK_SCSI_REQUEST # only for scsi_command_size_tbl..
	select SGL_ALLOC
	default n
	help
	Say Y or M here to enable the TCM Storage Engine and ConfigFS enabled
+4 −42
Original line number Diff line number Diff line
@@ -2300,13 +2300,7 @@ static void target_complete_ok_work(struct work_struct *work)

void target_free_sgl(struct scatterlist *sgl, int nents)
{
	struct scatterlist *sg;
	int count;

	for_each_sg(sgl, sg, nents, count)
		__free_page(sg_page(sg));

	kfree(sgl);
	sgl_free(sgl);
}
EXPORT_SYMBOL(target_free_sgl);

@@ -2414,42 +2408,10 @@ int
target_alloc_sgl(struct scatterlist **sgl, unsigned int *nents, u32 length,
		 bool zero_page, bool chainable)
{
	struct scatterlist *sg;
	struct page *page;
	gfp_t zero_flag = (zero_page) ? __GFP_ZERO : 0;
	unsigned int nalloc, nent;
	int i = 0;

	nalloc = nent = DIV_ROUND_UP(length, PAGE_SIZE);
	if (chainable)
		nalloc++;
	sg = kmalloc_array(nalloc, sizeof(struct scatterlist), GFP_KERNEL);
	if (!sg)
		return -ENOMEM;

	sg_init_table(sg, nalloc);
	gfp_t gfp = GFP_KERNEL | (zero_page ? __GFP_ZERO : 0);

	while (length) {
		u32 page_len = min_t(u32, length, PAGE_SIZE);
		page = alloc_page(GFP_KERNEL | zero_flag);
		if (!page)
			goto out;

		sg_set_page(&sg[i], page, page_len, 0);
		length -= page_len;
		i++;
	}
	*sgl = sg;
	*nents = nent;
	return 0;

out:
	while (i > 0) {
		i--;
		__free_page(sg_page(&sg[i]));
	}
	kfree(sg);
	return -ENOMEM;
	*sgl = sgl_alloc_order(length, 0, chainable, gfp, nents);
	return *sgl ? 0 : -ENOMEM;
}
EXPORT_SYMBOL(target_alloc_sgl);