Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/netbsd-9]: src/sys/kern Pull up following revision(s) (requested by mlel...
details: https://anonhg.NetBSD.org/src/rev/d90c8b2a28e9
branches: netbsd-9
changeset: 1001628:d90c8b2a28e9
user: martin <martin%NetBSD.org@localhost>
date: Thu Apr 02 19:15:35 2020 +0000
description:
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
diffstat:
sys/dev/scsipi/cd.c | 40 +++++++++++++++++++++++++++++-----------
sys/kern/subr_disk.c | 8 ++++++--
2 files changed, 35 insertions(+), 13 deletions(-)
diffs (130 lines):
diff -r a0afe6c72e70 -r d90c8b2a28e9 sys/dev/scsipi/cd.c
--- a/sys/dev/scsipi/cd.c Thu Apr 02 19:11:36 2020 +0000
+++ b/sys/dev/scsipi/cd.c Thu Apr 02 19:15:35 2020 +0000
@@ -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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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;
-
- if (cdreadmsaddr(cd, &toc, &lastsession) != 0)
- lastsession = 0;
+ lp->d_flags |= D_REMOVABLE;
+
+ 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;
diff -r a0afe6c72e70 -r d90c8b2a28e9 sys/kern/subr_disk.c
--- a/sys/kern/subr_disk.c Thu Apr 02 19:11:36 2020 +0000
+++ b/sys/kern/subr_disk.c Thu Apr 02 19:15:35 2020 +0000
@@ -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 @@
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;
Home |
Main Index |
Thread Index |
Old Index