linux-btrfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
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;
 }
 




  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).