Module Name: src Committed By: martin Date: Thu Apr 2 19:15:35 UTC 2020
Modified Files: src/sys/dev/scsipi [netbsd-9]: cd.c src/sys/kern [netbsd-9]: subr_disk.c Log Message: Pull up following revision(s) (requested by mlelstv in ticket #814): sys/dev/scsipi/cd.c: revision 1.343 sys/kern/subr_disk.c: revision 1.130 Avoid division by zero if label isn't valid. Allow open of RAWPART even when no medium is loaded. Keep errors silent if no medium is loaded. Fixes PR kern/55104 To generate a diff of this commit: cvs rdiff -u -r1.342 -r1.342.4.1 src/sys/dev/scsipi/cd.c cvs rdiff -u -r1.128 -r1.128.2.1 src/sys/kern/subr_disk.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/scsipi/cd.c diff -u src/sys/dev/scsipi/cd.c:1.342 src/sys/dev/scsipi/cd.c:1.342.4.1 --- src/sys/dev/scsipi/cd.c:1.342 Mon Sep 3 16:29:33 2018 +++ src/sys/dev/scsipi/cd.c Thu Apr 2 19:15:35 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: cd.c,v 1.342 2018/09/03 16:29:33 riastradh Exp $ */ +/* $NetBSD: cd.c,v 1.342.4.1 2020/04/02 19:15:35 martin Exp $ */ /*- * Copyright (c) 1998, 2001, 2003, 2004, 2005, 2008 The NetBSD Foundation, @@ -50,7 +50,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: cd.c,v 1.342 2018/09/03 16:29:33 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: cd.c,v 1.342.4.1 2020/04/02 19:15:35 martin Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -401,8 +401,8 @@ cd_firstopen(device_t self, dev_t dev, i else silent = 0; - /* make cdclose() loud again */ - cd->flags &= ~CDF_EJECTED; + /* make cdclose() silent */ + cd->flags |= CDF_EJECTED; /* Check that it is still responding and ok. */ error = scsipi_test_unit_ready(periph, @@ -419,8 +419,11 @@ cd_firstopen(device_t self, dev_t dev, i if (error == EINVAL) error = EIO; } - if (error) + if (error) { + if (part == RAW_PART) + goto out; goto bad; + } /* Lock the pack in. */ error = scsipi_prevent(periph, SPAMR_PREVENT_DT, @@ -448,6 +451,9 @@ cd_firstopen(device_t self, dev_t dev, i SC_DEBUG(periph, SCSIPI_DB3, ("Params loaded ")); cd_set_geometry(cd); + + /* make cdclose() loud again */ + cd->flags &= ~CDF_EJECTED; } periph->periph_flags |= PERIPH_OPEN; @@ -519,7 +525,8 @@ cd_lastclose(device_t self) struct scsipi_adapter *adapt = periph->periph_channel->chan_adapter; int silent; - if (cd->flags & CDF_EJECTED) + if ((cd->flags & CDF_EJECTED) != 0 || + (periph->periph_flags & PERIPH_MEDIA_LOADED) == 0) silent = XS_CTL_SILENT; else silent = 0; @@ -1213,6 +1220,14 @@ cdioctl(dev_t dev, u_long cmd, void *add return (EIO); switch (cmd) { + case DIOCTUR: { + /* test unit ready */ + error = scsipi_test_unit_ready(cd->sc_periph, XS_CTL_SILENT); + *((int*)addr) = (error == 0); + if (error == ENODEV || error == EIO || error == 0) + return 0; + return error; + } case CDIOCPLAYTRACKS: { /* PLAY_MSF command */ struct ioc_play_track *args = addr; @@ -1447,15 +1462,18 @@ static void cd_label(device_t self, struct disklabel *lp) { struct cd_softc *cd = device_private(self); + struct scsipi_periph *periph = cd->sc_periph; struct cd_formatted_toc toc; - int lastsession; + int lastsession = 0; strncpy(lp->d_typename, "optical media", 16); lp->d_rpm = 300; - lp->d_flags |= D_REMOVABLE | D_SCSI_MMC; + lp->d_flags |= D_REMOVABLE; - if (cdreadmsaddr(cd, &toc, &lastsession) != 0) - lastsession = 0; + if ((periph->periph_flags & PERIPH_MEDIA_LOADED) != 0) { + lp->d_flags |= D_SCSI_MMC; + (void) cdreadmsaddr(cd, &toc, &lastsession); + } lp->d_partitions[0].p_offset = 0; lp->d_partitions[0].p_size = lp->d_secperunit; Index: src/sys/kern/subr_disk.c diff -u src/sys/kern/subr_disk.c:1.128 src/sys/kern/subr_disk.c:1.128.2.1 --- src/sys/kern/subr_disk.c:1.128 Wed May 22 08:47:02 2019 +++ src/sys/kern/subr_disk.c Thu Apr 2 19:15:35 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: subr_disk.c,v 1.128 2019/05/22 08:47:02 hannken Exp $ */ +/* $NetBSD: subr_disk.c,v 1.128.2.1 2020/04/02 19:15:35 martin Exp $ */ /*- * Copyright (c) 1996, 1997, 1999, 2000, 2009 The NetBSD Foundation, Inc. @@ -67,7 +67,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: subr_disk.c,v 1.128 2019/05/22 08:47:02 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: subr_disk.c,v 1.128.2.1 2020/04/02 19:15:35 martin Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -440,6 +440,10 @@ int disk_read_sectors(void (*strat)(struct buf *), const struct disklabel *lp, struct buf *bp, unsigned int sector, int count) { + + if ((lp->d_secsize / DEV_BSIZE) == 0 || lp->d_secpercyl == 0) + return EINVAL; + bp->b_blkno = btodb((off_t)sector * lp->d_secsize); bp->b_bcount = count * lp->d_secsize; bp->b_flags = (bp->b_flags & ~B_WRITE) | B_READ;