patch-2.4.13 linux/drivers/scsi/sr.c
Next file: linux/drivers/scsi/sr_ioctl.c
Previous file: linux/drivers/scsi/sd.c
Back to the patch index
Back to the overall index
- Lines: 69
- Date:
Fri Oct 12 15:35:54 2001
- Orig file:
v2.4.12/linux/drivers/scsi/sr.c
- Orig date:
Tue Oct 9 17:06:52 2001
diff -u --recursive --new-file v2.4.12/linux/drivers/scsi/sr.c linux/drivers/scsi/sr.c
@@ -264,6 +264,7 @@
struct scatterlist *sg, *old_sg = NULL;
int i, fsize, bsize, sg_ent, sg_count;
char *front, *back;
+ void **bbpnt, **old_bbpnt = NULL;
back = front = NULL;
sg_ent = SCpnt->use_sg;
@@ -291,17 +292,25 @@
* extend or allocate new scatter-gather table
*/
sg_count = SCpnt->use_sg;
- if (sg_count)
+ if (sg_count) {
old_sg = (struct scatterlist *) SCpnt->request_buffer;
- else {
+ old_bbpnt = SCpnt->bounce_buffers;
+ } else {
sg_count = 1;
sg_ent++;
}
- i = ((sg_ent * sizeof(struct scatterlist)) + 511) & ~511;
+ /* Get space for scatterlist and bounce buffer array. */
+ i = sg_ent * sizeof(struct scatterlist);
+ i += sg_ent * sizeof(void *);
+ i = (i + 511) & ~511;
+
if ((sg = scsi_malloc(i)) == NULL)
goto no_mem;
+ bbpnt = (void **)
+ ((char *)sg + (sg_ent * sizeof(struct scatterlist)));
+
/*
* no more failing memory allocs possible, we can safely assign
* SCpnt values now
@@ -312,13 +321,15 @@
i = 0;
if (fsize) {
- sg[0].address = sg[0].alt_address = front;
+ sg[0].address = bbpnt[0] = front;
sg[0].length = fsize;
i++;
}
if (old_sg) {
memcpy(sg + i, old_sg, SCpnt->use_sg * sizeof(struct scatterlist));
- scsi_free(old_sg, ((SCpnt->use_sg * sizeof(struct scatterlist)) + 511) & ~511);
+ memcpy(bbpnt + i, old_bbpnt, SCpnt->use_sg * sizeof(void *));
+ scsi_free(old_sg, (((SCpnt->use_sg * sizeof(struct scatterlist)) +
+ (SCpnt->use_sg * sizeof(void *))) + 511) & ~511);
} else {
sg[i].address = SCpnt->request_buffer;
sg[i].length = SCpnt->request_bufflen;
@@ -326,11 +337,12 @@
SCpnt->request_bufflen += (fsize + bsize);
SCpnt->request_buffer = sg;
+ SCpnt->bounce_buffers = bbpnt;
SCpnt->use_sg += i;
if (bsize) {
sg[SCpnt->use_sg].address = back;
- sg[SCpnt->use_sg].alt_address = back;
+ bbpnt[SCpnt->use_sg] = back;
sg[SCpnt->use_sg].length = bsize;
SCpnt->use_sg++;
}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)