Skip to content

Commit 40d07b5

Browse files
doug-gilbertmartinkpetersen
authored andcommitted
scsi: scsi_debug: fix write_same with virtual_gb problem
The WRITE SAME(10) and (16) implementations didn't take account of the buffer wrap required when the virtual_gb parameter is greater than 0. Fix that and rename the fake_store() function to lba2fake_store() to lessen confusion with the global fake_storep pointer. Bump version date. Signed-off-by: Douglas Gilbert <dgilbert@interlog.com> Reported-by: Bart Van Assche <bvanassche@acm.org> Tested by: Bart Van Assche <bvanassche@acm.org> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
1 parent 5d8fc4a commit 40d07b5

File tree

1 file changed

+21
-20
lines changed

1 file changed

+21
-20
lines changed

drivers/scsi/scsi_debug.c

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@
6262

6363
/* make sure inq_product_rev string corresponds to this version */
6464
#define SDEBUG_VERSION "0188" /* format to fit INQUIRY revision field */
65-
static const char *sdebug_version_date = "20180128";
65+
static const char *sdebug_version_date = "20190125";
6666

6767
#define MY_NAME "scsi_debug"
6868

@@ -735,7 +735,7 @@ static inline bool scsi_debug_lbp(void)
735735
(sdebug_lbpu || sdebug_lbpws || sdebug_lbpws10);
736736
}
737737

738-
static void *fake_store(unsigned long long lba)
738+
static void *lba2fake_store(unsigned long long lba)
739739
{
740740
lba = do_div(lba, sdebug_store_sectors);
741741

@@ -2514,8 +2514,8 @@ static int do_device_access(struct scsi_cmnd *scmd, u32 sg_skip, u64 lba,
25142514
return ret;
25152515
}
25162516

2517-
/* If fake_store(lba,num) compares equal to arr(num), then copy top half of
2518-
* arr into fake_store(lba,num) and return true. If comparison fails then
2517+
/* If lba2fake_store(lba,num) compares equal to arr(num), then copy top half of
2518+
* arr into lba2fake_store(lba,num) and return true. If comparison fails then
25192519
* return false. */
25202520
static bool comp_write_worker(u64 lba, u32 num, const u8 *arr)
25212521
{
@@ -2643,7 +2643,7 @@ static int prot_verify_read(struct scsi_cmnd *SCpnt, sector_t start_sec,
26432643
if (sdt->app_tag == cpu_to_be16(0xffff))
26442644
continue;
26452645

2646-
ret = dif_verify(sdt, fake_store(sector), sector, ei_lba);
2646+
ret = dif_verify(sdt, lba2fake_store(sector), sector, ei_lba);
26472647
if (ret) {
26482648
dif_errors++;
26492649
return ret;
@@ -3261,10 +3261,12 @@ static int resp_write_scat(struct scsi_cmnd *scp,
32613261
static int resp_write_same(struct scsi_cmnd *scp, u64 lba, u32 num,
32623262
u32 ei_lba, bool unmap, bool ndob)
32633263
{
3264+
int ret;
32643265
unsigned long iflags;
32653266
unsigned long long i;
3266-
int ret;
3267-
u64 lba_off;
3267+
u32 lb_size = sdebug_sector_size;
3268+
u64 block, lbaa;
3269+
u8 *fs1p;
32683270

32693271
ret = check_device_access_params(scp, lba, num);
32703272
if (ret)
@@ -3276,31 +3278,30 @@ static int resp_write_same(struct scsi_cmnd *scp, u64 lba, u32 num,
32763278
unmap_region(lba, num);
32773279
goto out;
32783280
}
3279-
3280-
lba_off = lba * sdebug_sector_size;
3281+
lbaa = lba;
3282+
block = do_div(lbaa, sdebug_store_sectors);
32813283
/* if ndob then zero 1 logical block, else fetch 1 logical block */
3284+
fs1p = fake_storep + (block * lb_size);
32823285
if (ndob) {
3283-
memset(fake_storep + lba_off, 0, sdebug_sector_size);
3286+
memset(fs1p, 0, lb_size);
32843287
ret = 0;
32853288
} else
3286-
ret = fetch_to_dev_buffer(scp, fake_storep + lba_off,
3287-
sdebug_sector_size);
3289+
ret = fetch_to_dev_buffer(scp, fs1p, lb_size);
32883290

32893291
if (-1 == ret) {
32903292
write_unlock_irqrestore(&atomic_rw, iflags);
32913293
return DID_ERROR << 16;
3292-
} else if (sdebug_verbose && !ndob && (ret < sdebug_sector_size))
3294+
} else if (sdebug_verbose && !ndob && (ret < lb_size))
32933295
sdev_printk(KERN_INFO, scp->device,
32943296
"%s: %s: lb size=%u, IO sent=%d bytes\n",
3295-
my_name, "write same",
3296-
sdebug_sector_size, ret);
3297+
my_name, "write same", lb_size, ret);
32973298

32983299
/* Copy first sector to remaining blocks */
3299-
for (i = 1 ; i < num ; i++)
3300-
memcpy(fake_storep + ((lba + i) * sdebug_sector_size),
3301-
fake_storep + lba_off,
3302-
sdebug_sector_size);
3303-
3300+
for (i = 1 ; i < num ; i++) {
3301+
lbaa = lba + i;
3302+
block = do_div(lbaa, sdebug_store_sectors);
3303+
memmove(fake_storep + (block * lb_size), fs1p, lb_size);
3304+
}
33043305
if (scsi_debug_lbp())
33053306
map_region(lba, num);
33063307
out:

0 commit comments

Comments
 (0)