reiserfs: introduce reiserfs_error()
authorJeff Mahoney <jeffm@suse.com>
Mon, 30 Mar 2009 18:02:27 +0000 (14:02 -0400)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 30 Mar 2009 19:16:36 +0000 (12:16 -0700)
Although reiserfs can currently handle severe errors such as journal failure,
it cannot handle less severe errors like metadata i/o failure. The following
patch adds a reiserfs_error() function akin to the one in ext3.

Subsequent patches will use this new error handler to handle errors more
gracefully in general.

Signed-off-by: Jeff Mahoney <jeffm@suse.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
fs/reiserfs/prints.c
include/linux/reiserfs_fs.h

index 84f3f69652e394f733f19daddd475b74d1c2e2a1..8e826c07cd218a2a91e25a4062bf5d9801a82229 100644 (file)
@@ -370,6 +370,31 @@ void __reiserfs_panic(struct super_block *sb, const char *id,
                      id ? id : "", id ? " " : "", function, error_buf);
 }
 
+void __reiserfs_error(struct super_block *sb, const char *id,
+                     const char *function, const char *fmt, ...)
+{
+       do_reiserfs_warning(fmt);
+
+       BUG_ON(sb == NULL);
+
+       if (reiserfs_error_panic(sb))
+               __reiserfs_panic(sb, id, function, error_buf);
+
+       if (id && id[0])
+               printk(KERN_CRIT "REISERFS error (device %s): %s %s: %s\n",
+                      sb->s_id, id, function, error_buf);
+       else
+               printk(KERN_CRIT "REISERFS error (device %s): %s: %s\n",
+                      sb->s_id, function, error_buf);
+
+       if (sb->s_flags & MS_RDONLY)
+               return;
+
+       reiserfs_info(sb, "Remounting filesystem read-only\n");
+       sb->s_flags |= MS_RDONLY;
+       reiserfs_abort_journal(sb, -EIO);
+}
+
 void reiserfs_abort(struct super_block *sb, int errno, const char *fmt, ...)
 {
        do_reiserfs_warning(fmt);
index d097966bbd91b7ec85a29edefda6ca465a1fb9e8..6c4af98b6767af73f18bfee81285311b495aecfb 100644 (file)
@@ -2006,6 +2006,10 @@ void __reiserfs_panic(struct super_block *s, const char *id,
     __attribute__ ((noreturn));
 #define reiserfs_panic(s, id, fmt, args...) \
        __reiserfs_panic(s, id, __func__, fmt, ##args)
+void __reiserfs_error(struct super_block *s, const char *id,
+                     const char *function, const char *fmt, ...);
+#define reiserfs_error(s, id, fmt, args...) \
+        __reiserfs_error(s, id, __func__, fmt, ##args)
 void reiserfs_info(struct super_block *s, const char *fmt, ...);
 void reiserfs_debug(struct super_block *s, int level, const char *fmt, ...);
 void print_indirect_item(struct buffer_head *bh, int item_num);