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 */