Module Name:    src
Committed By:   mlelstv
Date:           Sat Feb  8 10:49:45 UTC 2025

Modified Files:
        src/sys/kern: subr_disk_mbr.c

Log Message:
Handle reading larger sectors (including 2k CD-ROM blocks).
Fall back to scan for ISO9660 sessions when MMC code fails.

disklabel now reports ISO/UDF partitions again for cd(4).


To generate a diff of this commit:
cvs rdiff -u -r1.58 -r1.59 src/sys/kern/subr_disk_mbr.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/kern/subr_disk_mbr.c
diff -u src/sys/kern/subr_disk_mbr.c:1.58 src/sys/kern/subr_disk_mbr.c:1.59
--- src/sys/kern/subr_disk_mbr.c:1.58	Mon Apr  3 18:03:24 2023
+++ src/sys/kern/subr_disk_mbr.c	Sat Feb  8 10:49:45 2025
@@ -1,4 +1,4 @@
-/*	$NetBSD: subr_disk_mbr.c,v 1.58 2023/04/03 18:03:24 gutteridge Exp $	*/
+/*	$NetBSD: subr_disk_mbr.c,v 1.59 2025/02/08 10:49:45 mlelstv Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1988 Regents of the University of California.
@@ -54,7 +54,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: subr_disk_mbr.c,v 1.58 2023/04/03 18:03:24 gutteridge Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_disk_mbr.c,v 1.59 2025/02/08 10:49:45 mlelstv Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_mbr.h"
@@ -258,10 +258,9 @@ scan_iso_vrs_session(mbr_args_t *a, uint
 	struct vrs_desc *vrsd;
 	uint64_t vrs;
 	int sector_size;
-	int blks, inc;
+	int inc;
 
 	sector_size = a->lp->d_secsize;
-	blks = sector_size / DEV_BSIZE;
 	inc  = MAX(1, 2048 / sector_size);
 
 	/* by definition */
@@ -269,7 +268,7 @@ scan_iso_vrs_session(mbr_args_t *a, uint
 	        + first_sector;
 
 	/* read first vrs sector */
-	if (read_sector(a, vrs * blks, 1))
+	if (read_sector(a, vrs, 1))
 		return;
 
 	/* skip all CD001 records */
@@ -280,7 +279,7 @@ scan_iso_vrs_session(mbr_args_t *a, uint
 		*is_iso9660 = first_sector;
 
 		vrs += inc;
-		if (read_sector(a, vrs * blks, 1))
+		if (read_sector(a, vrs, 1))
 			return;
 	}
 
@@ -292,7 +291,7 @@ scan_iso_vrs_session(mbr_args_t *a, uint
 
 	/* read successor */
 	vrs += inc;
-	if (read_sector(a, vrs * blks, 1))
+	if (read_sector(a, vrs, 1))
 		return;
 
 	/* check for NSR[23] */
@@ -328,7 +327,7 @@ scan_iso_vrs(mbr_args_t *a)
 		dev = a->bp->b_dev;
 		error = bdev_ioctl(dev, MMCGETDISCINFO, &di, FKIOCTL, curlwp);
 		if (error)
-			return SCAN_CONTINUE;
+			goto notmmc;
 
 		/* go through all (data) tracks */
 		sessionnr = -1;
@@ -339,7 +338,7 @@ scan_iso_vrs(mbr_args_t *a)
 			error = bdev_ioctl(dev, MMCGETTRACKINFO, &ti,
 					FKIOCTL, curlwp);
 			if (error)
-				return SCAN_CONTINUE;
+				goto notmmc;
 			new_session = (ti.sessionnr != sessionnr);
 			sessionnr = ti.sessionnr;
 			if (new_session) {
@@ -353,6 +352,7 @@ scan_iso_vrs(mbr_args_t *a)
 			}
 		}
 	} else {
+notmmc:
 		/* try start of disc */
 		sector = 0;
 		scan_iso_vrs_session(a, sector, &is_iso9660, &is_udf);

Reply via email to