|
@@ -125,6 +125,7 @@ static void btrfs_handle_error(struct btrfs_fs_info *fs_info)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+#ifdef CONFIG_PRINTK
|
|
|
/*
|
|
|
* __btrfs_std_error decodes expected errors from the caller and
|
|
|
* invokes the approciate error response.
|
|
@@ -167,7 +168,7 @@ void __btrfs_std_error(struct btrfs_fs_info *fs_info, const char *function,
|
|
|
va_end(args);
|
|
|
}
|
|
|
|
|
|
-const char *logtypes[] = {
|
|
|
+static const char * const logtypes[] = {
|
|
|
"emergency",
|
|
|
"alert",
|
|
|
"critical",
|
|
@@ -185,22 +186,50 @@ void btrfs_printk(struct btrfs_fs_info *fs_info, const char *fmt, ...)
|
|
|
struct va_format vaf;
|
|
|
va_list args;
|
|
|
const char *type = logtypes[4];
|
|
|
+ int kern_level;
|
|
|
|
|
|
va_start(args, fmt);
|
|
|
|
|
|
- if (fmt[0] == '<' && isdigit(fmt[1]) && fmt[2] == '>') {
|
|
|
- memcpy(lvl, fmt, 3);
|
|
|
- lvl[3] = '\0';
|
|
|
- fmt += 3;
|
|
|
- type = logtypes[fmt[1] - '0'];
|
|
|
+ kern_level = printk_get_level(fmt);
|
|
|
+ if (kern_level) {
|
|
|
+ size_t size = printk_skip_level(fmt) - fmt;
|
|
|
+ memcpy(lvl, fmt, size);
|
|
|
+ lvl[size] = '\0';
|
|
|
+ fmt += size;
|
|
|
+ type = logtypes[kern_level - '0'];
|
|
|
} else
|
|
|
*lvl = '\0';
|
|
|
|
|
|
vaf.fmt = fmt;
|
|
|
vaf.va = &args;
|
|
|
+
|
|
|
printk("%sBTRFS %s (device %s): %pV", lvl, type, sb->s_id, &vaf);
|
|
|
+
|
|
|
+ va_end(args);
|
|
|
}
|
|
|
|
|
|
+#else
|
|
|
+
|
|
|
+void __btrfs_std_error(struct btrfs_fs_info *fs_info, const char *function,
|
|
|
+ unsigned int line, int errno, const char *fmt, ...)
|
|
|
+{
|
|
|
+ struct super_block *sb = fs_info->sb;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Special case: if the error is EROFS, and we're already
|
|
|
+ * under MS_RDONLY, then it is safe here.
|
|
|
+ */
|
|
|
+ if (errno == -EROFS && (sb->s_flags & MS_RDONLY))
|
|
|
+ return;
|
|
|
+
|
|
|
+ /* Don't go through full error handling during mount */
|
|
|
+ if (sb->s_flags & MS_BORN) {
|
|
|
+ save_error_info(fs_info);
|
|
|
+ btrfs_handle_error(fs_info);
|
|
|
+ }
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
/*
|
|
|
* We only mark the transaction aborted and then set the file system read-only.
|
|
|
* This will prevent new transactions from starting or trying to join this
|