]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/scsi/scsi_debug.c
[SCSI] consolidate command allocation in a single place
[linux-2.6-omap-h63xx.git] / drivers / scsi / scsi_debug.c
index be3437c4058ceb8e70b06c47a050eb12d757dca9..7a2a3edcc723bbcda2621e341669b782ec78be25 100644 (file)
@@ -344,9 +344,6 @@ int scsi_debug_queuecommand(struct scsi_cmnd * SCpnt, done_funct_t done)
        int inj_transport = 0;
        int delay_override = 0;
 
-       if (done == NULL)
-               return 0;       /* assume mid level reprocessing command */
-
        scsi_set_resid(SCpnt, 0);
        if ((SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) && cmd) {
                printk(KERN_INFO "scsi_debug: cmd ");
@@ -594,81 +591,37 @@ static int check_readiness(struct scsi_cmnd * SCpnt, int reset_only,
 }
 
 /* Returns 0 if ok else (DID_ERROR << 16). Sets scp->resid . */
-static int fill_from_dev_buffer(struct scsi_cmnd * scp, unsigned char * arr,
+static int fill_from_dev_buffer(struct scsi_cmnd *scp, unsigned char *arr,
                                int arr_len)
 {
-       int k, req_len, act_len, len, active;
-       void * kaddr;
-       void * kaddr_off;
-       struct scatterlist *sg;
+       int act_len;
        struct scsi_data_buffer *sdb = scsi_in(scp);
 
        if (!sdb->length)
                return 0;
-       if (!sdb->table.sgl)
-               return (DID_ERROR << 16);
        if (!(scsi_bidi_cmnd(scp) || scp->sc_data_direction == DMA_FROM_DEVICE))
                return (DID_ERROR << 16);
-       active = 1;
-       req_len = act_len = 0;
-       for_each_sg(sdb->table.sgl, sg, sdb->table.nents, k) {
-               if (active) {
-                       kaddr = (unsigned char *)
-                               kmap_atomic(sg_page(sg), KM_USER0);
-                       if (NULL == kaddr)
-                               return (DID_ERROR << 16);
-                       kaddr_off = (unsigned char *)kaddr + sg->offset;
-                       len = sg->length;
-                       if ((req_len + len) > arr_len) {
-                               active = 0;
-                               len = arr_len - req_len;
-                       }
-                       memcpy(kaddr_off, arr + req_len, len);
-                       kunmap_atomic(kaddr, KM_USER0);
-                       act_len += len;
-               }
-               req_len += sg->length;
-       }
+
+       act_len = sg_copy_from_buffer(sdb->table.sgl, sdb->table.nents,
+                                     arr, arr_len);
        if (sdb->resid)
                sdb->resid -= act_len;
        else
-               sdb->resid = req_len - act_len;
+               sdb->resid = scsi_bufflen(scp) - act_len;
+
        return 0;
 }
 
 /* Returns number of bytes fetched into 'arr' or -1 if error. */
-static int fetch_to_dev_buffer(struct scsi_cmnd * scp, unsigned char * arr,
-                              int max_arr_len)
+static int fetch_to_dev_buffer(struct scsi_cmnd *scp, unsigned char *arr,
+                              int arr_len)
 {
-       int k, req_len, len, fin;
-       void * kaddr;
-       void * kaddr_off;
-       struct scatterlist * sg;
-
-       if (0 == scsi_bufflen(scp))
+       if (!scsi_bufflen(scp))
                return 0;
-       if (NULL == scsi_sglist(scp))
-               return -1;
        if (!(scsi_bidi_cmnd(scp) || scp->sc_data_direction == DMA_TO_DEVICE))
                return -1;
-       req_len = fin = 0;
-       scsi_for_each_sg(scp, sg, scsi_sg_count(scp), k) {
-               kaddr = (unsigned char *)kmap_atomic(sg_page(sg), KM_USER0);
-               if (NULL == kaddr)
-                       return -1;
-               kaddr_off = (unsigned char *)kaddr + sg->offset;
-               len = sg->length;
-               if ((req_len + len) > max_arr_len) {
-                       len = max_arr_len - req_len;
-                       fin = 1;
-               }
-               memcpy(arr + req_len, kaddr_off, len);
-               kunmap_atomic(kaddr, KM_USER0);
-               if (fin)
-                       return req_len + len;
-               req_len += sg->length;
-       }
-       return req_len;
+
+       return scsi_sg_copy_to_buffer(scp, arr, arr_len);
 }
 
 
@@ -1968,16 +1921,7 @@ static int resp_xdwriteread(struct scsi_cmnd *scp, unsigned long long lba,
        if (!buf)
                return ret;
 
-       offset = 0;
-       scsi_for_each_sg(scp, sg, scsi_sg_count(scp), i) {
-               kaddr = (unsigned char *)kmap_atomic(sg_page(sg), KM_USER0);
-               if (!kaddr)
-                       goto out;
-
-               memcpy(buf + offset, kaddr + sg->offset, sg->length);
-               offset += sg->length;
-               kunmap_atomic(kaddr, KM_USER0);
-       }
+       scsi_sg_copy_to_buffer(scp, buf, scsi_bufflen(scp));
 
        offset = 0;
        for_each_sg(sdb->table.sgl, sg, sdb->table.nents, i) {
@@ -2079,8 +2023,8 @@ static struct sdebug_dev_info * devInfoReg(struct scsi_device * sdev)
 
        if (devip)
                return devip;
-       sdbg_host = *(struct sdebug_host_info **) sdev->host->hostdata;
-        if(! sdbg_host) {
+       sdbg_host = *(struct sdebug_host_info **)shost_priv(sdev->host);
+       if (!sdbg_host) {
                 printk(KERN_ERR "Host info NULL\n");
                return NULL;
         }
@@ -2207,7 +2151,7 @@ static int scsi_debug_bus_reset(struct scsi_cmnd * SCpnt)
                printk(KERN_INFO "scsi_debug: bus_reset\n");
        ++num_bus_resets;
        if (SCpnt && ((sdp = SCpnt->device)) && ((hp = sdp->host))) {
-               sdbg_host = *(struct sdebug_host_info **) hp->hostdata;
+               sdbg_host = *(struct sdebug_host_info **)shost_priv(hp);
                if (sdbg_host) {
                        list_for_each_entry(dev_info,
                                             &sdbg_host->dev_info_list,