DragonFlyBSD Kernel Audit
DF-0792 / fix.diff
← back to finding ↓ download raw
diff --git a/sys/vfs/hammer/hammer_io.c b/sys/vfs/hammer/hammer_io.c
--- a/sys/vfs/hammer/hammer_io.c
+++ b/sys/vfs/hammer/hammer_io.c
@@ -1498,7 +1498,8 @@
 		hammer_stats_disk_read += bp->b_bufsize;
 		vn_strategy(volume->devvp, nbio);
 	}
-	hammer_rel_volume(volume, 0);
+	if (volume != NULL)
+		hammer_rel_volume(volume, 0);
 done:
 	if (error) {
 		hdkprintf("failed @ %016jx\n", (intmax_t)zone2_offset);
@@ -1597,7 +1598,8 @@
 				hammer_indirect_callback, bio);
 		}
 	}
-	hammer_rel_volume(volume, 0);
+	if (volume != NULL)
+		hammer_rel_volume(volume, 0);
 done:
 	if (error) {
 		hdkprintf("failed @ %016jx\n", (intmax_t)zone2_offset);
@@ -1757,7 +1759,8 @@
 			vn_strategy(volume->devvp, nbio);
 			hammer_io_flush_mark(volume);
 		}
-		hammer_rel_volume(volume, 0);
+		if (volume != NULL)
+			hammer_rel_volume(volume, 0);
 	} else {
 		/*
 		 * Must fit in a standard HAMMER buffer.  In this case all
diff --git a/sys/vfs/hammer/hammer_ondisk.c b/sys/vfs/hammer/hammer_ondisk.c
--- a/sys/vfs/hammer/hammer_ondisk.c
+++ b/sys/vfs/hammer/hammer_ondisk.c
@@ -530,6 +530,8 @@
 {
 	struct buf *bp;
 
+	if (volume == NULL)
+		return;
 	if (hammer_rel_interlock(&volume->io.lock, locked)) {
 		lwkt_gettoken(&volume->io.hmp->fs_token);
 		volume->ondisk = NULL;