|
@@ -0,0 +1,119 @@
|
|
|
+/*
|
|
|
+ * Copyright (c) 2011 Red Hat, Inc. All Rights Reserved.
|
|
|
+ *
|
|
|
+ * This program is free software; you can redistribute it and/or
|
|
|
+ * modify it under the terms of the GNU General Public License as
|
|
|
+ * published by the Free Software Foundation.
|
|
|
+ *
|
|
|
+ * This program is distributed in the hope that it would be useful,
|
|
|
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
+ * GNU General Public License for more details.
|
|
|
+ *
|
|
|
+ * You should have received a copy of the GNU General Public License
|
|
|
+ * along with this program; if not, write the Free Software Foundation,
|
|
|
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
+ */
|
|
|
+
|
|
|
+#include "xfs.h"
|
|
|
+#include "xfs_fs.h"
|
|
|
+#include "xfs_types.h"
|
|
|
+#include "xfs_log.h"
|
|
|
+#include "xfs_inum.h"
|
|
|
+#include "xfs_trans.h"
|
|
|
+#include "xfs_sb.h"
|
|
|
+#include "xfs_ag.h"
|
|
|
+#include "xfs_mount.h"
|
|
|
+
|
|
|
+/*
|
|
|
+ * XFS logging functions
|
|
|
+ */
|
|
|
+static int
|
|
|
+__xfs_printk(
|
|
|
+ const char *level,
|
|
|
+ const struct xfs_mount *mp,
|
|
|
+ struct va_format *vaf)
|
|
|
+{
|
|
|
+ if (mp && mp->m_fsname)
|
|
|
+ return printk("%sXFS (%s): %pV\n", level, mp->m_fsname, vaf);
|
|
|
+ return printk("%sXFS: %pV\n", level, vaf);
|
|
|
+}
|
|
|
+
|
|
|
+int xfs_printk(
|
|
|
+ const char *level,
|
|
|
+ const struct xfs_mount *mp,
|
|
|
+ const char *fmt, ...)
|
|
|
+{
|
|
|
+ struct va_format vaf;
|
|
|
+ va_list args;
|
|
|
+ int r;
|
|
|
+
|
|
|
+ va_start(args, fmt);
|
|
|
+
|
|
|
+ vaf.fmt = fmt;
|
|
|
+ vaf.va = &args;
|
|
|
+
|
|
|
+ r = __xfs_printk(level, mp, &vaf);
|
|
|
+ va_end(args);
|
|
|
+
|
|
|
+ return r;
|
|
|
+}
|
|
|
+
|
|
|
+#define define_xfs_printk_level(func, kern_level) \
|
|
|
+int func(const struct xfs_mount *mp, const char *fmt, ...) \
|
|
|
+{ \
|
|
|
+ struct va_format vaf; \
|
|
|
+ va_list args; \
|
|
|
+ int r; \
|
|
|
+ \
|
|
|
+ va_start(args, fmt); \
|
|
|
+ \
|
|
|
+ vaf.fmt = fmt; \
|
|
|
+ vaf.va = &args; \
|
|
|
+ \
|
|
|
+ r = __xfs_printk(kern_level, mp, &vaf); \
|
|
|
+ va_end(args); \
|
|
|
+ \
|
|
|
+ return r; \
|
|
|
+} \
|
|
|
+
|
|
|
+define_xfs_printk_level(xfs_emerg, KERN_EMERG);
|
|
|
+define_xfs_printk_level(xfs_alert, KERN_ALERT);
|
|
|
+define_xfs_printk_level(xfs_crit, KERN_CRIT);
|
|
|
+define_xfs_printk_level(xfs_err, KERN_ERR);
|
|
|
+define_xfs_printk_level(xfs_warn, KERN_WARNING);
|
|
|
+define_xfs_printk_level(xfs_notice, KERN_NOTICE);
|
|
|
+define_xfs_printk_level(xfs_info, KERN_INFO);
|
|
|
+#ifdef DEBUG
|
|
|
+define_xfs_printk_level(xfs_debug, KERN_DEBUG);
|
|
|
+#endif
|
|
|
+
|
|
|
+int
|
|
|
+xfs_alert_tag(
|
|
|
+ const struct xfs_mount *mp,
|
|
|
+ int panic_tag,
|
|
|
+ const char *fmt, ...)
|
|
|
+{
|
|
|
+ struct va_format vaf;
|
|
|
+ va_list args;
|
|
|
+ int panic = 0;
|
|
|
+ int r;
|
|
|
+
|
|
|
+ if (xfs_panic_mask && (xfs_panic_mask & panic_tag)) {
|
|
|
+ xfs_printk(KERN_ALERT, mp,
|
|
|
+ "XFS: Transforming an alert into a BUG.");
|
|
|
+ panic = 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ va_start(args, fmt);
|
|
|
+
|
|
|
+ vaf.fmt = fmt;
|
|
|
+ vaf.va = &args;
|
|
|
+
|
|
|
+ r = __xfs_printk(KERN_ALERT, mp, &vaf);
|
|
|
+ va_end(args);
|
|
|
+
|
|
|
+ BUG_ON(panic);
|
|
|
+
|
|
|
+ return r;
|
|
|
+}
|