aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>2008-12-18 00:49:39 -0500
committerJames Bottomley <James.Bottomley@HansenPartnership.com>2009-01-02 12:53:19 -0500
commit9c905966c4d8c03ea21d230b277b7ea1e492f3c9 (patch)
treeace6d741448b50e69efb7a872e1389e297e5fec1
parent97ae77a1cd332c7b011d71315c8faabce6840c72 (diff)
[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: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> Acked-by: Kai Makisara <Kai.Makisara@kolumbus.fi> Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
-rw-r--r--drivers/scsi/st.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c
index 7f3f317ee6ca..3984cd82fe10 100644
--- a/drivers/scsi/st.c
+++ b/drivers/scsi/st.c
@@ -3747,20 +3747,20 @@ static int enlarge_buffer(struct st_buffer * STbuffer, int new_size, int need_dm
3747 priority = GFP_KERNEL | __GFP_NOWARN; 3747 priority = GFP_KERNEL | __GFP_NOWARN;
3748 if (need_dma) 3748 if (need_dma)
3749 priority |= GFP_DMA; 3749 priority |= GFP_DMA;
3750 for (b_size = PAGE_SIZE, order=0; order <= 6 && 3750
3751 b_size < new_size - STbuffer->buffer_size; 3751 if (STbuffer->frp_segs) {
3752 order++, b_size *= 2) 3752 b_size = STbuffer->frp[0].length;
3753 ; /* empty */ 3753 order = get_order(b_size);
3754 } else {
3755 for (b_size = PAGE_SIZE, order = 0;
3756 order <= 6 && b_size < new_size; order++, b_size *= 2)
3757 ; /* empty */
3758 }
3754 3759
3755 for (segs = STbuffer->frp_segs, got = STbuffer->buffer_size; 3760 for (segs = STbuffer->frp_segs, got = STbuffer->buffer_size;
3756 segs < max_segs && got < new_size;) { 3761 segs < max_segs && got < new_size;) {
3757 STbuffer->frp[segs].page = alloc_pages(priority, order); 3762 STbuffer->frp[segs].page = alloc_pages(priority, order);
3758 if (STbuffer->frp[segs].page == NULL) { 3763 if (STbuffer->frp[segs].page == NULL) {
3759 if (new_size - got <= (max_segs - segs) * b_size / 2) {
3760 b_size /= 2; /* Large enough for the rest of the buffers */
3761 order--;
3762 continue;
3763 }
3764 DEB(STbuffer->buffer_size = got); 3764 DEB(STbuffer->buffer_size = got);
3765 normalize_buffer(STbuffer); 3765 normalize_buffer(STbuffer);
3766 return 0; 3766 return 0;