summaryrefslogtreecommitdiffstats
path: root/sys/dev/softraid.c
diff options
context:
space:
mode:
authorkrw <krw@openbsd.org>2010-12-20 17:47:48 +0000
committerkrw <krw@openbsd.org>2010-12-20 17:47:48 +0000
commit4a1114e6d9adca2c98497584039b7eb8b3de33a2 (patch)
treece887d1f8be237671aa730e37441ef0c447dfbf8 /sys/dev/softraid.c
parentuse a better strategy: ask the ports tree for the plist for packages with (diff)
downloadwireguard-openbsd-4a1114e6d9adca2c98497584039b7eb8b3de33a2.tar.xz
wireguard-openbsd-4a1114e6d9adca2c98497584039b7eb8b3de33a2.zip
READ CAPACITY and READ CAPACITY 16 commands report the last valid
logical block address, not the size of the device. Adjust softraid's handling of the commands accordingly. Fixes panics when newfs'ing the 'c' partition of a softraid volume (one shouldn't newfs 'c' partitions of any device). Reported by Andreas Bartlet via tech@. Fix tested by Andreas. ok marco@. functionally identical diff developed by dlg@
Diffstat (limited to 'sys/dev/softraid.c')
-rw-r--r--sys/dev/softraid.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/sys/dev/softraid.c b/sys/dev/softraid.c
index cecb4e8cc35..f99f2e599fc 100644
--- a/sys/dev/softraid.c
+++ b/sys/dev/softraid.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: softraid.c,v 1.216 2010/11/06 23:01:56 marco Exp $ */
+/* $OpenBSD: softraid.c,v 1.217 2010/12/20 17:47:48 krw Exp $ */
/*
* Copyright (c) 2007, 2008, 2009 Marco Peereboom <marco@peereboom.us>
* Copyright (c) 2008 Chris Kuethe <ckuethe@openbsd.org>
@@ -3506,22 +3506,24 @@ sr_raid_read_cap(struct sr_workunit *wu)
struct scsi_xfer *xs = wu->swu_xs;
struct scsi_read_cap_data rcd;
struct scsi_read_cap_data_16 rcd16;
+ daddr64_t addr;
int rv = 1;
DNPRINTF(SR_D_DIS, "%s: sr_raid_read_cap\n", DEVNAME(sd->sd_sc));
+ addr = sd->sd_meta->ssdi.ssd_size - 1;
if (xs->cmd->opcode == READ_CAPACITY) {
bzero(&rcd, sizeof(rcd));
- if (sd->sd_meta->ssdi.ssd_size > 0xffffffffllu)
+ if (addr > 0xffffffffllu)
_lto4b(0xffffffff, rcd.addr);
else
- _lto4b(sd->sd_meta->ssdi.ssd_size, rcd.addr);
+ _lto4b(addr, 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(addr, rcd16.addr);
_lto4b(512, rcd16.length);
sr_copy_internal_data(xs, &rcd16, sizeof(rcd16));
rv = 0;