In article <qltvkd$4ck$1...@serpens.de>,
Michael van Elst <mlel...@serpens.de> wrote:
>m...@netbsd.org (Emmanuel Dreyfus) writes:
>
>>But since almost all commands do the NAME=label to /dev/device translation,
>>you can take NAME=label as a device path.
>
>Only some NetBSD commands do. Most are old-fashioned and want file paths
>to deal with, and that's where the current mount output may come handy.
>
>There's nothing against an option making mount or df print wedge names
>and people can just use aliases in their profile.

I added that to df, but it needs root/operator in order to access the
device node to get wedge info. I also wrote a patch to expose the
wedge info via sysctl:

$ sysctl -a | grep dkw
hw.dkwedge.dk0.wname = wd0a
hw.dkwedge.dk0.parent = wd0
hw.dkwedge.dk0.ptype = ffs
hw.dkwedge.dk0.size = 201326529
hw.dkwedge.dk0.offset = 63
hw.dkwedge.dk1.wname = wd0b
hw.dkwedge.dk1.parent = wd0
hw.dkwedge.dk1.ptype = swap
hw.dkwedge.dk1.size = 8388608
hw.dkwedge.dk1.offset = 201326592

But I am not sure if I should commit it... Here it is... Should I?

christos

Index: df/df.c
===================================================================
RCS file: /cvsroot/src/bin/df/df.c,v
retrieving revision 1.94
diff -u -p -u -r1.94 df.c
--- df/df.c     18 Sep 2019 20:14:44 -0000      1.94
+++ df/df.c     19 Sep 2019 02:49:43 -0000
@@ -54,6 +54,7 @@ __RCSID("$NetBSD: df.c,v 1.94 2019/09/18
 #include <sys/mount.h>
 #include <sys/disk.h>
 #include <sys/ioctl.h>
+#include <sys/sysctl.h>
 
 #include <assert.h>
 #include <err.h>
@@ -310,8 +311,12 @@ getwedgeinfo(const struct statvfs *mntbu
                }
                rdn++;
                int fd = opendisk(rdn, O_RDONLY, buf, sizeof(buf), false);
-               if (fd == -1)
-                       err(EXIT_FAILURE, "opendisk on `%s' failed", rdn);
+               if (fd == -1) {
+                       size_t oldlen = sizeof(wi[i].dkw_wname);
+                       snprintf(buf, sizeof(buf), "hw.dkwedge.%s.wname", rdn);
+                       sysctlbyname(buf, wi[i].dkw_wname, &oldlen, NULL, 0);
+                       continue;
+               }
                if (ioctl(fd, DIOCGWEDGEINFO, &wi[i]) == -1) {
                        warn("DIOCGWEDGEINFO for `%s' failed", buf);
                }
Index: dk.c
===================================================================
RCS file: /cvsroot/src/sys/dev/dkwedge/dk.c,v
retrieving revision 1.97
diff -u -p -u -r1.97 dk.c
--- dk.c        12 May 2018 10:33:06 -0000      1.97
+++ dk.c        19 Sep 2019 02:50:02 -0000
@@ -43,6 +43,7 @@ __KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.97 
 #include <sys/pool.h>
 #include <sys/ioctl.h>
 #include <sys/disklabel.h>
+#include <sys/sysctl.h>
 #include <sys/disk.h>
 #include <sys/fcntl.h>
 #include <sys/buf.h>
@@ -90,6 +91,7 @@ struct dkwedge_softc {
        kcondvar_t      sc_dkdrn;
        u_int           sc_iopend;      /* I/Os pending */
        int             sc_flags;       /* flags (sc_iolock) */
+       struct sysctllog *sc_sysctllog; /* sysctl info */
 };
 
 #define        DK_F_WAIT_DRAIN         0x0001  /* waiting for I/O to drain */
@@ -107,6 +109,9 @@ static int  dkwedge_del1(struct dkwedge_i
 static int     dk_open_parent(dev_t, int, struct vnode **);
 static int     dk_close_parent(struct vnode *, int);
 
+static void    dkwedge_sysctl_attach(struct dkwedge_softc *);
+static void    dkwedge_sysctl_detach(struct dkwedge_softc *);
+
 static dev_type_open(dkopen);
 static dev_type_close(dkclose);
 static dev_type_read(dkread);
@@ -483,6 +488,8 @@ dkwedge_add(struct dkwedge_info *dkw)
            sc->sc_size, sc->sc_offset,
            sc->sc_ptype[0] == '\0' ? "<unknown>" : sc->sc_ptype);
 
+       dkwedge_sysctl_attach(sc);
+
        return (0);
 }
 
@@ -545,6 +552,8 @@ dkwedge_del1(struct dkwedge_info *dkw, i
        if ((sc = dkwedge_find(dkw, NULL)) == NULL)
                return (ESRCH);
 
+       dkwedge_sysctl_detach(sc);
+
        return config_detach(sc->sc_dev, flags);
 }
 
@@ -1684,3 +1693,68 @@ dkwedge_get_parent_name(dev_t dev)
        return sc->sc_parent->dk_name;
 }
 
+static void
+dkwedge_sysctl_detach(struct dkwedge_softc *sc)
+{
+       sysctl_teardown(&sc->sc_sysctllog);
+}
+
+static void
+dkwedge_sysctl_attach(struct dkwedge_softc *sc)
+{
+       int rc;
+       static const struct sysctlnode *rnode;
+       static struct sysctllog *dlog;
+       const struct sysctlnode *dnode;
+
+       struct sysctllog **clog = &sc->sc_sysctllog;
+
+       if (rnode == NULL) {
+               if ((rc = sysctl_createv(&dlog, 0, NULL, &rnode,
+                   CTLFLAG_PERMANENT, CTLTYPE_NODE, "dkwedge",
+                   SYSCTL_DESCR("wedge root"),
+                   NULL, 0, NULL, 0, CTL_HW, CTL_CREATE, CTL_EOL)) != 0)
+                       goto err;
+       }
+
+       if ((rc = sysctl_createv(clog, 0, &rnode, &dnode,
+           CTLFLAG_READONLY, CTLTYPE_NODE, device_xname(sc->sc_dev),
+           SYSCTL_DESCR("wedge info"),
+           NULL, 0, NULL, 0, CTL_CREATE, CTL_EOL)) != 0)
+               goto err;
+
+       if ((rc = sysctl_createv(clog, 0, &dnode, NULL,
+           CTLFLAG_READONLY, CTLTYPE_STRING, "wname",
+           SYSCTL_DESCR("wedge name"),
+           NULL, 0, sc->sc_wname, 0, CTL_CREATE, CTL_EOL)) != 0)
+               goto err;
+
+       if ((rc = sysctl_createv(clog, 0, &dnode, NULL,
+           CTLFLAG_READONLY, CTLTYPE_STRING, "parent",
+           SYSCTL_DESCR("parent disk name"),
+           NULL, 0, __UNCONST(sc->sc_parent->dk_name), 0,
+           CTL_CREATE, CTL_EOL)) != 0)
+               goto err;
+
+       if ((rc = sysctl_createv(clog, 0, &dnode, NULL,
+           CTLFLAG_READONLY, CTLTYPE_STRING, "ptype",
+           SYSCTL_DESCR("partition type"),
+           NULL, 0, sc->sc_ptype, 0, CTL_CREATE, CTL_EOL)) != 0)
+               goto err;
+
+       if ((rc = sysctl_createv(clog, 0, &dnode, NULL,
+           CTLFLAG_READONLY, CTLTYPE_QUAD, "size",
+           SYSCTL_DESCR("size in blocks"),
+           NULL, 0, &sc->sc_size, 0, CTL_CREATE, CTL_EOL)) != 0)
+               goto err;
+
+       if ((rc = sysctl_createv(clog, 0, &dnode, NULL,
+           CTLFLAG_READONLY, CTLTYPE_QUAD, "offset",
+           SYSCTL_DESCR("LBA offset in blocks"),
+           NULL, 0, &sc->sc_offset, 0, CTL_CREATE, CTL_EOL)) != 0)
+               goto err;
+
+       return;
+err:
+       aprint_error("%s: sysctl_createv failed (rc = %d)\n", __func__, rc);
+}



Reply via email to