On Mon, Dec 20, 2010 at 04:26:59PM +1000, David Gwynne wrote:
> im pretty sure scsi reports the last addressable sector, as opposed to the
> total number of sectors. will have a diff shortly.

compiles. can someone test?

Index: softraid.c
===================================================================
RCS file: /cvs/src/sys/dev/softraid.c,v
retrieving revision 1.216
diff -u -p -r1.216 softraid.c
--- softraid.c  6 Nov 2010 23:01:56 -0000       1.216
+++ softraid.c  20 Dec 2010 08:21:33 -0000
@@ -3507,21 +3507,22 @@ sr_raid_read_cap(struct sr_workunit *wu)
        struct scsi_read_cap_data rcd;
        struct scsi_read_cap_data_16 rcd16;
        int                     rv = 1;
+       int64_t                 size = sd->sd_meta->ssdi.ssd_size - 1;
 
        DNPRINTF(SR_D_DIS, "%s: sr_raid_read_cap\n", DEVNAME(sd->sd_sc));
 
        if (xs->cmd->opcode == READ_CAPACITY) {
                bzero(&rcd, sizeof(rcd));
-               if (sd->sd_meta->ssdi.ssd_size > 0xffffffffllu)
+               if (size > 0xffffffffllu)
                        _lto4b(0xffffffff, rcd.addr);
                else
-                       _lto4b(sd->sd_meta->ssdi.ssd_size, rcd.addr);
+                       _lto4b(size, rcd.addr);
                _lto4b(512, rcd.length);
                sr_copy_internal_data(xs, &rcd, sizeof(rcd));
                rv = 0;
        } else if (xs->cmd->opcode == READ_CAPACITY_16) {
                bzero(&rcd16, sizeof(rcd16));
-               _lto8b(sd->sd_meta->ssdi.ssd_size, rcd16.addr);
+               _lto8b(size, rcd16.addr);
                _lto4b(512, rcd16.length);
                sr_copy_internal_data(xs, &rcd16, sizeof(rcd16));
                rv = 0;

Reply via email to