Date:        Sun, 29 Nov 2015 01:22:08 +0700
    From:        Robert Elz <k...@munnari.oz.au>
    Message-ID:  <19896.1448734...@andromeda.noi.kre.to>

  | Stuff related to PR 41704 generating a panic in my setup ...
  | Anyone have any suggestions?

Actually, the (or a) fix for this is astoundingly easy, and I'm
perplexed why it hasn't been fixed in the 6 years that the PR has
been open, or the 13 years since the core was first written ...

A patch that fixes it (for me, tested with the previous kernel,
splat panic (div by 0 if it matters) without this fix, and with
this applied, all works fine - tested configuring cgd2 as the
only configured CGD from a device with 4K sectors).

I am also going append the patch to the PR, but that's just for completeness,
getting working patches from gnats mail is insanely difficult,
getting it from this message should be easy.

The patch applies after Michael van Elst's fixes from yesterday (or earlier
today, depending upon your timezone)

kre

--- cgd.c       2015-11-29 02:34:23.000000000 +0700
+++ cgd.c.fixed 2015-11-29 02:32:11.000000000 +0700
@@ -107,7 +107,7 @@
 static int     cgd_diskstart(device_t, struct buf *);
 static void    cgdiodone(struct buf *);
 
-static int     cgd_ioctl_set(struct cgd_softc *, void *, struct lwp *);
+static int     cgd_ioctl_set(dev_t, struct cgd_softc *, void *, struct lwp *);
 static int     cgd_ioctl_clr(struct cgd_softc *, struct lwp *);
 static int     cgd_ioctl_get(dev_t, void *, struct lwp *);
 static int     cgdinit(struct cgd_softc *, const char *, struct vnode *,
@@ -553,7 +553,7 @@
        case CGDIOCSET:
                if (DK_ATTACHED(dksc))
                        return EBUSY;
-               return cgd_ioctl_set(cs, data, l);
+               return cgd_ioctl_set(dev, cs, data, l);
        case CGDIOCCLR:
                if (DK_BUSY(&cs->sc_dksc, pmask))
                        return EBUSY;
@@ -612,7 +612,7 @@
 
 /* ARGSUSED */
 static int
-cgd_ioctl_set(struct cgd_softc *cs, void *data, struct lwp *l)
+cgd_ioctl_set(dev_t dev, struct cgd_softc *cs, void *data, struct lwp *l)
 {
        struct   cgd_ioctl *ci = data;
        struct   vnode *vp;
@@ -712,7 +712,7 @@
        disk_set_info(dksc->sc_dev, &dksc->sc_dkdev, NULL);
 
        /* Try and read the disklabel. */
-       dk_getdisklabel(dksc, 0 /* XXX ? (cause of PR 41704) */);
+       dk_getdisklabel(dksc, dev);
 
        /* Discover wedges on this disk. */
        dkwedge_discover(&dksc->sc_dkdev);


Reply via email to