Module Name:    src
Committed By:   jakllsch
Date:           Thu Feb 27 16:20:26 UTC 2025

Modified Files:
        src/sys/dev: ld.c ldvar.h

Log Message:
Implement DIOCGSECTORALIGN for ld(4)


To generate a diff of this commit:
cvs rdiff -u -r1.112 -r1.113 src/sys/dev/ld.c
cvs rdiff -u -r1.35 -r1.36 src/sys/dev/ldvar.h

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/ld.c
diff -u src/sys/dev/ld.c:1.112 src/sys/dev/ld.c:1.113
--- src/sys/dev/ld.c:1.112	Sun May 30 11:24:02 2021
+++ src/sys/dev/ld.c	Thu Feb 27 16:20:26 2025
@@ -1,4 +1,4 @@
-/*	$NetBSD: ld.c,v 1.112 2021/05/30 11:24:02 riastradh Exp $	*/
+/*	$NetBSD: ld.c,v 1.113 2025/02/27 16:20:26 jakllsch Exp $	*/
 
 /*-
  * Copyright (c) 1998, 2000 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ld.c,v 1.112 2021/05/30 11:24:02 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ld.c,v 1.113 2025/02/27 16:20:26 jakllsch Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -404,9 +404,10 @@ ldioctl(dev_t dev, u_long cmd, void *add
 {
 	struct ld_softc *sc;
 	struct dk_softc *dksc;
-	int unit, error;
+	int unit, part, error;
 
 	unit = DISKUNIT(dev);
+	part = DISKPART(dev);
 	sc = device_lookup_private(&ld_cd, unit);
 	dksc = &sc->sc_dksc;
 
@@ -427,6 +428,26 @@ ldioctl(dev_t dev, u_long cmd, void *add
 		else
 			error = 0;
 		break;
+	case DIOCGSECTORALIGN: {
+		struct disk_sectoralign *dsa = addr;
+		dsa->dsa_alignment = sc->sc_physsecsize / sc->sc_secsize;
+		dsa->dsa_alignment = MAX(1, dsa->dsa_alignment);
+		dsa->dsa_firstaligned = sc->sc_alignedsec;
+		if (part != RAW_PART) {
+			struct disklabel *lp = dksc->sc_dkdev.dk_label;
+			daddr_t offset = lp->d_partitions[part].p_offset;
+			uint32_t r = offset % dsa->dsa_alignment;
+
+			if (r < dsa->dsa_firstaligned)
+				dsa->dsa_firstaligned = dsa->dsa_firstaligned
+				    - r;
+			else
+				dsa->dsa_firstaligned = (dsa->dsa_firstaligned
+				    + dsa->dsa_alignment) - r;
+		}
+		dsa->dsa_firstaligned %= dsa->dsa_alignment;
+		return 0;
+	}
 	}
 
 	if (error != 0)

Index: src/sys/dev/ldvar.h
diff -u src/sys/dev/ldvar.h:1.35 src/sys/dev/ldvar.h:1.36
--- src/sys/dev/ldvar.h:1.35	Sun May 30 11:24:02 2021
+++ src/sys/dev/ldvar.h	Thu Feb 27 16:20:26 2025
@@ -1,4 +1,4 @@
-/*	$NetBSD: ldvar.h,v 1.35 2021/05/30 11:24:02 riastradh Exp $	*/
+/*	$NetBSD: ldvar.h,v 1.36 2025/02/27 16:20:26 jakllsch Exp $	*/
 
 /*-
  * Copyright (c) 2000 The NetBSD Foundation, Inc.
@@ -55,6 +55,8 @@ struct ld_softc {
 	int		sc_flags;	/* control flags */
 	uint64_t	sc_secperunit;	/* # sectors in total */
 	int		sc_secsize;	/* sector size in bytes */
+	int		sc_physsecsize;	/* physical sector size in bytes */
+	uint32_t	sc_alignedsec;	/* first physically-aligned LBA */
 	int		sc_maxxfer;	/* max xfer size in bytes */
 	int		sc_maxqueuecnt;	/* maximum h/w queue depth */
 	char		*sc_typename;	/* inquiry data */

Reply via email to