Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 13 Oct 1997 13:20:42 +0200
From:      Poul-Henning Kamp <phk@critter.freebsd.dk>
To:        joerg_wunsch@uriah.heep.sax.de (Joerg Wunsch)
Cc:        freebsd-current@FreeBSD.ORG (FreeBSD-current users)
Subject:   Re: lockmgr panic 
Message-ID:  <26001.876741642@critter.freebsd.dk>
In-Reply-To: Your message of "Mon, 13 Oct 1997 08:41:58 %2B0200." <19971013084158.HG40991@uriah.heep.sax.de> 

next in thread | previous in thread | raw e-mail | index | archive | help

I belive you hit "the other" recursive condition in vn, which is the
one we have no fix for I belive.  The closest we could get would be
to just queue the second buffer in vnstrategy() if we're already
active, but then it may simply convert to a deadlock...

I hacked this little "genuine ram disk driver" up a couple of days ago,
if should do everything you would want to have done if this is for release
building:


/*
 * ----------------------------------------------------------------------------
 * "THE BEER-WARE LICENSE" (Revision 42):
 * <phk@FreeBSD.org> wrote this file.  As long as you retain this notice you
 * can do whatever you want with this stuff. If we meet some day, and you think
 * this stuff is worth it, you can buy me a beer in return.   Poul-Henning Kamp
 * ----------------------------------------------------------------------------
 *
 * $Id$
 *
 */

#ifndef RD0_SIZE
#define RD0_SIZE (80*2*18*512)
#endif

/*
 * Includes
 */

#include "rd.h"
#include <sys/param.h>
#include <sys/kernel.h>
#include <sys/systm.h>
#include <sys/conf.h>
#include <sys/buf.h>
#include <sys/disklabel.h>
#include <sys/diskslice.h>


/*
 * Prototypes
 */

static	d_open_t	rdopen;
static	d_close_t	rdclose;
static	d_strategy_t	rdstrategy;
static	d_ioctl_t	rdioctl;
static	d_dump_t	rddump;
static	d_psize_t	rdsize;


/*
 * Data
 */

static
struct rd_softc {
	unsigned long		sc_size;
	u_char			*sc_base;
	struct diskslices	*sc_slices;
} softc[NRD];

#ifdef RD0_SIZE
static u_char rd0_data[RD0_SIZE] = "RD0 Image goes here";
#endif /* RD0_SIZE */


/*
 * Registation into the kernel data structures
 */

#define BDEV_MAJOR 24
#define CDEV_MAJOR 84
static struct cdevsw rd_cdevsw;
static struct bdevsw rd_bdevsw = 
	{ rdopen, rdclose, rdstrategy, rdioctl, rddump, rdsize, 
	 D_DISK, "rd", &rd_cdevsw, -1 };

static void 
rd_drvinit(void *unused)
{

	bdevsw_add_generic(BDEV_MAJOR, CDEV_MAJOR, &rd_bdevsw);
#ifdef RD0_SIZE
	softc[0].sc_base = rd0_data;
	softc[0].sc_size = RD0_SIZE;
#endif /* RD0_SIZE */
}

SYSINIT(rddev,SI_SUB_DRIVERS,SI_ORDER_MIDDLE+CDEV_MAJOR,rd_drvinit,NULL)


static	int
rdopen(dev_t dev, int flags, int mode, struct proc *p)
{
	struct rd_softc *sc;
	struct disklabel label;
	int error;

	sc = softc + dkunit(dev);
	bzero(&label, sizeof label);
	label.d_secsize = DEV_BSIZE;
	label.d_nsectors = sc->sc_size / DEV_BSIZE;
	label.d_ntracks = 1;
	label.d_ncylinders = 1;
	label.d_secpercyl = label.d_nsectors;
	label.d_secperunit = label.d_nsectors;
	error = dsopen("rd", dev, mode, &sc->sc_slices, &label, rdstrategy,
	    (ds_setgeom_t *)NULL, &rd_bdevsw, &rd_cdevsw);
	return (error);
}

static	int
rdclose(dev_t dev, int flags, int mode, struct proc *p)
{
	struct rd_softc *sc;

	sc = softc + dkunit(dev);
	dsclose(dev, mode, sc->sc_slices);
	return (0);
}

static	void
rdstrategy(struct buf *bp)
{
	struct rd_softc *sc;
	u_char *where;

	sc = softc + dkunit(bp->b_dev);
	bp->b_resid = bp->b_bcount;
	if (dscheck(bp, sc->sc_slices) <= 0) {
		biodone(bp);
		return;
	}
	where = sc->sc_base + dbtob(bp->b_pblkno);
	if (bp->b_flags & B_READ) {
		bcopy(where , bp->b_data, bp->b_bcount);
	} else {
		bcopy(bp->b_data, where, bp->b_bcount);
	}
	bp->b_resid -= bp->b_bcount;
	biodone(bp);
}

static	int
rdioctl(dev_t dev, int cmd, caddr_t data, int flag, struct proc *p)
{
	struct rd_softc *sc;
	int error;

	sc = softc + dkunit(dev);
	error = dsioctl("rd", dev, cmd, data, flag, &sc->sc_slices, 
			rdstrategy, (ds_setgeom_t *)NULL);
	if (error == -1)
		error = ENOTTY;
	return (error);
}

static	int
rddump(dev_t dev)
{
	return (ENODEV);
}

static	int
rdsize(dev_t dev)
{
	return (0);
}

--
Poul-Henning Kamp             FreeBSD coreteam member
phk@FreeBSD.ORG               "Real hackers run -current on their laptop."



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?26001.876741642>