From fc73edd859200813dad24f1ad58f5f4c6991e5ec Mon Sep 17 00:00:00 2001 From: Matthew Dillon Date: Mon, 2 Nov 2009 15:45:27 -0800 Subject: [PATCH] HAMMER VFS - Add sysctl vfs.hammer.debug_critical * Add sysctl vfs.hammer.debug_critical. If set to non-zero a critical CRC or media error will cause the kernel debugger to be entered. --- sys/vfs/hammer/hammer.h | 1 + sys/vfs/hammer/hammer_btree.c | 2 +- sys/vfs/hammer/hammer_inode.c | 3 ++- sys/vfs/hammer/hammer_io.c | 4 ++-- sys/vfs/hammer/hammer_object.c | 3 ++- sys/vfs/hammer/hammer_ondisk.c | 2 +- sys/vfs/hammer/hammer_subs.c | 6 ++++-- sys/vfs/hammer/hammer_vfsops.c | 8 ++++---- 8 files changed, 17 insertions(+), 12 deletions(-) diff --git a/sys/vfs/hammer/hammer.h b/sys/vfs/hammer/hammer.h index 51a7378fe9..579db22f7c 100644 --- a/sys/vfs/hammer/hammer.h +++ b/sys/vfs/hammer/hammer.h @@ -832,6 +832,7 @@ extern int hammer_debug_btree; extern int hammer_debug_tid; extern int hammer_debug_recover; extern int hammer_debug_recover_faults; +extern int hammer_debug_critical; extern int hammer_cluster_enable; extern int hammer_count_fsyncs; extern int hammer_count_inodes; diff --git a/sys/vfs/hammer/hammer_btree.c b/sys/vfs/hammer/hammer_btree.c index b0e4310f9e..c79b8352ec 100644 --- a/sys/vfs/hammer/hammer_btree.c +++ b/sys/vfs/hammer/hammer_btree.c @@ -729,7 +729,7 @@ hammer_btree_extract(hammer_cursor_t cursor, int flags) if (hammer_crc_test_leaf(cursor->data, &elm->leaf) == 0) { kprintf("CRC DATA @ %016llx/%d FAILED\n", (long long)elm->leaf.data_offset, elm->leaf.data_len); - if (hammer_debug_debug & 0x0001) + if (hammer_debug_critical) Debugger("CRC FAILED: DATA"); if (cursor->trans->flags & HAMMER_TRANSF_CRCDOM) error = EDOM; /* less critical (mirroring) */ diff --git a/sys/vfs/hammer/hammer_inode.c b/sys/vfs/hammer/hammer_inode.c index 877a526315..db1eb6d7a3 100644 --- a/sys/vfs/hammer/hammer_inode.c +++ b/sys/vfs/hammer/hammer_inode.c @@ -2445,7 +2445,8 @@ hammer_sync_record_callback(hammer_record_t record, void *data) #if 1 if (record->flush_group != record->ip->flush_group) { kprintf("sync_record %p ip %p bad flush group %p %p\n", record, record->ip, record->flush_group ,record->ip->flush_group); - Debugger("blah2"); + if (hammer_debug_critical) + Debugger("blah2"); return(0); } #endif diff --git a/sys/vfs/hammer/hammer_io.c b/sys/vfs/hammer/hammer_io.c index cc3900009b..66adcfb79e 100644 --- a/sys/vfs/hammer/hammer_io.c +++ b/sys/vfs/hammer/hammer_io.c @@ -1157,8 +1157,8 @@ hammer_io_direct_read_complete(struct bio *nbio) if (crc32(bp->b_data, bp->b_bufsize) != rec_crc) { kprintf("HAMMER: data_crc error @%016llx/%d\n", nbio->bio_offset, bp->b_bufsize); - if (hammer_debug_debug) - Debugger(""); + if (hammer_debug_critical) + Debugger("data_crc on read"); bp->b_flags |= B_ERROR; bp->b_error = EIO; } diff --git a/sys/vfs/hammer/hammer_object.c b/sys/vfs/hammer/hammer_object.c index 8ba2d534a7..2237b7d5a6 100644 --- a/sys/vfs/hammer/hammer_object.c +++ b/sys/vfs/hammer/hammer_object.c @@ -1202,7 +1202,8 @@ hammer_ip_sync_record_cursor(hammer_cursor_t cursor, hammer_record_t record) if (error == 0) { kprintf("hammer_ip_sync_record: duplicate rec " "at (%016llx)\n", (long long)record->leaf.base.key); - Debugger("duplicate record1"); + if (hammer_debug_critical) + Debugger("duplicate record1"); error = EIO; } #if 0 diff --git a/sys/vfs/hammer/hammer_ondisk.c b/sys/vfs/hammer/hammer_ondisk.c index 32fd7ee21d..e6f948c472 100644 --- a/sys/vfs/hammer/hammer_ondisk.c +++ b/sys/vfs/hammer/hammer_ondisk.c @@ -1195,7 +1195,7 @@ hammer_load_node(hammer_transaction_t trans, hammer_node_t node, int isnew) if (isnew == 0 && (node->flags & HAMMER_NODE_CRCANY) == 0) { if (hammer_crc_test_btree(node->ondisk) == 0) { - if (hammer_debug_debug & 0x0002) + if (hammer_debug_critical) Debugger("CRC FAILED: B-TREE NODE"); node->flags |= HAMMER_NODE_CRCBAD; } else { diff --git a/sys/vfs/hammer/hammer_subs.c b/sys/vfs/hammer/hammer_subs.c index 5c73ce1198..e365e81318 100644 --- a/sys/vfs/hammer/hammer_subs.c +++ b/sys/vfs/hammer/hammer_subs.c @@ -142,7 +142,8 @@ hammer_lock_sh(struct hammer_lock *lock) */ nlv = (lv + 1); if (atomic_cmpset_int(&lock->lockval, lv, nlv)) { - Debugger("hammer_lock_sh: already hold ex"); + if (hammer_debug_critical) + Debugger("hammer_lock_sh: holding ex"); break; } } else { @@ -181,7 +182,8 @@ hammer_lock_sh_try(struct hammer_lock *lock) */ nlv = (lv + 1); if (atomic_cmpset_int(&lock->lockval, lv, nlv)) { - Debugger("hammer_lock_sh: already hold ex"); + if (hammer_debug_critical) + Debugger("hammer_lock_sh: holding ex"); error = 0; break; } diff --git a/sys/vfs/hammer/hammer_vfsops.c b/sys/vfs/hammer/hammer_vfsops.c index 23be0ac6a2..757a398cb5 100644 --- a/sys/vfs/hammer/hammer_vfsops.c +++ b/sys/vfs/hammer/hammer_vfsops.c @@ -57,7 +57,7 @@ int hammer_debug_btree; int hammer_debug_tid; int hammer_debug_recover; /* -1 will disable, +1 will force */ int hammer_debug_recover_faults; -int hammer_error_panic; /* panic on error levels */ +int hammer_debug_critical; /* non-zero enter debugger on error */ int hammer_cluster_enable = 1; /* enable read clustering by default */ int hammer_count_fsyncs; int hammer_count_inodes; @@ -130,8 +130,8 @@ SYSCTL_INT(_vfs_hammer, OID_AUTO, debug_recover, CTLFLAG_RW, &hammer_debug_recover, 0, ""); SYSCTL_INT(_vfs_hammer, OID_AUTO, debug_recover_faults, CTLFLAG_RW, &hammer_debug_recover_faults, 0, ""); -SYSCTL_INT(_vfs_hammer, OID_AUTO, error_panic, CTLFLAG_RW, - &hammer_error_panic, 0, ""); +SYSCTL_INT(_vfs_hammer, OID_AUTO, debug_critical, CTLFLAG_RW, + &hammer_debug_critical, 0, ""); SYSCTL_INT(_vfs_hammer, OID_AUTO, cluster_enable, CTLFLAG_RW, &hammer_cluster_enable, 0, ""); @@ -808,7 +808,7 @@ hammer_critical_error(hammer_mount_t hmp, hammer_inode_t ip, hmp->mp->mnt_stat.f_mntfromname); } hmp->error = error; - if (hammer_error_panic > 2) + if (hammer_debug_critical) Debugger("Entering debugger"); } -- 2.41.0