From: Jeff Mahoney <jeffm@suse.com>
To: BtrFS List <linux-btrfs@vger.kernel.org>
Cc: Chris Mason <chris.mason@oracle.com>
Subject: [patch 01/65] btrfs: Add btrfs_panic()
Date: Mon, 03 Oct 2011 23:22:31 -0400 [thread overview]
Message-ID: <20111004032300.032619517@suse.com> (raw)
In-Reply-To: 20111004032230.458853274@suse.com
As part of the effort to eliminate BUG_ON as an error handling
technique, we need to determine which errors are actual logic errors,
which are on-disk corruption, and which are normal runtime errors
e.g. -ENOMEM.
Annotating these error cases is helpful to understand and report them.
This patch adds a btrfs_panic() routine that will either panic
or BUG depending on the new -ofatal_errors={panic,bug} mount option.
Since there are still so many BUG_ONs, it defaults to BUG for now but I
expect that to change once the error handling effort has made
significant progress.
Signed-off-by: Jeff Mahoney <jeffm@suse.com>
---
fs/btrfs/ctree.h | 11 +++++++++++
fs/btrfs/super.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 60 insertions(+), 1 deletion(-)
--- a/fs/btrfs/ctree.h
+++ b/fs/btrfs/ctree.h
@@ -1363,6 +1363,7 @@ struct btrfs_ioctl_defrag_range_args {
#define BTRFS_MOUNT_ENOSPC_DEBUG (1 << 15)
#define BTRFS_MOUNT_AUTO_DEFRAG (1 << 16)
#define BTRFS_MOUNT_INODE_MAP_CACHE (1 << 17)
+#define BTRFS_MOUNT_PANIC_ON_FATAL_ERROR (1 << 18)
#define btrfs_clear_opt(o, opt) ((o) &= ~BTRFS_MOUNT_##opt)
#define btrfs_set_opt(o, opt) ((o) |= BTRFS_MOUNT_##opt)
@@ -2648,6 +2649,16 @@ do { \
__btrfs_std_error((fs_info), __func__, __LINE__, (errno));\
} while (0)
+void __btrfs_panic(struct btrfs_fs_info *fs_info, const char *function,
+ unsigned int line, int errno, const char *fmt, ...);
+
+#define btrfs_panic(fs_info, errno, fmt, args...) \
+do { \
+ struct btrfs_fs_info *_i = (fs_info); \
+ __btrfs_panic(_i, __func__, __LINE__, errno, fmt, ##args); \
+ BUG_ON(!(_i->mount_opt & BTRFS_MOUNT_PANIC_ON_FATAL_ERROR)); \
+} while (0)
+
/* acl.c */
#ifdef CONFIG_BTRFS_FS_POSIX_ACL
struct posix_acl *btrfs_get_acl(struct inode *inode, int type);
--- a/fs/btrfs/super.c
+++ b/fs/btrfs/super.c
@@ -74,6 +74,9 @@ static const char *btrfs_decode_error(st
case -EROFS:
errstr = "Readonly filesystem";
break;
+ case -EEXIST:
+ errstr = "Object already exists";
+ break;
default:
if (nbuf) {
if (snprintf(nbuf, 16, "error %d", -errno) >= 0)
@@ -143,6 +146,36 @@ void __btrfs_std_error(struct btrfs_fs_i
btrfs_handle_error(fs_info);
}
+/*
+ * __btrfs_panic decodes unexpected, fatal errors from the caller,
+ * issues an alert, and either panics or BUGs, depending on mount options.
+ */
+void __btrfs_panic(struct btrfs_fs_info *fs_info, const char *function,
+ unsigned int line, int errno, const char *fmt, ...)
+{
+ char nbuf[16];
+ char *s_id = "<unknown>";
+ const char *errstr;
+ struct va_format vaf = { .fmt = fmt };
+ va_list args;
+
+ if (fs_info)
+ s_id = fs_info->sb->s_id;
+
+ va_start(args, fmt);
+ vaf.va = &args;
+
+ errstr = btrfs_decode_error(fs_info, errno, nbuf);
+ if (fs_info->mount_opt & BTRFS_MOUNT_PANIC_ON_FATAL_ERROR)
+ panic(KERN_CRIT "BTRFS panic (device %s) in %s:%d: %pV (%s)\n",
+ s_id, function, line, &vaf, errstr);
+
+ printk(KERN_CRIT "BTRFS panic (device %s) in %s:%d: %pV (%s)\n",
+ s_id, function, line, &vaf, errstr);
+ va_end(args);
+ /* Caller calls BUG() */
+}
+
static void btrfs_put_super(struct super_block *sb)
{
struct btrfs_root *root = btrfs_sb(sb);
@@ -162,7 +195,7 @@ enum {
Opt_notreelog, Opt_ratio, Opt_flushoncommit, Opt_discard,
Opt_space_cache, Opt_clear_cache, Opt_user_subvol_rm_allowed,
Opt_enospc_debug, Opt_subvolrootid, Opt_defrag,
- Opt_inode_cache, Opt_err,
+ Opt_inode_cache, Opt_fatal_errors, Opt_err,
};
static match_table_t tokens = {
@@ -195,6 +228,7 @@ static match_table_t tokens = {
{Opt_subvolrootid, "subvolrootid=%d"},
{Opt_defrag, "autodefrag"},
{Opt_inode_cache, "inode_cache"},
+ {Opt_fatal_errors, "fatal_errors=%s"},
{Opt_err, NULL},
};
@@ -381,6 +415,18 @@ int btrfs_parse_options(struct btrfs_roo
printk(KERN_INFO "btrfs: enabling auto defrag");
btrfs_set_opt(info->mount_opt, AUTO_DEFRAG);
break;
+ case Opt_fatal_errors:
+ if (strcmp(args[0].from, "panic") == 0)
+ btrfs_set_opt(info->mount_opt,
+ PANIC_ON_FATAL_ERROR);
+ else if (strcmp(args[0].from, "bug") == 0)
+ btrfs_clear_opt(info->mount_opt,
+ PANIC_ON_FATAL_ERROR);
+ else {
+ ret = -EINVAL;
+ goto out;
+ }
+ break;
case Opt_err:
printk(KERN_INFO "btrfs: unrecognized mount option "
"'%s'\n", p);
@@ -729,6 +775,8 @@ static int btrfs_show_options(struct seq
seq_puts(seq, ",autodefrag");
if (btrfs_test_opt(root, INODE_MAP_CACHE))
seq_puts(seq, ",inode_cache");
+ if (btrfs_test_opt(root, PANIC_ON_FATAL_ERROR))
+ seq_puts(seq, ",fatal_errors=panic");
return 0;
}
next prev parent reply other threads:[~2011-10-04 3:22 UTC|newest]
Thread overview: 69+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-10-04 3:22 [patch 00/65] Error handling patchset v3 Jeff Mahoney
2011-10-04 3:22 ` Jeff Mahoney [this message]
2011-10-10 16:35 ` [patch 01/65] btrfs: Add btrfs_panic() David Sterba
2011-10-10 16:42 ` David Sterba
2011-10-10 16:54 ` Jeff Mahoney
2011-10-04 3:22 ` [patch 02/65] btrfs: Catch locking failures in {set,clear}_extent_bit Jeff Mahoney
2011-10-04 3:22 ` [patch 03/65] btrfs: Panic on bad rbtree operations Jeff Mahoney
2011-10-04 3:22 ` [patch 04/65] btrfs: Simplify btrfs_insert_root Jeff Mahoney
2011-10-04 3:22 ` [patch 05/65] btrfs: set_extent_bit error push-up Jeff Mahoney
2011-10-04 3:22 ` [patch 06/65] btrfs: lock_extent " Jeff Mahoney
2011-10-04 3:22 ` [patch 07/65] btrfs: clear_extent_bit " Jeff Mahoney
2011-10-04 3:22 ` [patch 08/65] btrfs: unlock_extent " Jeff Mahoney
2011-10-04 3:22 ` [patch 09/65] btrfs: pin_down_extent should return void Jeff Mahoney
2011-10-04 3:22 ` [patch 10/65] btrfs: btrfs_pin_extent error push-up Jeff Mahoney
2011-10-04 3:22 ` [patch 11/65] btrfs: btrfs_drop_snapshot should return int Jeff Mahoney
2011-10-04 3:22 ` [patch 12/65] btrfs: btrfs_start_transaction non-looped error push-up Jeff Mahoney
2011-10-04 3:22 ` [patch 13/65] btrfs: find_and_setup_root " Jeff Mahoney
2011-10-04 3:22 ` [patch 14/65] btrfs: btrfs_update_root " Jeff Mahoney
2011-10-04 3:22 ` [patch 15/65] btrfs: set_range_writeback should return void Jeff Mahoney
2011-10-04 3:22 ` [patch 16/65] btrfs: wait_on_state " Jeff Mahoney
2011-10-04 3:22 ` [patch 17/65] btrfs: wait_extent_bit " Jeff Mahoney
2011-10-04 3:22 ` [patch 18/65] btrfs: __unlock_for_delalloc " Jeff Mahoney
2011-10-04 3:22 ` [patch 19/65] btrfs: check_page_uptodate " Jeff Mahoney
2011-10-04 3:22 ` [patch 20/65] btrfs: check_page_locked " Jeff Mahoney
2011-10-04 3:22 ` [patch 21/65] btrfs: check_page_writeback " Jeff Mahoney
2011-10-04 3:22 ` [patch 22/65] btrfs: clear_extent_buffer_dirty " Jeff Mahoney
2011-10-04 3:22 ` [patch 23/65] btrfs: btrfs_cleanup_fs_uuids " Jeff Mahoney
2011-10-04 3:22 ` [patch 24/65] btrfs: run_scheduled_bios " Jeff Mahoney
2011-10-04 3:22 ` [patch 25/65] btrfs: btrfs_close_extra_devices " Jeff Mahoney
2011-10-04 3:22 ` [patch 26/65] btrfs: schedule_bio " Jeff Mahoney
2011-10-04 3:22 ` [patch 27/65] btrfs: fill_device_from_item " Jeff Mahoney
2011-10-04 3:22 ` [patch 28/65] btrfs: btrfs_queue_worker " Jeff Mahoney
2011-10-04 3:22 ` [patch 29/65] btrfs: run_ordered_completions " Jeff Mahoney
2011-10-04 3:23 ` [patch 30/65] btrfs: btrfs_stop_workers " Jeff Mahoney
2011-10-04 3:23 ` [patch 31/65] btrfs: btrfs_requeue_work " Jeff Mahoney
2011-10-04 3:23 ` [patch 32/65] btrfs: tree-log: btrfs_end_log_trans " Jeff Mahoney
2011-10-04 3:23 ` [patch 33/65] btrfs: tree-log: wait_for_writer " Jeff Mahoney
2011-10-04 3:23 ` [patch 34/65] btrfs: btrfs_init_compress " Jeff Mahoney
2011-10-04 3:23 ` [patch 35/65] btrfs: btrfs_invalidate_inodes " Jeff Mahoney
2011-10-04 3:23 ` [patch 36/65] btrfs: __setup_root " Jeff Mahoney
2011-10-04 3:23 ` [patch 37/65] btrfs: btrfs_destroy_delalloc_inodes " Jeff Mahoney
2011-10-04 3:23 ` [patch 38/65] btrfs: btrfs_prepare_extent_commit " Jeff Mahoney
2011-10-04 3:23 ` [patch 39/65] btrfs: btrfs_set_block_group_rw " Jeff Mahoney
2011-10-04 3:23 ` [patch 40/65] btrfs: setup_inline_extent_backref " Jeff Mahoney
2011-10-04 3:23 ` [patch 41/65] btrfs: btrfs_run_defrag_inodes " Jeff Mahoney
2011-10-04 3:23 ` [patch 42/65] btrfs: Simplify btrfs_submit_bio_hook Jeff Mahoney
2011-10-04 3:23 ` [patch 43/65] btrfs: Factor out tree->ops->merge_bio_hook call Jeff Mahoney
2011-10-04 3:23 ` [patch 44/65] btrfs: ->submit_bio_hook error push-up Jeff Mahoney
2011-10-04 3:23 ` [patch 45/65] btrfs: __add_reloc_root " Jeff Mahoney
2011-10-04 3:23 ` [patch 46/65] btrfs: fixup_low_keys should return void Jeff Mahoney
2011-10-04 3:23 ` [patch 47/65] btrfs: setup_items_for_insert " Jeff Mahoney
2011-10-04 3:23 ` [patch 48/65] btrfs: del_ptr " Jeff Mahoney
2011-10-04 3:23 ` [patch 49/65] btrfs: insert_ptr " Jeff Mahoney
2011-10-04 3:23 ` [patch 50/65] btrfs: add_delayed_ref_head " Jeff Mahoney
2011-10-04 3:23 ` [patch 51/65] btrfs: add_delayed_tree_ref " Jeff Mahoney
2011-10-04 3:23 ` [patch 52/65] btrfs: add_delayed_data_ref " Jeff Mahoney
2011-10-04 3:23 ` [patch 53/65] btrfs: Fix kfree of member instead of structure Jeff Mahoney
2011-10-04 3:23 ` [patch 54/65] btrfs: Use mempools for delayed refs Jeff Mahoney
2011-10-04 3:23 ` [patch 55/65] btrfs: Delayed ref mempool functions should return void Jeff Mahoney
2011-10-04 3:23 ` [patch 56/65] btrfs: btrfs_inc_extent_ref void return prep Jeff Mahoney
2011-10-04 3:23 ` [patch 57/65] btrfs: btrfs_free_extent " Jeff Mahoney
2011-10-04 3:23 ` [patch 58/65] btrfs: __btrfs_mod_refs process_func should return void Jeff Mahoney
2011-10-04 3:23 ` [patch 59/65] btrfs: __btrfs_mod_ref " Jeff Mahoney
2011-10-04 3:23 ` [patch 60/65] btrfs: clean_tree_block " Jeff Mahoney
2011-10-04 3:23 ` [patch 61/65] btrfs: btrfs_truncate_item " Jeff Mahoney
2011-10-04 3:23 ` [patch 62/65] btrfs: btrfs_extend_item " Jeff Mahoney
2011-10-04 3:23 ` [patch 63/65] btrfs: end_compressed_writeback " Jeff Mahoney
2011-10-04 3:23 ` [patch 64/65] btrfs: copy_for_split " Jeff Mahoney
2011-10-04 3:23 ` [patch 65/65] btrfs: update_inline_extent_backref " Jeff Mahoney
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20111004032300.032619517@suse.com \
--to=jeffm@suse.com \
--cc=chris.mason@oracle.com \
--cc=linux-btrfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).