tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: dump to cgdNb device



   Date: Thu, 16 Jun 2016 02:52:59 +0000
   From: Taylor R Campbell <campbell+netbsd-tech-kern%mumble.net@localhost>

   By a quick skim of cgddump and dk_dump, it looks likely that the
   missing part is a definition for cgddkdriver.d_dumpblocks.  Here's a
   candidate definition that you might try, attached.  (Not tested, not
   even compile-tested, caveat lector, &c.)

Slightly simpler version attached -- device_private is not
device_lookup; device_private never fails.  (If the device_lookup in
cgddump failed, we wouldn't have gotten to cgd_dumpblocks anyway.)
static int
cgd_dumpblocks(device_t dev, void *va, daddr_t blkno, int nblk)
{
	struct cgd_softc *sc = device_private(dev);
	struct dk_softc *dksc = &sc->sc_dksc;
	struct disk_geom *dg = &dksc->sc_dkdev.dk_geom;
	struct disklabel *lp = dksc->sc_dkdev.dk_label;
	size_t nbytes;
	void *buf;
	int error;

	/*
	 * Compute the number of bytes in this request, which dk_dump
	 * has `helpfully' converted to a number of blocks for us.
	 */
	nbytes = nblk*lp->d_secsize;

	/* Try to acquire a buffer to store the ciphertext.  */
	buf = cgd_getdata(dksc, nbytes);
	if (buf == NULL)
		/* Out of memory: give up.  */
		return ENOMEM;

	/* Encrypt the caller's data into the temporary buffer.  */
	cgd_cipher(sc, buf, va, nbytes, blkno, dg->dg_secsize,
	    CGD_CIPHER_ENCRYPT);

	/* Pass it on to the underlying disk device.  */
	error = bdev_dump(sc->sc_tdev, blkno, buf, nbytes);

	/* Release the buffer.  */
	cgd_putdata(dksc, buf);

	/* Return any error from the underlying disk device.  */
	return error;
}


Home | Main Index | Thread Index | Old Index