From 86f4ac32509fb32ab2bdec80b4c9b7bb4d9bdaaf Mon Sep 17 00:00:00 2001 From: Kai Makisara Date: Thu, 18 Dec 2008 14:49:51 +0900 Subject: [PATCH] --- yaml --- r: 127894 b: refs/heads/master c: 8f78fc5eb798426891f99390a61f752aaef9fc39 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/scsi/st.c | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 5de08f2fb5a7..0b326a49e010 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 02ae2c0e844e2864a877d1da8a92fe5e63778a18 +refs/heads/master: 8f78fc5eb798426891f99390a61f752aaef9fc39 diff --git a/trunk/drivers/scsi/st.c b/trunk/drivers/scsi/st.c index ddf2630b3479..c6f19ee8f2cb 100644 --- a/trunk/drivers/scsi/st.c +++ b/trunk/drivers/scsi/st.c @@ -3695,6 +3695,8 @@ static struct st_buffer *new_tape_buffer(int need_dma, int max_sg) /* Try to allocate enough space in the tape buffer */ +#define ST_MAX_ORDER 6 + static int enlarge_buffer(struct st_buffer * STbuffer, int new_size, int need_dma) { int segs, nbr, max_segs, b_size, order, got; @@ -3723,9 +3725,16 @@ static int enlarge_buffer(struct st_buffer * STbuffer, int new_size, int need_dm b_size = PAGE_SIZE << order; } else { for (b_size = PAGE_SIZE, order = 0; - order <= 6 && b_size < new_size; order++, b_size *= 2) + order < ST_MAX_ORDER && b_size < new_size; + order++, b_size *= 2) ; /* empty */ } + if (max_segs * (PAGE_SIZE << order) < new_size) { + if (order == ST_MAX_ORDER) + return 0; + normalize_buffer(STbuffer); + return enlarge_buffer(STbuffer, new_size, need_dma); + } for (segs = STbuffer->frp_segs, got = STbuffer->buffer_size; segs < max_segs && got < new_size;) {