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

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)