On Tue, Nov 10, 2009 at 08:48:42AM +0000, Matthias Scheler wrote: > > A LOCKDEBUG kernel will panic. How can we avoid the stack > > overflows and such in a different way? > > I'll try to rewrite the code to use M_NOWAIT.
The attached diff changes the code to use M_NOWAIT. I have however only compiled tested it so far. Kind regards -- Matthias Scheler http://zhadum.org.uk/
Index: sys/dev/cgd.c =================================================================== RCS file: /cvsroot/src/sys/dev/cgd.c,v retrieving revision 1.60 diff -u -r1.60 cgd.c --- sys/dev/cgd.c 11 Sep 2009 13:36:37 -0000 1.60 +++ sys/dev/cgd.c 10 Nov 2009 13:33:02 -0000 @@ -84,7 +84,7 @@ static int cgd_ioctl_clr(struct cgd_softc *, void *, struct lwp *); static int cgdinit(struct cgd_softc *, const char *, struct vnode *, struct lwp *); -static void cgd_cipher(struct cgd_softc *, void *, void *, +static bool cgd_cipher(struct cgd_softc *, void *, void *, size_t, daddr_t, size_t, int); /* Pseudo-disk Interface */ @@ -318,8 +318,13 @@ disk_unbusy(&dksc->sc_dkdev, 0, (bp->b_flags & B_READ)); return -1; } - cgd_cipher(cs, newaddr, addr, bp->b_bcount, bn, - DEV_BSIZE, CGD_CIPHER_ENCRYPT); + if (!cgd_cipher(cs, newaddr, addr, bp->b_bcount, bn, + DEV_BSIZE, CGD_CIPHER_ENCRYPT)) { + cgd_putdata(dksc, newaddr); + putiobuf(nbp); + disk_unbusy(&dksc->sc_dkdev, 0, (bp->b_flags & B_READ)); + return -1; + } } nbp->b_data = newaddr; @@ -371,9 +376,12 @@ * we used to encrypt the blocks. */ - if (nbp->b_flags & B_READ) - cgd_cipher(cs, obp->b_data, obp->b_data, obp->b_bcount, - nbp->b_blkno, DEV_BSIZE, CGD_CIPHER_DECRYPT); + if (nbp->b_flags & B_READ) { + if (!cgd_cipher(cs, obp->b_data, obp->b_data, obp->b_bcount, + nbp->b_blkno, DEV_BSIZE, CGD_CIPHER_DECRYPT)) { + obp->b_error = ENOMEM; + } + } /* If we allocated memory, free it now... */ if (nbp->b_data != obp->b_data) @@ -763,7 +771,7 @@ } } -static void +static bool cgd_cipher(struct cgd_softc *cs, void *dstv, void *srcv, size_t len, daddr_t blkno, size_t secsize, int dir) { @@ -779,7 +787,9 @@ char *zero_iv; char *blkno_buf; - sink = malloc(blocksize * 3, M_DEVBUF, M_WAITOK); + sink = malloc(blocksize * 3, M_DEVBUF, M_NOWAIT); + if (sink == NULL) + return false; zero_iv = &sink[blocksize]; blkno_buf = &zero_iv[blocksize]; @@ -837,6 +847,7 @@ } free(sink, M_DEVBUF); + return true; } #ifdef DEBUG