summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkrw <krw@openbsd.org>2005-03-24 12:52:01 +0000
committerkrw <krw@openbsd.org>2005-03-24 12:52:01 +0000
commite343e3ee4b7fae01c74cdc9bb422568b6c202d17 (patch)
tree6405caad0dcabdf103c9239936be4d141126088c
parentmajor knf (diff)
downloadwireguard-openbsd-e343e3ee4b7fae01c74cdc9bb422568b6c202d17.tar.xz
wireguard-openbsd-e343e3ee4b7fae01c74cdc9bb422568b6c202d17.zip
If READ CAPACITY(10) says there are more than 0xffffffff sectors,
report 0xffffffff and print a message. READ CAPACITY(16) is needed to get the actual size in this case. ok tdeval@ (a while ago) marco@
-rw-r--r--sys/scsi/scsi_base.c21
1 files changed, 17 insertions, 4 deletions
diff --git a/sys/scsi/scsi_base.c b/sys/scsi/scsi_base.c
index ebefabd3d45..d8e4cbb7380 100644
--- a/sys/scsi/scsi_base.c
+++ b/sys/scsi/scsi_base.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: scsi_base.c,v 1.62 2004/07/31 11:31:30 krw Exp $ */
+/* $OpenBSD: scsi_base.c,v 1.63 2005/03/24 12:52:01 krw Exp $ */
/* $NetBSD: scsi_base.c,v 1.43 1997/04/02 02:29:36 mycroft Exp $ */
/*
@@ -223,8 +223,9 @@ scsi_size(sc_link, flags)
struct scsi_link *sc_link;
int flags;
{
- struct scsi_read_cap_data rdcap;
struct scsi_read_capacity scsi_cmd;
+ struct scsi_read_cap_data rdcap;
+ u_long max_addr;
/*
* make up a scsi command and ask the scsi driver to do
@@ -242,10 +243,22 @@ scsi_size(sc_link, flags)
2, 20000, NULL, flags | SCSI_DATA_IN) != 0) {
sc_print_addr(sc_link);
printf("could not get size\n");
- return 0;
+ return (0);
}
- return _4btol(rdcap.addr) + 1;
+ max_addr = _4btol(rdcap.addr);
+ if (max_addr == 0xffffffffUL) {
+ /*
+ * The device is reporting it has more than 2^32-1 sectors. The
+ * 16-byte READ CAPACITY command must be issued to get full
+ * capacity.
+ */
+ sc_print_addr(sc_link);
+ printf("only the first 4,294,967,295 sectors will be used.\n");
+ return (0xffffffffUL);
+ }
+
+ return (max_addr + 1);
}
/*