DF-0875 / fix.diff
diff --git a/sys/vfs/hammer2/hammer2_ondisk.c b/sys/vfs/hammer2/hammer2_ondisk.c --- a/sys/vfs/hammer2/hammer2_ondisk.c +++ b/sys/vfs/hammer2/hammer2_ondisk.c @@ -728,10 +728,12 @@ } //hammer2_voldata_unlock(hmp); - if (!ret) - panic("no volume for offset 0x%016jx", (intmax_t)offset); + if (ret == NULL) { + kprintf("hammer2_get_volume: no volume for offset 0x%016jx\n", + (intmax_t)offset); + return NULL; + } - KKASSERT(ret); KKASSERT(ret->dev); KKASSERT(ret->dev->devvp); KKASSERT(ret->dev->path); diff --git a/sys/vfs/hammer2/hammer2_io.c b/sys/vfs/hammer2/hammer2_io.c --- a/sys/vfs/hammer2/hammer2_io.c +++ b/sys/vfs/hammer2/hammer2_io.c @@ -140,6 +140,10 @@ } else if (createit) { refs = 0; vol = hammer2_get_volume(hmp, pbase); + if (vol == NULL) { + *isgoodp = 0; + return NULL; + } dio = kmalloc_obj(sizeof(*dio), hmp->mio, M_INTWAIT | M_ZERO); dio->hmp = hmp; dio->devvp = vol->dev->devvp; @@ -199,6 +203,8 @@ op = HAMMER2_DOP_READ; } else { dio = hammer2_io_alloc(hmp, lbase, btype, 1, &isgood); + if (dio == NULL) + return NULL; } for (;;) { @@ -398,6 +404,8 @@ dio = *diop; *diop = NULL; + if (dio == NULL) + return; hmp = dio->hmp; DIO_RECORD(dio HAMMER2_IO_DEBUG_CALL); @@ -571,6 +579,8 @@ hammer2_io_t **diop) { *diop = hammer2_io_getblk(hmp, btype, lbase, lsize, HAMMER2_DOP_NEW); + if (*diop == NULL) + return EIO; return ((*diop)->error); } @@ -579,6 +589,8 @@ hammer2_io_t **diop) { *diop = hammer2_io_getblk(hmp, btype, lbase, lsize, HAMMER2_DOP_NEWNZ); + if (*diop == NULL) + return EIO; return ((*diop)->error); } @@ -600,6 +612,8 @@ #endif } #endif + if (*diop == NULL) + return EIO; return ((*diop)->error); } |