sysfs.c 5.0 KB
Newer Older
1 2 3 4 5 6 7 8
/*
 * Copyright (C) Sistina Software, Inc.  1997-2003 All rights reserved.
 * Copyright (C) 2004-2005 Red Hat, Inc.  All rights reserved.
 *
 * This copyrighted material is made available to anyone wishing to use,
 * modify, copy, or redistribute it subject to the terms and conditions
 * of the GNU General Public License v.2.
 */
9 10 11 12 13 14

#include <linux/ctype.h>
#include <linux/stat.h>

#include "lock_dlm.h"

15 16 17 18 19 20 21 22
extern struct lm_lockops gdlm_ops;

static ssize_t proto_name_show(struct gdlm_ls *ls, char *buf)
{
	return sprintf(buf, "%s\n", gdlm_ops.lm_proto_name);
}

static ssize_t block_show(struct gdlm_ls *ls, char *buf)
23 24 25 26 27 28 29 30 31 32
{
	ssize_t ret;
	int val = 0;

	if (test_bit(DFL_BLOCK_LOCKS, &ls->flags))
		val = 1;
	ret = sprintf(buf, "%d\n", val);
	return ret;
}

33
static ssize_t block_store(struct gdlm_ls *ls, const char *buf, size_t len)
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
{
	ssize_t ret = len;
	int val;

	val = simple_strtol(buf, NULL, 0);

	if (val == 1)
		set_bit(DFL_BLOCK_LOCKS, &ls->flags);
	else if (val == 0) {
		clear_bit(DFL_BLOCK_LOCKS, &ls->flags);
		gdlm_submit_delayed(ls);
	} else
		ret = -EINVAL;
	return ret;
}

50
static ssize_t withdraw_show(struct gdlm_ls *ls, char *buf)
51 52 53 54 55 56 57 58 59 60
{
	ssize_t ret;
	int val = 0;

	if (test_bit(DFL_WITHDRAW, &ls->flags))
		val = 1;
	ret = sprintf(buf, "%d\n", val);
	return ret;
}

61
static ssize_t withdraw_store(struct gdlm_ls *ls, const char *buf, size_t len)
62 63 64 65 66 67 68 69 70 71 72 73 74 75
{
	ssize_t ret = len;
	int val;

	val = simple_strtol(buf, NULL, 0);

	if (val == 1)
		set_bit(DFL_WITHDRAW, &ls->flags);
	else
		ret = -EINVAL;
	wake_up(&ls->wait_control);
	return ret;
}

76
static ssize_t id_show(struct gdlm_ls *ls, char *buf)
77
{
78
	return sprintf(buf, "%u\n", ls->id);
79 80
}

81
static ssize_t jid_show(struct gdlm_ls *ls, char *buf)
82
{
83
	return sprintf(buf, "%d\n", ls->jid);
84 85
}

86
static ssize_t first_show(struct gdlm_ls *ls, char *buf)
87
{
88
	return sprintf(buf, "%d\n", ls->first);
89 90
}

91
static ssize_t first_done_show(struct gdlm_ls *ls, char *buf)
92 93 94 95
{
	return sprintf(buf, "%d\n", ls->first_done);
}

96
static ssize_t recover_show(struct gdlm_ls *ls, char *buf)
97
{
98
	return sprintf(buf, "%d\n", ls->recover_jid);
99 100
}

101
static ssize_t recover_store(struct gdlm_ls *ls, const char *buf, size_t len)
102 103 104 105 106 107
{
	ls->recover_jid = simple_strtol(buf, NULL, 0);
	ls->fscb(ls->fsdata, LM_CB_NEED_RECOVERY, &ls->recover_jid);
	return len;
}

108
static ssize_t recover_done_show(struct gdlm_ls *ls, char *buf)
109
{
110
	return sprintf(buf, "%d\n", ls->recover_jid_done);
111 112 113 114 115 116 117 118
}

struct gdlm_attr {
	struct attribute attr;
	ssize_t (*show)(struct gdlm_ls *, char *);
	ssize_t (*store)(struct gdlm_ls *, const char *, size_t);
};

119 120
#define GDLM_ATTR(_name,_mode,_show,_store) \
static struct gdlm_attr gdlm_attr_##_name = __ATTR(_name,_mode,_show,_store)
121

122 123 124 125 126 127 128 129 130
GDLM_ATTR(proto_name,   0444, proto_name_show,   NULL);
GDLM_ATTR(block,        0644, block_show,        block_store);
GDLM_ATTR(withdraw,     0644, withdraw_show,     withdraw_store);
GDLM_ATTR(id,           0444, id_show,           NULL);
GDLM_ATTR(jid,          0444, jid_show,          NULL);
GDLM_ATTR(first,        0444, first_show,        NULL);
GDLM_ATTR(first_done,   0444, first_done_show,   NULL);
GDLM_ATTR(recover,      0644, recover_show,      recover_store);
GDLM_ATTR(recover_done, 0444, recover_done_show, NULL);
131 132

static struct attribute *gdlm_attrs[] = {
133
	&gdlm_attr_proto_name.attr,
134 135
	&gdlm_attr_block.attr,
	&gdlm_attr_withdraw.attr,
136
	&gdlm_attr_id.attr,
137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176
	&gdlm_attr_jid.attr,
	&gdlm_attr_first.attr,
	&gdlm_attr_first_done.attr,
	&gdlm_attr_recover.attr,
	&gdlm_attr_recover_done.attr,
	NULL,
};

static ssize_t gdlm_attr_show(struct kobject *kobj, struct attribute *attr,
			      char *buf)
{
	struct gdlm_ls *ls = container_of(kobj, struct gdlm_ls, kobj);
	struct gdlm_attr *a = container_of(attr, struct gdlm_attr, attr);
	return a->show ? a->show(ls, buf) : 0;
}

static ssize_t gdlm_attr_store(struct kobject *kobj, struct attribute *attr,
			       const char *buf, size_t len)
{
	struct gdlm_ls *ls = container_of(kobj, struct gdlm_ls, kobj);
	struct gdlm_attr *a = container_of(attr, struct gdlm_attr, attr);
	return a->store ? a->store(ls, buf, len) : len;
}

static struct sysfs_ops gdlm_attr_ops = {
	.show  = gdlm_attr_show,
	.store = gdlm_attr_store,
};

static struct kobj_type gdlm_ktype = {
	.default_attrs = gdlm_attrs,
	.sysfs_ops     = &gdlm_attr_ops,
};

static struct kset gdlm_kset = {
	.subsys = &kernel_subsys,
	.kobj   = {.name = "lock_dlm",},
	.ktype  = &gdlm_ktype,
};

177
int gdlm_kobject_setup(struct gdlm_ls *ls, struct kobject *fskobj)
178 179 180
{
	int error;

181 182 183
	error = kobject_set_name(&ls->kobj, "%s", "lock_module");
	if (error) {
		log_error("can't set kobj name %d", error);
184
		return error;
185
	}
186 187 188

	ls->kobj.kset = &gdlm_kset;
	ls->kobj.ktype = &gdlm_ktype;
189
	ls->kobj.parent = fskobj;
190 191

	error = kobject_register(&ls->kobj);
192 193
	if (error)
		log_error("can't register kobj %d", error);
194

195
	return error;
196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218
}

void gdlm_kobject_release(struct gdlm_ls *ls)
{
	kobject_unregister(&ls->kobj);
}

int gdlm_sysfs_init(void)
{
	int error;

	error = kset_register(&gdlm_kset);
	if (error)
		printk("lock_dlm: cannot register kset %d\n", error);

	return error;
}

void gdlm_sysfs_exit(void)
{
	kset_unregister(&gdlm_kset);
}