mirror of
https://github.com/torvalds/linux.git
synced 2024-11-13 23:51:39 +00:00
c4a7f5eb5f
Fix gcc warning and Oops that it causes: fs/ocfs2/cluster/masklog.c:161: warning: assignment from incompatible pointer type [ 2776.204120] OCFS2 Node Manager 1.3.3 [ 2776.211729] BUG: spinlock bad magic on CPU#0, modprobe/4424 [ 2776.214269] lock: ffff810021c8fe18, .magic: ffffffff, .owner: /6394416, .owner_cpu: 0 [ 2776.217864] [ 2776.217865] Call Trace: [ 2776.219662] [<ffffffff803426c8>] spin_bug+0x9e/0xe9 [ 2776.221921] [<ffffffff803427bf>] _raw_spin_lock+0x23/0xf9 [ 2776.224417] [<ffffffff8051acf4>] _spin_lock+0x9/0xb [ 2776.226676] [<ffffffff8033c3b1>] kobject_shadow_add+0x98/0x1ac [ 2776.229367] [<ffffffff8033c4d0>] kobject_add+0xb/0xd [ 2776.231665] [<ffffffff8033c4df>] kset_add+0xd/0xf [ 2776.233845] [<ffffffff8033c5a6>] kset_register+0x23/0x28 [ 2776.236309] [<ffffffff8808ccb7>] :ocfs2_nodemanager:mlog_sys_init+0x68/0x6d [ 2776.239518] [<ffffffff8808ccee>] :ocfs2_nodemanager:o2cb_sys_init+0x32/0x4a [ 2776.242726] [<ffffffff880b80a6>] :ocfs2_nodemanager:init_o2nm+0xa6/0xd5 [ 2776.245772] [<ffffffff8025266c>] sys_init_module+0x1471/0x15d2 [ 2776.248465] [<ffffffff8033f250>] simple_strtoull+0x0/0xdc [ 2776.250959] [<ffffffff8020948e>] system_call+0x7e/0x83 Signed-off-by: Randy Dunlap <randy.dunlap@oracle.com> Acked-by: Mark Fasheh <mark.fasheh@oracle.com> Cc: Greg KH <greg@kroah.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
169 lines
4.1 KiB
C
169 lines
4.1 KiB
C
/* -*- mode: c; c-basic-offset: 8; -*-
|
|
* vim: noexpandtab sw=8 ts=8 sts=0:
|
|
*
|
|
* Copyright (C) 2004, 2005 Oracle. 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; either
|
|
* version 2 of the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will 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 to the
|
|
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
* Boston, MA 021110-1307, USA.
|
|
*/
|
|
|
|
#include <linux/module.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/proc_fs.h>
|
|
#include <linux/seq_file.h>
|
|
#include <linux/string.h>
|
|
#include <asm/uaccess.h>
|
|
|
|
#include "masklog.h"
|
|
|
|
struct mlog_bits mlog_and_bits = MLOG_BITS_RHS(MLOG_INITIAL_AND_MASK);
|
|
EXPORT_SYMBOL_GPL(mlog_and_bits);
|
|
struct mlog_bits mlog_not_bits = MLOG_BITS_RHS(MLOG_INITIAL_NOT_MASK);
|
|
EXPORT_SYMBOL_GPL(mlog_not_bits);
|
|
|
|
static ssize_t mlog_mask_show(u64 mask, char *buf)
|
|
{
|
|
char *state;
|
|
|
|
if (__mlog_test_u64(mask, mlog_and_bits))
|
|
state = "allow";
|
|
else if (__mlog_test_u64(mask, mlog_not_bits))
|
|
state = "deny";
|
|
else
|
|
state = "off";
|
|
|
|
return snprintf(buf, PAGE_SIZE, "%s\n", state);
|
|
}
|
|
|
|
static ssize_t mlog_mask_store(u64 mask, const char *buf, size_t count)
|
|
{
|
|
if (!strnicmp(buf, "allow", 5)) {
|
|
__mlog_set_u64(mask, mlog_and_bits);
|
|
__mlog_clear_u64(mask, mlog_not_bits);
|
|
} else if (!strnicmp(buf, "deny", 4)) {
|
|
__mlog_set_u64(mask, mlog_not_bits);
|
|
__mlog_clear_u64(mask, mlog_and_bits);
|
|
} else if (!strnicmp(buf, "off", 3)) {
|
|
__mlog_clear_u64(mask, mlog_not_bits);
|
|
__mlog_clear_u64(mask, mlog_and_bits);
|
|
} else
|
|
return -EINVAL;
|
|
|
|
return count;
|
|
}
|
|
|
|
struct mlog_attribute {
|
|
struct attribute attr;
|
|
u64 mask;
|
|
};
|
|
|
|
#define to_mlog_attr(_attr) container_of(_attr, struct mlog_attribute, attr)
|
|
|
|
#define define_mask(_name) { \
|
|
.attr = { \
|
|
.name = #_name, \
|
|
.owner = THIS_MODULE, \
|
|
.mode = S_IRUGO | S_IWUSR, \
|
|
}, \
|
|
.mask = ML_##_name, \
|
|
}
|
|
|
|
static struct mlog_attribute mlog_attrs[MLOG_MAX_BITS] = {
|
|
define_mask(ENTRY),
|
|
define_mask(EXIT),
|
|
define_mask(TCP),
|
|
define_mask(MSG),
|
|
define_mask(SOCKET),
|
|
define_mask(HEARTBEAT),
|
|
define_mask(HB_BIO),
|
|
define_mask(DLMFS),
|
|
define_mask(DLM),
|
|
define_mask(DLM_DOMAIN),
|
|
define_mask(DLM_THREAD),
|
|
define_mask(DLM_MASTER),
|
|
define_mask(DLM_RECOVERY),
|
|
define_mask(AIO),
|
|
define_mask(JOURNAL),
|
|
define_mask(DISK_ALLOC),
|
|
define_mask(SUPER),
|
|
define_mask(FILE_IO),
|
|
define_mask(EXTENT_MAP),
|
|
define_mask(DLM_GLUE),
|
|
define_mask(BH_IO),
|
|
define_mask(UPTODATE),
|
|
define_mask(NAMEI),
|
|
define_mask(INODE),
|
|
define_mask(VOTE),
|
|
define_mask(DCACHE),
|
|
define_mask(CONN),
|
|
define_mask(QUORUM),
|
|
define_mask(EXPORT),
|
|
define_mask(ERROR),
|
|
define_mask(NOTICE),
|
|
define_mask(KTHREAD),
|
|
};
|
|
|
|
static struct attribute *mlog_attr_ptrs[MLOG_MAX_BITS] = {NULL, };
|
|
|
|
static ssize_t mlog_show(struct kobject *obj, struct attribute *attr,
|
|
char *buf)
|
|
{
|
|
struct mlog_attribute *mlog_attr = to_mlog_attr(attr);
|
|
|
|
return mlog_mask_show(mlog_attr->mask, buf);
|
|
}
|
|
|
|
static ssize_t mlog_store(struct kobject *obj, struct attribute *attr,
|
|
const char *buf, size_t count)
|
|
{
|
|
struct mlog_attribute *mlog_attr = to_mlog_attr(attr);
|
|
|
|
return mlog_mask_store(mlog_attr->mask, buf, count);
|
|
}
|
|
|
|
static struct sysfs_ops mlog_attr_ops = {
|
|
.show = mlog_show,
|
|
.store = mlog_store,
|
|
};
|
|
|
|
static struct kobj_type mlog_ktype = {
|
|
.default_attrs = mlog_attr_ptrs,
|
|
.sysfs_ops = &mlog_attr_ops,
|
|
};
|
|
|
|
static struct kset mlog_kset = {
|
|
.kobj = {.name = "logmask"},
|
|
.ktype = &mlog_ktype
|
|
};
|
|
|
|
int mlog_sys_init(struct kset *o2cb_subsys)
|
|
{
|
|
int i = 0;
|
|
|
|
while (mlog_attrs[i].attr.mode) {
|
|
mlog_attr_ptrs[i] = &mlog_attrs[i].attr;
|
|
i++;
|
|
}
|
|
mlog_attr_ptrs[i] = NULL;
|
|
|
|
kobj_set_kset_s(&mlog_kset, *o2cb_subsys);
|
|
return kset_register(&mlog_kset);
|
|
}
|
|
|
|
void mlog_sys_shutdown(void)
|
|
{
|
|
kset_unregister(&mlog_kset);
|
|
}
|