patch-2.4.0-test6 linux/drivers/scsi/sg.c
Next file: linux/drivers/scsi/st.c
Previous file: linux/drivers/scsi/scsi.c
Back to the patch index
Back to the overall index
- Lines: 127
- Date:
Sun Aug 6 11:43:17 2000
- Orig file:
v2.4.0-test5/linux/drivers/scsi/sg.c
- Orig date:
Fri Jul 14 12:12:12 2000
diff -u --recursive --new-file v2.4.0-test5/linux/drivers/scsi/sg.c linux/drivers/scsi/sg.c
@@ -17,8 +17,8 @@
* any later version.
*
*/
- static char * sg_version_str = "Version: 3.1.15 (20000528)";
- static int sg_version_num = 30115; /* 2 digits for each component */
+ static char * sg_version_str = "Version: 3.1.16 (20000716)";
+ static int sg_version_num = 30116; /* 2 digits for each component */
/*
* D. P. Gilbert (dgilbert@interlog.com, dougg@triode.net.au), notes:
* - scsi logging is available via SCSI_LOG_TIMEOUT macros. First
@@ -1467,9 +1467,9 @@
}
schp->mapped = 1;
kp = schp->kiobp;
- prev_addr = page_address(kp->maplist[0]);
+ prev_addr = (unsigned long) page_address(kp->maplist[0]);
for (k = 1, split = 0; k < kp->nr_pages; ++k, prev_addr = addr) {
- addr = page_address(kp->maplist[k]);
+ addr = (unsigned long) page_address(kp->maplist[k]);
if ((prev_addr + PAGE_SIZE) != addr) {
split = k;
break;
@@ -1477,7 +1477,7 @@
}
if (! split) {
schp->k_use_sg = 0;
- schp->buffer = (void *)(page_address(kp->maplist[0]) + kp->offset);
+ schp->buffer = page_address(kp->maplist[0]) + kp->offset;
schp->bufflen = dxfer_len;
schp->buffer_mem_src = SG_USER_MEM;
schp->b_malloc_len = dxfer_len;
@@ -1497,7 +1497,7 @@
offset = (0 == k) ? kp->offset : 0;
num = (rem_sz > (PAGE_SIZE - offset)) ? (PAGE_SIZE - offset) :
rem_sz;
- sclp->address = (void *)(page_address(kp->maplist[k]) + offset);
+ sclp->address = page_address(kp->maplist[k]) + offset;
sclp->length = num;
mem_src_arr[k] = SG_USER_MEM;
rem_sz -= num;
@@ -1890,9 +1890,9 @@
Sg_scatter_hold * req_schp = &srp->data;
Sg_scatter_hold * rsv_schp = &sfp->reserve;
+ srp->res_used = 1;
SCSI_LOG_TIMEOUT(4, printk("sg_link_reserve: size=%d\n", size));
- /* round request up to next highest SG_SECTOR_SZ byte boundary */
- size = (size + SG_SECTOR_MSK) & (~SG_SECTOR_MSK);
+ size = (size + 1) & (~1); /* round to even for aha1542 */
if (rsv_schp->k_use_sg > 0) {
int k, num;
int rem = size;
@@ -1901,22 +1901,26 @@
for (k = 0; k < rsv_schp->k_use_sg; ++k, ++sclp) {
num = (int)sclp->length;
if (rem <= num) {
- sfp->save_scat_len = num;
- sclp->length = (unsigned)rem;
- break;
+ if (0 == k) {
+ req_schp->k_use_sg = 0;
+ req_schp->buffer = sclp->address;
+ }
+ else {
+ sfp->save_scat_len = num;
+ sclp->length = (unsigned)rem;
+ req_schp->k_use_sg = k + 1;
+ req_schp->sglist_len = rsv_schp->sglist_len;
+ req_schp->buffer = rsv_schp->buffer;
+ }
+ req_schp->bufflen = size;
+ req_schp->buffer_mem_src = rsv_schp->buffer_mem_src;
+ req_schp->b_malloc_len = rsv_schp->b_malloc_len;
+ break;
}
else
rem -= num;
}
- if (k < rsv_schp->k_use_sg) {
- req_schp->k_use_sg = k + 1; /* adjust scatter list length */
- req_schp->bufflen = size;
- req_schp->sglist_len = rsv_schp->sglist_len;
- req_schp->buffer = rsv_schp->buffer;
- req_schp->buffer_mem_src = rsv_schp->buffer_mem_src;
- req_schp->b_malloc_len = rsv_schp->b_malloc_len;
- }
- else
+ if (k >= rsv_schp->k_use_sg)
SCSI_LOG_TIMEOUT(1, printk("sg_link_reserve: BAD size\n"));
}
else {
@@ -1924,10 +1928,8 @@
req_schp->bufflen = size;
req_schp->buffer = rsv_schp->buffer;
req_schp->buffer_mem_src = rsv_schp->buffer_mem_src;
- req_schp->k_use_sg = rsv_schp->k_use_sg;
req_schp->b_malloc_len = rsv_schp->b_malloc_len;
}
- srp->res_used = 1;
}
static void sg_unlink_reserve(Sg_fd * sfp, Sg_request * srp)
@@ -1937,7 +1939,7 @@
SCSI_LOG_TIMEOUT(4, printk("sg_unlink_reserve: req->k_use_sg=%d\n",
(int)req_schp->k_use_sg));
- if (rsv_schp->k_use_sg > 0) {
+ if ((rsv_schp->k_use_sg > 0) && (req_schp->k_use_sg > 0)) {
struct scatterlist * sclp = (struct scatterlist *)rsv_schp->buffer;
if (sfp->save_scat_len > 0)
@@ -2118,13 +2120,12 @@
}
static int sg_remove_sfp(Sg_device * sdp, Sg_fd * sfp)
-{ /* if this is to be locked remember that it is called from _bh */
+{
Sg_request * srp;
Sg_request * tsrp;
int dirty = 0;
int res = 0;
- /* no lock since not expecting any parallel action on this fd */
srp = sfp->headrp;
if (srp) {
while (srp) {
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)