scsi: scsi_debug: do_device_access add sg offset argument
authorDouglas Gilbert <dgilbert@interlog.com>
Sat, 23 Dec 2017 17:48:12 +0000 (12:48 -0500)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 11 Jan 2018 04:25:05 +0000 (23:25 -0500)
WRITE SCATTERED needs to take several "bites" out of the data-out buffer.
Expand the do_device_access() function to take a sg_skip argument.

Signed-off-by: Douglas Gilbert <dgilbert@interlog.com>
Reviewed-by: Bart Van Assche <bart.vanassche@wdc.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/scsi_debug.c

index 0bf67f5631cd45e2dfaa11b8bf09e7a8b2165880..11ef3f19490d1d44179f20ad53a926f4f6dca9d1 100644 (file)
@@ -2415,8 +2415,8 @@ static int check_device_access_params(struct scsi_cmnd *scp,
 }
 
 /* Returns number of bytes copied or -1 if error. */
-static int do_device_access(struct scsi_cmnd *scmd, u64 lba, u32 num,
-                           bool do_write)
+static int do_device_access(struct scsi_cmnd *scmd, u32 sg_skip, u64 lba,
+                           u32 num, bool do_write)
 {
        int ret;
        u64 block, rest = 0;
@@ -2442,14 +2442,15 @@ static int do_device_access(struct scsi_cmnd *scmd, u64 lba, u32 num,
 
        ret = sg_copy_buffer(sdb->table.sgl, sdb->table.nents,
                   fake_storep + (block * sdebug_sector_size),
-                  (num - rest) * sdebug_sector_size, 0, do_write);
+                  (num - rest) * sdebug_sector_size, sg_skip, do_write);
        if (ret != (num - rest) * sdebug_sector_size)
                return ret;
 
        if (rest) {
                ret += sg_copy_buffer(sdb->table.sgl, sdb->table.nents,
                            fake_storep, rest * sdebug_sector_size,
-                           (num - rest) * sdebug_sector_size, do_write);
+                           sg_skip + ((num - rest) * sdebug_sector_size),
+                           do_write);
        }
 
        return ret;
@@ -2710,7 +2711,7 @@ static int resp_read_dt0(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
                }
        }
 
-       ret = do_device_access(scp, lba, num, false);
+       ret = do_device_access(scp, 0, lba, num, false);
        read_unlock_irqrestore(&atomic_rw, iflags);
        if (unlikely(ret == -1))
                return DID_ERROR << 16;
@@ -2998,7 +2999,7 @@ static int resp_write_dt0(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
                }
        }
 
-       ret = do_device_access(scp, lba, num, true);
+       ret = do_device_access(scp, 0, lba, num, true);
        if (unlikely(scsi_debug_lbp()))
                map_region(lba, num);
        write_unlock_irqrestore(&atomic_rw, iflags);
@@ -3239,7 +3240,7 @@ static int resp_comp_write(struct scsi_cmnd *scp,
         * from data-in into arr. Safe (atomic) since write_lock held. */
        fake_storep_hold = fake_storep;
        fake_storep = arr;
-       ret = do_device_access(scp, 0, dnum, true);
+       ret = do_device_access(scp, 0, 0, dnum, true);
        fake_storep = fake_storep_hold;
        if (ret == -1) {
                retval = DID_ERROR << 16;