summaryrefslogtreecommitdiffstats
path: root/drivers/scsi/st.c
diff options
context:
space:
mode:
authorFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>2008-12-18 14:49:39 +0900
committerJames Bottomley <James.Bottomley@HansenPartnership.com>2009-01-02 11:53:19 -0600
commit9c905966c4d8c03ea21d230b277b7ea1e492f3c9 (patch)
treeace6d741448b50e69efb7a872e1389e297e5fec1 /drivers/scsi/st.c
parent97ae77a1cd332c7b011d71315c8faabce6840c72 (diff)
downloadlinux-stable-9c905966c4d8c03ea21d230b277b7ea1e492f3c9.tar.gz
linux-stable-9c905966c4d8c03ea21d230b277b7ea1e492f3c9.tar.bz2
linux-stable-9c905966c4d8c03ea21d230b277b7ea1e492f3c9.zip
[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>
Diffstat (limited to 'drivers/scsi/st.c')
-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
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;