1*328970deSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later 252fd3d6fSZach Brown /* -*- mode: c; c-basic-offset: 8; -*- 352fd3d6fSZach Brown * vim: noexpandtab sw=8 ts=8 sts=0: 452fd3d6fSZach Brown * 552fd3d6fSZach Brown * Copyright (C) 2004, 2005 Oracle. All rights reserved. 652fd3d6fSZach Brown */ 752fd3d6fSZach Brown 852fd3d6fSZach Brown #include <linux/module.h> 952fd3d6fSZach Brown #include <linux/kernel.h> 1052fd3d6fSZach Brown #include <linux/proc_fs.h> 1152fd3d6fSZach Brown #include <linux/seq_file.h> 1252fd3d6fSZach Brown #include <linux/string.h> 137c0f6ba6SLinus Torvalds #include <linux/uaccess.h> 1452fd3d6fSZach Brown 1552fd3d6fSZach Brown #include "masklog.h" 1652fd3d6fSZach Brown 1752fd3d6fSZach Brown struct mlog_bits mlog_and_bits = MLOG_BITS_RHS(MLOG_INITIAL_AND_MASK); 1852fd3d6fSZach Brown EXPORT_SYMBOL_GPL(mlog_and_bits); 19c1e8d35eSTao Ma struct mlog_bits mlog_not_bits = MLOG_BITS_RHS(0); 2052fd3d6fSZach Brown EXPORT_SYMBOL_GPL(mlog_not_bits); 2152fd3d6fSZach Brown 2252fd3d6fSZach Brown static ssize_t mlog_mask_show(u64 mask, char *buf) 2352fd3d6fSZach Brown { 2452fd3d6fSZach Brown char *state; 2552fd3d6fSZach Brown 2652fd3d6fSZach Brown if (__mlog_test_u64(mask, mlog_and_bits)) 2752fd3d6fSZach Brown state = "allow"; 2852fd3d6fSZach Brown else if (__mlog_test_u64(mask, mlog_not_bits)) 2952fd3d6fSZach Brown state = "deny"; 3052fd3d6fSZach Brown else 3152fd3d6fSZach Brown state = "off"; 3252fd3d6fSZach Brown 3352fd3d6fSZach Brown return snprintf(buf, PAGE_SIZE, "%s\n", state); 3452fd3d6fSZach Brown } 3552fd3d6fSZach Brown 3652fd3d6fSZach Brown static ssize_t mlog_mask_store(u64 mask, const char *buf, size_t count) 3752fd3d6fSZach Brown { 382bd63329SRasmus Villemoes if (!strncasecmp(buf, "allow", 5)) { 3952fd3d6fSZach Brown __mlog_set_u64(mask, mlog_and_bits); 4052fd3d6fSZach Brown __mlog_clear_u64(mask, mlog_not_bits); 412bd63329SRasmus Villemoes } else if (!strncasecmp(buf, "deny", 4)) { 4252fd3d6fSZach Brown __mlog_set_u64(mask, mlog_not_bits); 4352fd3d6fSZach Brown __mlog_clear_u64(mask, mlog_and_bits); 442bd63329SRasmus Villemoes } else if (!strncasecmp(buf, "off", 3)) { 4552fd3d6fSZach Brown __mlog_clear_u64(mask, mlog_not_bits); 4652fd3d6fSZach Brown __mlog_clear_u64(mask, mlog_and_bits); 4752fd3d6fSZach Brown } else 4852fd3d6fSZach Brown return -EINVAL; 4952fd3d6fSZach Brown 5052fd3d6fSZach Brown return count; 5152fd3d6fSZach Brown } 5252fd3d6fSZach Brown 537c2bd2f9SJoe Perches void __mlog_printk(const u64 *mask, const char *func, int line, 547c2bd2f9SJoe Perches const char *fmt, ...) 557c2bd2f9SJoe Perches { 567c2bd2f9SJoe Perches struct va_format vaf; 577c2bd2f9SJoe Perches va_list args; 587c2bd2f9SJoe Perches const char *level; 597c2bd2f9SJoe Perches const char *prefix = ""; 607c2bd2f9SJoe Perches 617c2bd2f9SJoe Perches if (!__mlog_test_u64(*mask, mlog_and_bits) || 627c2bd2f9SJoe Perches __mlog_test_u64(*mask, mlog_not_bits)) 637c2bd2f9SJoe Perches return; 647c2bd2f9SJoe Perches 657c2bd2f9SJoe Perches if (*mask & ML_ERROR) { 667c2bd2f9SJoe Perches level = KERN_ERR; 677c2bd2f9SJoe Perches prefix = "ERROR: "; 687c2bd2f9SJoe Perches } else if (*mask & ML_NOTICE) { 697c2bd2f9SJoe Perches level = KERN_NOTICE; 707c2bd2f9SJoe Perches } else { 717c2bd2f9SJoe Perches level = KERN_INFO; 727c2bd2f9SJoe Perches } 737c2bd2f9SJoe Perches 747c2bd2f9SJoe Perches va_start(args, fmt); 757c2bd2f9SJoe Perches 767c2bd2f9SJoe Perches vaf.fmt = fmt; 777c2bd2f9SJoe Perches vaf.va = &args; 787c2bd2f9SJoe Perches 79e327284aSAndrew Morton printk("%s(%s,%u,%u):%s:%d %s%pV", 80e327284aSAndrew Morton level, current->comm, task_pid_nr(current), 81e327284aSAndrew Morton raw_smp_processor_id(), func, line, prefix, &vaf); 827c2bd2f9SJoe Perches 837c2bd2f9SJoe Perches va_end(args); 847c2bd2f9SJoe Perches } 857c2bd2f9SJoe Perches EXPORT_SYMBOL_GPL(__mlog_printk); 867c2bd2f9SJoe Perches 8752fd3d6fSZach Brown struct mlog_attribute { 8852fd3d6fSZach Brown struct attribute attr; 8952fd3d6fSZach Brown u64 mask; 9052fd3d6fSZach Brown }; 9152fd3d6fSZach Brown 9252fd3d6fSZach Brown #define to_mlog_attr(_attr) container_of(_attr, struct mlog_attribute, attr) 9352fd3d6fSZach Brown 9452fd3d6fSZach Brown #define define_mask(_name) { \ 9552fd3d6fSZach Brown .attr = { \ 9652fd3d6fSZach Brown .name = #_name, \ 9752fd3d6fSZach Brown .mode = S_IRUGO | S_IWUSR, \ 9852fd3d6fSZach Brown }, \ 9952fd3d6fSZach Brown .mask = ML_##_name, \ 10052fd3d6fSZach Brown } 10152fd3d6fSZach Brown 10252fd3d6fSZach Brown static struct mlog_attribute mlog_attrs[MLOG_MAX_BITS] = { 10352fd3d6fSZach Brown define_mask(TCP), 10452fd3d6fSZach Brown define_mask(MSG), 10552fd3d6fSZach Brown define_mask(SOCKET), 10652fd3d6fSZach Brown define_mask(HEARTBEAT), 10752fd3d6fSZach Brown define_mask(HB_BIO), 10852fd3d6fSZach Brown define_mask(DLMFS), 10952fd3d6fSZach Brown define_mask(DLM), 11052fd3d6fSZach Brown define_mask(DLM_DOMAIN), 11152fd3d6fSZach Brown define_mask(DLM_THREAD), 11252fd3d6fSZach Brown define_mask(DLM_MASTER), 11352fd3d6fSZach Brown define_mask(DLM_RECOVERY), 11452fd3d6fSZach Brown define_mask(DLM_GLUE), 11552fd3d6fSZach Brown define_mask(VOTE), 11652fd3d6fSZach Brown define_mask(CONN), 11752fd3d6fSZach Brown define_mask(QUORUM), 1189b915181SSunil Mushran define_mask(BASTS), 11941b41a26SSunil Mushran define_mask(CLUSTER), 12052fd3d6fSZach Brown define_mask(ERROR), 12152fd3d6fSZach Brown define_mask(NOTICE), 12252fd3d6fSZach Brown define_mask(KTHREAD), 12352fd3d6fSZach Brown }; 12452fd3d6fSZach Brown 12552fd3d6fSZach Brown static struct attribute *mlog_attr_ptrs[MLOG_MAX_BITS] = {NULL, }; 12652fd3d6fSZach Brown 12752fd3d6fSZach Brown static ssize_t mlog_show(struct kobject *obj, struct attribute *attr, 12852fd3d6fSZach Brown char *buf) 12952fd3d6fSZach Brown { 13052fd3d6fSZach Brown struct mlog_attribute *mlog_attr = to_mlog_attr(attr); 13152fd3d6fSZach Brown 13252fd3d6fSZach Brown return mlog_mask_show(mlog_attr->mask, buf); 13352fd3d6fSZach Brown } 13452fd3d6fSZach Brown 13552fd3d6fSZach Brown static ssize_t mlog_store(struct kobject *obj, struct attribute *attr, 13652fd3d6fSZach Brown const char *buf, size_t count) 13752fd3d6fSZach Brown { 13852fd3d6fSZach Brown struct mlog_attribute *mlog_attr = to_mlog_attr(attr); 13952fd3d6fSZach Brown 14052fd3d6fSZach Brown return mlog_mask_store(mlog_attr->mask, buf, count); 14152fd3d6fSZach Brown } 14252fd3d6fSZach Brown 14352cf25d0SEmese Revfy static const struct sysfs_ops mlog_attr_ops = { 14452fd3d6fSZach Brown .show = mlog_show, 14552fd3d6fSZach Brown .store = mlog_store, 14652fd3d6fSZach Brown }; 14752fd3d6fSZach Brown 14852fd3d6fSZach Brown static struct kobj_type mlog_ktype = { 14952fd3d6fSZach Brown .default_attrs = mlog_attr_ptrs, 15052fd3d6fSZach Brown .sysfs_ops = &mlog_attr_ops, 15152fd3d6fSZach Brown }; 15252fd3d6fSZach Brown 15352fd3d6fSZach Brown static struct kset mlog_kset = { 15434980ca8SGreg Kroah-Hartman .kobj = {.ktype = &mlog_ktype}, 15552fd3d6fSZach Brown }; 15652fd3d6fSZach Brown 157c60b7178SGreg Kroah-Hartman int mlog_sys_init(struct kset *o2cb_kset) 15852fd3d6fSZach Brown { 15952fd3d6fSZach Brown int i = 0; 16052fd3d6fSZach Brown 16152fd3d6fSZach Brown while (mlog_attrs[i].attr.mode) { 16252fd3d6fSZach Brown mlog_attr_ptrs[i] = &mlog_attrs[i].attr; 16352fd3d6fSZach Brown i++; 16452fd3d6fSZach Brown } 16552fd3d6fSZach Brown mlog_attr_ptrs[i] = NULL; 16652fd3d6fSZach Brown 16734980ca8SGreg Kroah-Hartman kobject_set_name(&mlog_kset.kobj, "logmask"); 168c60b7178SGreg Kroah-Hartman mlog_kset.kobj.kset = o2cb_kset; 16952fd3d6fSZach Brown return kset_register(&mlog_kset); 17052fd3d6fSZach Brown } 17152fd3d6fSZach Brown 17252fd3d6fSZach Brown void mlog_sys_shutdown(void) 17352fd3d6fSZach Brown { 17452fd3d6fSZach Brown kset_unregister(&mlog_kset); 17552fd3d6fSZach Brown } 176