git: 231d36dccb82 - main - scsi/da: Export quirks as sysctl

From: Warner Losh <imp_at_FreeBSD.org>
Date: Wed, 07 May 2025 21:37:03 UTC
The branch main has been updated by imp:

URL: https://cgit.FreeBSD.org/src/commit/?id=231d36dccb820aa874800bdcd7e3e250bbd6df79

commit 231d36dccb820aa874800bdcd7e3e250bbd6df79
Author:     Warner Losh <imp@FreeBSD.org>
AuthorDate: 2025-05-07 16:06:52 +0000
Commit:     Warner Losh <imp@FreeBSD.org>
CommitDate: 2025-05-07 21:36:53 +0000

    scsi/da: Export quirks as sysctl
    
    Differential Revision:  https://reviews.freebsd.org/D49464
    Sponsored by:           Netflix
---
 sys/cam/scsi/scsi_da.c | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/sys/cam/scsi/scsi_da.c b/sys/cam/scsi/scsi_da.c
index 1fd6d4919c61..71a4b0fa6b22 100644
--- a/sys/cam/scsi/scsi_da.c
+++ b/sys/cam/scsi/scsi_da.c
@@ -1496,6 +1496,7 @@ static	int		dacmdsizesysctl(SYSCTL_HANDLER_ARGS);
 static	int		dadeletemethodsysctl(SYSCTL_HANDLER_ARGS);
 static	int		dabitsysctl(SYSCTL_HANDLER_ARGS);
 static	int		daflagssysctl(SYSCTL_HANDLER_ARGS);
+static	int		daquirkssysctl(SYSCTL_HANDLER_ARGS);
 static	int		dazonemodesysctl(SYSCTL_HANDLER_ARGS);
 static	int		dazonesupsysctl(SYSCTL_HANDLER_ARGS);
 static	int		dadeletemaxsysctl(SYSCTL_HANDLER_ARGS);
@@ -2394,6 +2395,10 @@ dasysctlinit(void *context, int pending)
 	    OID_AUTO, "flags", CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE,
 	    softc, 0, daflagssysctl, "A",
 	    "Flags for drive");
+	SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree),
+	    OID_AUTO, "quirks", CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE,
+	    softc, 0, daquirkssysctl, "A",
+	    "Active quirks for drive");
 	SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree),
 	    OID_AUTO, "rotating", CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_MPSAFE,
 	    &softc->flags, (u_int)DA_FLAG_ROTATING, dabitsysctl, "I",
@@ -2718,6 +2723,24 @@ daflagssysctl(SYSCTL_HANDLER_ARGS)
 	return (error);
 }
 
+static int
+daquirkssysctl(SYSCTL_HANDLER_ARGS)
+{
+	struct sbuf sbuf;
+	struct da_softc *softc = arg1;
+	int error;
+
+	sbuf_new_for_sysctl(&sbuf, NULL, 0, req);
+	if (softc->quirks != 0)
+		sbuf_printf(&sbuf, "0x%b", (unsigned)softc->quirks, DA_Q_BIT_STRING);
+	else
+		sbuf_putc(&sbuf, '0');
+	error = sbuf_finish(&sbuf);
+	sbuf_delete(&sbuf);
+
+	return (error);
+}
+
 static int
 dadeletemethodsysctl(SYSCTL_HANDLER_ARGS)
 {