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

Commit 9c905966 authored by FUJITA Tomonori's avatar FUJITA Tomonori Committed by James Bottomley
Browse files

[SCSI] st: make all the fragment buffers the same size



This patch simiplifies the fragment buffer management a bit, all the
buffers in the fragment list become the same size. This is necessary
to use the block layer API (sg driver was modified in the same way)
since the block layer API takes the same size page frames instead of
scatter gatter.

Signed-off-by: default avatarFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Acked-by: default avatarKai Makisara <Kai.Makisara@kolumbus.fi>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@HansenPartnership.com>
parent 97ae77a1
Loading
Loading
Loading
Loading
+9 −9
Original line number Original line Diff line number Diff line
@@ -3747,20 +3747,20 @@ static int enlarge_buffer(struct st_buffer * STbuffer, int new_size, int need_dm
	priority = GFP_KERNEL | __GFP_NOWARN;
	priority = GFP_KERNEL | __GFP_NOWARN;
	if (need_dma)
	if (need_dma)
		priority |= GFP_DMA;
		priority |= GFP_DMA;
	for (b_size = PAGE_SIZE, order=0; order <= 6 &&

	     b_size < new_size - STbuffer->buffer_size;
	if (STbuffer->frp_segs) {
	     order++, b_size *= 2)
		b_size = STbuffer->frp[0].length;
		order = get_order(b_size);
	} else {
		for (b_size = PAGE_SIZE, order = 0;
		     order <= 6 && b_size < new_size; order++, b_size *= 2)
			;  /* empty */
			;  /* empty */
	}


	for (segs = STbuffer->frp_segs, got = STbuffer->buffer_size;
	for (segs = STbuffer->frp_segs, got = STbuffer->buffer_size;
	     segs < max_segs && got < new_size;) {
	     segs < max_segs && got < new_size;) {
		STbuffer->frp[segs].page = alloc_pages(priority, order);
		STbuffer->frp[segs].page = alloc_pages(priority, order);
		if (STbuffer->frp[segs].page == NULL) {
		if (STbuffer->frp[segs].page == NULL) {
			if (new_size - got <= (max_segs - segs) * b_size / 2) {
				b_size /= 2; /* Large enough for the rest of the buffers */
				order--;
				continue;
			}
			DEB(STbuffer->buffer_size = got);
			DEB(STbuffer->buffer_size = got);
			normalize_buffer(STbuffer);
			normalize_buffer(STbuffer);
			return 0;
			return 0;