diff options
author | FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> | 2008-12-18 14:49:39 +0900 |
---|---|---|
committer | James Bottomley <James.Bottomley@HansenPartnership.com> | 2009-01-02 11:53:19 -0600 |
commit | 9c905966c4d8c03ea21d230b277b7ea1e492f3c9 (patch) | |
tree | ace6d741448b50e69efb7a872e1389e297e5fec1 | |
parent | 97ae77a1cd332c7b011d71315c8faabce6840c72 (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.c | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c index 7f3f317ee6c..3984cd82fe1 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 priority = GFP_KERNEL | __GFP_NOWARN; if (need_dma) priority |= GFP_DMA; - for (b_size = PAGE_SIZE, order=0; order <= 6 && - b_size < new_size - STbuffer->buffer_size; - order++, b_size *= 2) - ; /* empty */ + + if (STbuffer->frp_segs) { + 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 */ + } for (segs = STbuffer->frp_segs, got = STbuffer->buffer_size; segs < max_segs && got < new_size;) { STbuffer->frp[segs].page = alloc_pages(priority, order); 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); normalize_buffer(STbuffer); return 0; |