sysfs.c 5.3 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
static ssize_t recover_status_show(struct gdlm_ls *ls, char *buf)
{
	return sprintf(buf, "%d\n", ls->recover_jid_status);
}

118 119 120 121 122 123
struct gdlm_attr {
	struct attribute attr;
	ssize_t (*show)(struct gdlm_ls *, char *);
	ssize_t (*store)(struct gdlm_ls *, const char *, size_t);
};

124 125
#define GDLM_ATTR(_name,_mode,_show,_store) \
static struct gdlm_attr gdlm_attr_##_name = __ATTR(_name,_mode,_show,_store)
126

127 128 129 130 131 132 133 134 135 136
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);
GDLM_ATTR(recover_status, 0444, recover_status_show, NULL);
137 138

static struct attribute *gdlm_attrs[] = {
139
	&gdlm_attr_proto_name.attr,
140 141
	&gdlm_attr_block.attr,
	&gdlm_attr_withdraw.attr,
142
	&gdlm_attr_id.attr,
143 144 145 146 147
	&gdlm_attr_jid.attr,
	&gdlm_attr_first.attr,
	&gdlm_attr_first_done.attr,
	&gdlm_attr_recover.attr,
	&gdlm_attr_recover_done.attr,
148
	&gdlm_attr_recover_status.attr,
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 177 178 179 180 181 182 183
	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,
};

184
int gdlm_kobject_setup(struct gdlm_ls *ls, struct kobject *fskobj)
185 186 187
{
	int error;

188 189 190
	error = kobject_set_name(&ls->kobj, "%s", "lock_module");
	if (error) {
		log_error("can't set kobj name %d", error);
191
		return error;
192
	}
193 194 195

	ls->kobj.kset = &gdlm_kset;
	ls->kobj.ktype = &gdlm_ktype;
196
	ls->kobj.parent = fskobj;
197 198

	error = kobject_register(&ls->kobj);
199 200
	if (error)
		log_error("can't register kobj %d", error);
201

202
	return error;
203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225
}

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);
}