1*52fd3d6fSZach Brown /* -*- mode: c; c-basic-offset: 8; -*- 2*52fd3d6fSZach Brown * vim: noexpandtab sw=8 ts=8 sts=0: 3*52fd3d6fSZach Brown * 4*52fd3d6fSZach Brown * Copyright (C) 2004, 2005 Oracle. All rights reserved. 5*52fd3d6fSZach Brown * 6*52fd3d6fSZach Brown * This program is free software; you can redistribute it and/or 7*52fd3d6fSZach Brown * modify it under the terms of the GNU General Public 8*52fd3d6fSZach Brown * License as published by the Free Software Foundation; either 9*52fd3d6fSZach Brown * version 2 of the License, or (at your option) any later version. 10*52fd3d6fSZach Brown * 11*52fd3d6fSZach Brown * This program is distributed in the hope that it will be useful, 12*52fd3d6fSZach Brown * but WITHOUT ANY WARRANTY; without even the implied warranty of 13*52fd3d6fSZach Brown * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14*52fd3d6fSZach Brown * General Public License for more details. 15*52fd3d6fSZach Brown * 16*52fd3d6fSZach Brown * You should have received a copy of the GNU General Public 17*52fd3d6fSZach Brown * License along with this program; if not, write to the 18*52fd3d6fSZach Brown * Free Software Foundation, Inc., 59 Temple Place - Suite 330, 19*52fd3d6fSZach Brown * Boston, MA 021110-1307, USA. 20*52fd3d6fSZach Brown */ 21*52fd3d6fSZach Brown 22*52fd3d6fSZach Brown #include <linux/module.h> 23*52fd3d6fSZach Brown #include <linux/kernel.h> 24*52fd3d6fSZach Brown #include <linux/proc_fs.h> 25*52fd3d6fSZach Brown #include <linux/seq_file.h> 26*52fd3d6fSZach Brown #include <linux/string.h> 27*52fd3d6fSZach Brown #include <asm/uaccess.h> 28*52fd3d6fSZach Brown 29*52fd3d6fSZach Brown #include "masklog.h" 30*52fd3d6fSZach Brown 31*52fd3d6fSZach Brown struct mlog_bits mlog_and_bits = MLOG_BITS_RHS(MLOG_INITIAL_AND_MASK); 32*52fd3d6fSZach Brown EXPORT_SYMBOL_GPL(mlog_and_bits); 33*52fd3d6fSZach Brown struct mlog_bits mlog_not_bits = MLOG_BITS_RHS(MLOG_INITIAL_NOT_MASK); 34*52fd3d6fSZach Brown EXPORT_SYMBOL_GPL(mlog_not_bits); 35*52fd3d6fSZach Brown 36*52fd3d6fSZach Brown static ssize_t mlog_mask_show(u64 mask, char *buf) 37*52fd3d6fSZach Brown { 38*52fd3d6fSZach Brown char *state; 39*52fd3d6fSZach Brown 40*52fd3d6fSZach Brown if (__mlog_test_u64(mask, mlog_and_bits)) 41*52fd3d6fSZach Brown state = "allow"; 42*52fd3d6fSZach Brown else if (__mlog_test_u64(mask, mlog_not_bits)) 43*52fd3d6fSZach Brown state = "deny"; 44*52fd3d6fSZach Brown else 45*52fd3d6fSZach Brown state = "off"; 46*52fd3d6fSZach Brown 47*52fd3d6fSZach Brown return snprintf(buf, PAGE_SIZE, "%s\n", state); 48*52fd3d6fSZach Brown } 49*52fd3d6fSZach Brown 50*52fd3d6fSZach Brown static ssize_t mlog_mask_store(u64 mask, const char *buf, size_t count) 51*52fd3d6fSZach Brown { 52*52fd3d6fSZach Brown if (!strnicmp(buf, "allow", 5)) { 53*52fd3d6fSZach Brown __mlog_set_u64(mask, mlog_and_bits); 54*52fd3d6fSZach Brown __mlog_clear_u64(mask, mlog_not_bits); 55*52fd3d6fSZach Brown } else if (!strnicmp(buf, "deny", 4)) { 56*52fd3d6fSZach Brown __mlog_set_u64(mask, mlog_not_bits); 57*52fd3d6fSZach Brown __mlog_clear_u64(mask, mlog_and_bits); 58*52fd3d6fSZach Brown } else if (!strnicmp(buf, "off", 3)) { 59*52fd3d6fSZach Brown __mlog_clear_u64(mask, mlog_not_bits); 60*52fd3d6fSZach Brown __mlog_clear_u64(mask, mlog_and_bits); 61*52fd3d6fSZach Brown } else 62*52fd3d6fSZach Brown return -EINVAL; 63*52fd3d6fSZach Brown 64*52fd3d6fSZach Brown return count; 65*52fd3d6fSZach Brown } 66*52fd3d6fSZach Brown 67*52fd3d6fSZach Brown struct mlog_attribute { 68*52fd3d6fSZach Brown struct attribute attr; 69*52fd3d6fSZach Brown u64 mask; 70*52fd3d6fSZach Brown }; 71*52fd3d6fSZach Brown 72*52fd3d6fSZach Brown #define to_mlog_attr(_attr) container_of(_attr, struct mlog_attribute, attr) 73*52fd3d6fSZach Brown 74*52fd3d6fSZach Brown #define define_mask(_name) { \ 75*52fd3d6fSZach Brown .attr = { \ 76*52fd3d6fSZach Brown .name = #_name, \ 77*52fd3d6fSZach Brown .mode = S_IRUGO | S_IWUSR, \ 78*52fd3d6fSZach Brown }, \ 79*52fd3d6fSZach Brown .mask = ML_##_name, \ 80*52fd3d6fSZach Brown } 81*52fd3d6fSZach Brown 82*52fd3d6fSZach Brown static struct mlog_attribute mlog_attrs[MLOG_MAX_BITS] = { 83*52fd3d6fSZach Brown define_mask(ENTRY), 84*52fd3d6fSZach Brown define_mask(EXIT), 85*52fd3d6fSZach Brown define_mask(TCP), 86*52fd3d6fSZach Brown define_mask(MSG), 87*52fd3d6fSZach Brown define_mask(SOCKET), 88*52fd3d6fSZach Brown define_mask(HEARTBEAT), 89*52fd3d6fSZach Brown define_mask(HB_BIO), 90*52fd3d6fSZach Brown define_mask(DLMFS), 91*52fd3d6fSZach Brown define_mask(DLM), 92*52fd3d6fSZach Brown define_mask(DLM_DOMAIN), 93*52fd3d6fSZach Brown define_mask(DLM_THREAD), 94*52fd3d6fSZach Brown define_mask(DLM_MASTER), 95*52fd3d6fSZach Brown define_mask(DLM_RECOVERY), 96*52fd3d6fSZach Brown define_mask(AIO), 97*52fd3d6fSZach Brown define_mask(JOURNAL), 98*52fd3d6fSZach Brown define_mask(DISK_ALLOC), 99*52fd3d6fSZach Brown define_mask(SUPER), 100*52fd3d6fSZach Brown define_mask(FILE_IO), 101*52fd3d6fSZach Brown define_mask(EXTENT_MAP), 102*52fd3d6fSZach Brown define_mask(DLM_GLUE), 103*52fd3d6fSZach Brown define_mask(BH_IO), 104*52fd3d6fSZach Brown define_mask(UPTODATE), 105*52fd3d6fSZach Brown define_mask(NAMEI), 106*52fd3d6fSZach Brown define_mask(INODE), 107*52fd3d6fSZach Brown define_mask(VOTE), 108*52fd3d6fSZach Brown define_mask(DCACHE), 109*52fd3d6fSZach Brown define_mask(CONN), 110*52fd3d6fSZach Brown define_mask(QUORUM), 111*52fd3d6fSZach Brown define_mask(EXPORT), 112*52fd3d6fSZach Brown define_mask(ERROR), 113*52fd3d6fSZach Brown define_mask(NOTICE), 114*52fd3d6fSZach Brown define_mask(KTHREAD), 115*52fd3d6fSZach Brown }; 116*52fd3d6fSZach Brown 117*52fd3d6fSZach Brown static struct attribute *mlog_attr_ptrs[MLOG_MAX_BITS] = {NULL, }; 118*52fd3d6fSZach Brown 119*52fd3d6fSZach Brown static ssize_t mlog_show(struct kobject *obj, struct attribute *attr, 120*52fd3d6fSZach Brown char *buf) 121*52fd3d6fSZach Brown { 122*52fd3d6fSZach Brown struct mlog_attribute *mlog_attr = to_mlog_attr(attr); 123*52fd3d6fSZach Brown 124*52fd3d6fSZach Brown return mlog_mask_show(mlog_attr->mask, buf); 125*52fd3d6fSZach Brown } 126*52fd3d6fSZach Brown 127*52fd3d6fSZach Brown static ssize_t mlog_store(struct kobject *obj, struct attribute *attr, 128*52fd3d6fSZach Brown const char *buf, size_t count) 129*52fd3d6fSZach Brown { 130*52fd3d6fSZach Brown struct mlog_attribute *mlog_attr = to_mlog_attr(attr); 131*52fd3d6fSZach Brown 132*52fd3d6fSZach Brown return mlog_mask_store(mlog_attr->mask, buf, count); 133*52fd3d6fSZach Brown } 134*52fd3d6fSZach Brown 135*52fd3d6fSZach Brown static struct sysfs_ops mlog_attr_ops = { 136*52fd3d6fSZach Brown .show = mlog_show, 137*52fd3d6fSZach Brown .store = mlog_store, 138*52fd3d6fSZach Brown }; 139*52fd3d6fSZach Brown 140*52fd3d6fSZach Brown static struct kobj_type mlog_ktype = { 141*52fd3d6fSZach Brown .default_attrs = mlog_attr_ptrs, 142*52fd3d6fSZach Brown .sysfs_ops = &mlog_attr_ops, 143*52fd3d6fSZach Brown }; 144*52fd3d6fSZach Brown 145*52fd3d6fSZach Brown static struct kset mlog_kset = { 146*52fd3d6fSZach Brown .kobj = {.name = "logmask", .ktype = &mlog_ktype}, 147*52fd3d6fSZach Brown }; 148*52fd3d6fSZach Brown 149*52fd3d6fSZach Brown int mlog_sys_init(struct subsystem *o2cb_subsys) 150*52fd3d6fSZach Brown { 151*52fd3d6fSZach Brown int i = 0; 152*52fd3d6fSZach Brown 153*52fd3d6fSZach Brown while (mlog_attrs[i].attr.mode) { 154*52fd3d6fSZach Brown mlog_attr_ptrs[i] = &mlog_attrs[i].attr; 155*52fd3d6fSZach Brown i++; 156*52fd3d6fSZach Brown } 157*52fd3d6fSZach Brown mlog_attr_ptrs[i] = NULL; 158*52fd3d6fSZach Brown 159*52fd3d6fSZach Brown mlog_kset.subsys = o2cb_subsys; 160*52fd3d6fSZach Brown return kset_register(&mlog_kset); 161*52fd3d6fSZach Brown } 162*52fd3d6fSZach Brown 163*52fd3d6fSZach Brown void mlog_sys_shutdown(void) 164*52fd3d6fSZach Brown { 165*52fd3d6fSZach Brown kset_unregister(&mlog_kset); 166*52fd3d6fSZach Brown } 167