aboutsummaryrefslogtreecommitdiff
path: root/sys/cam
diff options
context:
space:
mode:
authorMatt Jacob <mjacob@FreeBSD.org>2006-09-16 21:21:07 +0000
committerMatt Jacob <mjacob@FreeBSD.org>2006-09-16 21:21:07 +0000
commit059cce1a75e97cf98e48b175d6ec5222da731a3b (patch)
tree0c120edfdb1e331a2f3c4314ead5b2dd3f3f66ce /sys/cam
parent268f526c055d7e4fe3adf55a8d9604465daa0c32 (diff)
downloadsrc-059cce1a75e97cf98e48b175d6ec5222da731a3b.tar.gz
src-059cce1a75e97cf98e48b175d6ec5222da731a3b.zip
Don't allow attachment of disks that could cause GEOM to panic.
Notes
Notes: svn path=/head/; revision=162365
Diffstat (limited to 'sys/cam')
-rw-r--r--sys/cam/scsi/scsi_da.c33
1 files changed, 24 insertions, 9 deletions
diff --git a/sys/cam/scsi/scsi_da.c b/sys/cam/scsi/scsi_da.c
index c09740967c23..c0ddefc03ef2 100644
--- a/sys/cam/scsi/scsi_da.c
+++ b/sys/cam/scsi/scsi_da.c
@@ -1519,15 +1519,30 @@ dadone(struct cam_periph *periph, union ccb *done_ccb)
block_size = scsi_4btoul(rcaplong->length);
maxsector = scsi_8btou64(rcaplong->addr);
}
- dasetgeom(periph, block_size, maxsector);
- dp = &softc->params;
- snprintf(announce_buf, sizeof(announce_buf),
- "%juMB (%ju %u byte sectors: %dH %dS/T %dC)",
- (uintmax_t) (((uintmax_t)dp->secsize *
- dp->sectors) / (1024*1024)),
- (uintmax_t)dp->sectors,
- dp->secsize, dp->heads, dp->secs_per_track,
- dp->cylinders);
+
+ /*
+ * Because GEOM code just will panic us if we
+ * give them an 'illegal' value we'll avoid that
+ * here.
+ */
+ if (block_size >= MAXPHYS || block_size == 0) {
+ xpt_print_path(periph->path);
+ printf("unsupportable block size %ju\n",
+ (uintmax_t) block_size);
+ announce_buf[0] = '\0';
+ cam_periph_invalidate(periph);
+ } else {
+ dasetgeom(periph, block_size, maxsector);
+ dp = &softc->params;
+ snprintf(announce_buf, sizeof(announce_buf),
+ "%juMB (%ju %u byte sectors: %dH %dS/T "
+ "%dC)", (uintmax_t)
+ (((uintmax_t)dp->secsize *
+ dp->sectors) / (1024*1024)),
+ (uintmax_t)dp->sectors,
+ dp->secsize, dp->heads,
+ dp->secs_per_track, dp->cylinders);
+ }
} else {
int error;