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