Skip to content

Commit

Permalink
[SCSI] st: fix enlarge_buffer
Browse files Browse the repository at this point in the history
This patch removes a bug in enlarge_buffer() that can make a
read or write fail under special conditions.

After changing TRY_DIRECT_IO to 0 and ST_MAX_SG to 32 in
st_options.h, a program that writes a first block of 128k and
than a second bigger block (e.g. 256k) fails. The second write
returns errno EOVERFLOW, as enlarge_buffer() checks the sg list
and detects that it already is full.
As enlarge_buffer uses different page allocation orders
depending on the size of the buffer needed, the check does not
make sense.

Signed-off-by: Bodo Stroesser <bstroesser@ts.fujitsu.com>
Acked-by: Kai Mäkisara <kai.makisara@kolumbus.fi>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
  • Loading branch information
Bodo Stroesser authored and James Bottomley committed Dec 20, 2013
1 parent 762a86a commit 769989a
Showing 1 changed file with 1 addition and 4 deletions.
5 changes: 1 addition & 4 deletions drivers/scsi/st.c
Original file line number Diff line number Diff line change
Expand Up @@ -3719,7 +3719,7 @@ static struct st_buffer *new_tape_buffer(int need_dma, int max_sg)

static int enlarge_buffer(struct st_buffer * STbuffer, int new_size, int need_dma)
{
int segs, nbr, max_segs, b_size, order, got;
int segs, max_segs, b_size, order, got;
gfp_t priority;

if (new_size <= STbuffer->buffer_size)
Expand All @@ -3729,9 +3729,6 @@ static int enlarge_buffer(struct st_buffer * STbuffer, int new_size, int need_dm
normalize_buffer(STbuffer); /* Avoid extra segment */

max_segs = STbuffer->use_sg;
nbr = max_segs - STbuffer->frp_segs;
if (nbr <= 0)
return 0;

priority = GFP_KERNEL | __GFP_NOWARN;
if (need_dma)
Expand Down

0 comments on commit 769989a

Please sign in to comment.