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. FOR TESTING ONLY Signed-off-by: Jeff Mahoney <[EMAIL PROTECTED]> diff -ruNpX dontdiff linux-2.6.13-rc3/fs/reiserfs/prints.c linux-2.6.13-rc3.errors/fs/reiserfs/prints.c --- linux-2.6.13-rc3/fs/reiserfs/prints.c 2005-07-13 13:57:32.000000000 -0400 +++ linux-2.6.13-rc3.errors/fs/reiserfs/prints.c 2005-07-14 16:36:47.000000000 -0400 @@ -366,6 +366,39 @@ void reiserfs_panic(struct super_block * reiserfs_bdevname(sb), error_buf); } +void reiserfs_handle_error(struct super_block *sb, int errno) +{ + + if (sb->s_flags & MS_RDONLY) + return; + + if (reiserfs_error_ro(sb)) { + reiserfs_info(sb, "Remounting filesystem read-only\n"); + sb->s_flags |= MS_RDONLY; + } else { + reiserfs_journal_abort(sb, errno); + } + + if (reiserfs_error_panic(sb)) { + reiserfs_panic (sb, "panic forced after error"); + } +} + +void reiserfs_error_internal(struct super_block *sb, const char *id, + const char *function, const char *fmt, ...) +{ + do_reiserfs_warning(fmt); + + 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); + + reiserfs_handle_error(sb, -EIO); +} + void reiserfs_abort(struct super_block *sb, int errno, const char *fmt, ...) { do_reiserfs_warning(fmt); diff -ruNpX dontdiff linux-2.6.13-rc3/include/linux/reiserfs_fs.h linux-2.6.13-rc3.errors/include/linux/reiserfs_fs.h --- linux-2.6.13-rc3/include/linux/reiserfs_fs.h 2005-07-13 13:57:33.000000000 -0400 +++ linux-2.6.13-rc3.errors/include/linux/reiserfs_fs.h 2005-07-14 15:53:13.000000000 -0400 @@ -1995,6 +1995,9 @@ void unfix_nodes(struct tree_balance *); /* prints.c */ void reiserfs_panic(struct super_block *s, const char *fmt, ...) __attribute__ ((noreturn)); +void reiserfs_error_internal(struct super_block *s, const char *id, const char *function, const char *fmt, ...); +#define reiserfs_error(s, id, fmt, args...) \ + reiserfs_error_internal(s, id, __FUNCTION__, 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); -- Jeff Mahoney SuSE Labs