blob: 4ec571c3d8a9cb00758a2e3b7dc40180b678f4fe [file] [log] [blame]
David Teigland869d81d2006-01-17 08:47:12 +00001/*
2 * Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
3 * Copyright (C) 2004-2005 Red Hat, Inc. All rights reserved.
4 *
5 * This copyrighted material is made available to anyone wishing to use,
6 * modify, copy, or redistribute it subject to the terms and conditions
Steven Whitehousee9fc2aa2006-09-01 11:05:15 -04007 * of the GNU General Public License version 2.
David Teigland869d81d2006-01-17 08:47:12 +00008 */
David Teigland29b79982006-01-16 16:52:38 +00009
10#include <linux/ctype.h>
11#include <linux/stat.h>
12
13#include "lock_dlm.h"
14
David Teigland869d81d2006-01-17 08:47:12 +000015static ssize_t proto_name_show(struct gdlm_ls *ls, char *buf)
16{
17 return sprintf(buf, "%s\n", gdlm_ops.lm_proto_name);
18}
19
20static ssize_t block_show(struct gdlm_ls *ls, char *buf)
David Teigland29b79982006-01-16 16:52:38 +000021{
22 ssize_t ret;
23 int val = 0;
24
25 if (test_bit(DFL_BLOCK_LOCKS, &ls->flags))
26 val = 1;
27 ret = sprintf(buf, "%d\n", val);
28 return ret;
29}
30
David Teigland869d81d2006-01-17 08:47:12 +000031static ssize_t block_store(struct gdlm_ls *ls, const char *buf, size_t len)
David Teigland29b79982006-01-16 16:52:38 +000032{
33 ssize_t ret = len;
34 int val;
35
36 val = simple_strtol(buf, NULL, 0);
37
38 if (val == 1)
39 set_bit(DFL_BLOCK_LOCKS, &ls->flags);
40 else if (val == 0) {
41 clear_bit(DFL_BLOCK_LOCKS, &ls->flags);
42 gdlm_submit_delayed(ls);
Steven Whitehouse62f140c2006-09-07 09:54:55 -040043 } else {
David Teigland29b79982006-01-16 16:52:38 +000044 ret = -EINVAL;
Steven Whitehouse62f140c2006-09-07 09:54:55 -040045 }
David Teigland29b79982006-01-16 16:52:38 +000046 return ret;
47}
48
David Teigland869d81d2006-01-17 08:47:12 +000049static ssize_t withdraw_show(struct gdlm_ls *ls, char *buf)
David Teigland29b79982006-01-16 16:52:38 +000050{
51 ssize_t ret;
52 int val = 0;
53
54 if (test_bit(DFL_WITHDRAW, &ls->flags))
55 val = 1;
56 ret = sprintf(buf, "%d\n", val);
57 return ret;
58}
59
David Teigland869d81d2006-01-17 08:47:12 +000060static ssize_t withdraw_store(struct gdlm_ls *ls, const char *buf, size_t len)
David Teigland29b79982006-01-16 16:52:38 +000061{
62 ssize_t ret = len;
63 int val;
64
65 val = simple_strtol(buf, NULL, 0);
66
67 if (val == 1)
68 set_bit(DFL_WITHDRAW, &ls->flags);
69 else
70 ret = -EINVAL;
71 wake_up(&ls->wait_control);
72 return ret;
73}
74
David Teigland869d81d2006-01-17 08:47:12 +000075static ssize_t id_show(struct gdlm_ls *ls, char *buf)
David Teigland29b79982006-01-16 16:52:38 +000076{
David Teigland869d81d2006-01-17 08:47:12 +000077 return sprintf(buf, "%u\n", ls->id);
David Teigland29b79982006-01-16 16:52:38 +000078}
79
David Teigland869d81d2006-01-17 08:47:12 +000080static ssize_t jid_show(struct gdlm_ls *ls, char *buf)
David Teigland29b79982006-01-16 16:52:38 +000081{
David Teigland869d81d2006-01-17 08:47:12 +000082 return sprintf(buf, "%d\n", ls->jid);
David Teigland29b79982006-01-16 16:52:38 +000083}
84
David Teigland869d81d2006-01-17 08:47:12 +000085static ssize_t first_show(struct gdlm_ls *ls, char *buf)
David Teigland29b79982006-01-16 16:52:38 +000086{
David Teigland869d81d2006-01-17 08:47:12 +000087 return sprintf(buf, "%d\n", ls->first);
David Teigland29b79982006-01-16 16:52:38 +000088}
89
David Teigland869d81d2006-01-17 08:47:12 +000090static ssize_t first_done_show(struct gdlm_ls *ls, char *buf)
David Teigland29b79982006-01-16 16:52:38 +000091{
92 return sprintf(buf, "%d\n", ls->first_done);
93}
94
David Teigland869d81d2006-01-17 08:47:12 +000095static ssize_t recover_show(struct gdlm_ls *ls, char *buf)
David Teigland29b79982006-01-16 16:52:38 +000096{
David Teigland869d81d2006-01-17 08:47:12 +000097 return sprintf(buf, "%d\n", ls->recover_jid);
David Teigland29b79982006-01-16 16:52:38 +000098}
99
David Teigland869d81d2006-01-17 08:47:12 +0000100static ssize_t recover_store(struct gdlm_ls *ls, const char *buf, size_t len)
David Teigland29b79982006-01-16 16:52:38 +0000101{
102 ls->recover_jid = simple_strtol(buf, NULL, 0);
Steven Whitehouse1c089c32006-09-07 15:50:20 -0400103 ls->fscb(ls->sdp, LM_CB_NEED_RECOVERY, &ls->recover_jid);
David Teigland29b79982006-01-16 16:52:38 +0000104 return len;
105}
106
David Teigland869d81d2006-01-17 08:47:12 +0000107static ssize_t recover_done_show(struct gdlm_ls *ls, char *buf)
David Teigland29b79982006-01-16 16:52:38 +0000108{
David Teigland869d81d2006-01-17 08:47:12 +0000109 return sprintf(buf, "%d\n", ls->recover_jid_done);
David Teigland29b79982006-01-16 16:52:38 +0000110}
111
David Teigland6bd70ab2006-04-26 15:56:35 -0400112static ssize_t recover_status_show(struct gdlm_ls *ls, char *buf)
113{
114 return sprintf(buf, "%d\n", ls->recover_jid_status);
115}
116
David Teigland29b79982006-01-16 16:52:38 +0000117struct gdlm_attr {
118 struct attribute attr;
119 ssize_t (*show)(struct gdlm_ls *, char *);
120 ssize_t (*store)(struct gdlm_ls *, const char *, size_t);
121};
122
David Teigland869d81d2006-01-17 08:47:12 +0000123#define GDLM_ATTR(_name,_mode,_show,_store) \
124static struct gdlm_attr gdlm_attr_##_name = __ATTR(_name,_mode,_show,_store)
David Teigland29b79982006-01-16 16:52:38 +0000125
David Teigland6bd70ab2006-04-26 15:56:35 -0400126GDLM_ATTR(proto_name, 0444, proto_name_show, NULL);
127GDLM_ATTR(block, 0644, block_show, block_store);
128GDLM_ATTR(withdraw, 0644, withdraw_show, withdraw_store);
129GDLM_ATTR(id, 0444, id_show, NULL);
130GDLM_ATTR(jid, 0444, jid_show, NULL);
131GDLM_ATTR(first, 0444, first_show, NULL);
132GDLM_ATTR(first_done, 0444, first_done_show, NULL);
133GDLM_ATTR(recover, 0644, recover_show, recover_store);
134GDLM_ATTR(recover_done, 0444, recover_done_show, NULL);
135GDLM_ATTR(recover_status, 0444, recover_status_show, NULL);
David Teigland29b79982006-01-16 16:52:38 +0000136
137static struct attribute *gdlm_attrs[] = {
David Teigland869d81d2006-01-17 08:47:12 +0000138 &gdlm_attr_proto_name.attr,
David Teigland29b79982006-01-16 16:52:38 +0000139 &gdlm_attr_block.attr,
David Teigland29b79982006-01-16 16:52:38 +0000140 &gdlm_attr_withdraw.attr,
David Teigland869d81d2006-01-17 08:47:12 +0000141 &gdlm_attr_id.attr,
David Teigland29b79982006-01-16 16:52:38 +0000142 &gdlm_attr_jid.attr,
143 &gdlm_attr_first.attr,
144 &gdlm_attr_first_done.attr,
145 &gdlm_attr_recover.attr,
146 &gdlm_attr_recover_done.attr,
David Teigland6bd70ab2006-04-26 15:56:35 -0400147 &gdlm_attr_recover_status.attr,
David Teigland29b79982006-01-16 16:52:38 +0000148 NULL,
149};
150
151static ssize_t gdlm_attr_show(struct kobject *kobj, struct attribute *attr,
152 char *buf)
153{
154 struct gdlm_ls *ls = container_of(kobj, struct gdlm_ls, kobj);
155 struct gdlm_attr *a = container_of(attr, struct gdlm_attr, attr);
156 return a->show ? a->show(ls, buf) : 0;
157}
158
159static ssize_t gdlm_attr_store(struct kobject *kobj, struct attribute *attr,
160 const char *buf, size_t len)
161{
162 struct gdlm_ls *ls = container_of(kobj, struct gdlm_ls, kobj);
163 struct gdlm_attr *a = container_of(attr, struct gdlm_attr, attr);
164 return a->store ? a->store(ls, buf, len) : len;
165}
166
167static struct sysfs_ops gdlm_attr_ops = {
168 .show = gdlm_attr_show,
169 .store = gdlm_attr_store,
170};
171
172static struct kobj_type gdlm_ktype = {
173 .default_attrs = gdlm_attrs,
174 .sysfs_ops = &gdlm_attr_ops,
175};
176
Greg Kroah-Hartman136a2752007-10-29 20:13:17 +0100177static struct kset *gdlm_kset;
David Teigland29b79982006-01-16 16:52:38 +0000178
David Teigland869d81d2006-01-17 08:47:12 +0000179int gdlm_kobject_setup(struct gdlm_ls *ls, struct kobject *fskobj)
David Teigland29b79982006-01-16 16:52:38 +0000180{
181 int error;
182
Greg Kroah-Hartman136a2752007-10-29 20:13:17 +0100183 ls->kobj.kset = gdlm_kset;
Greg Kroah-Hartman901195e2007-12-17 15:54:39 -0400184 error = kobject_init_and_add(&ls->kobj, &gdlm_ktype, fskobj,
185 "lock_module");
David Teigland869d81d2006-01-17 08:47:12 +0000186 if (error)
187 log_error("can't register kobj %d", error);
Greg Kroah-Hartman901195e2007-12-17 15:54:39 -0400188 kobject_uevent(&ls->kobj, KOBJ_ADD);
David Teigland29b79982006-01-16 16:52:38 +0000189
David Teigland869d81d2006-01-17 08:47:12 +0000190 return error;
David Teigland29b79982006-01-16 16:52:38 +0000191}
192
193void gdlm_kobject_release(struct gdlm_ls *ls)
194{
Greg Kroah-Hartman197b12d2007-12-20 08:13:05 -0800195 kobject_put(&ls->kobj);
David Teigland29b79982006-01-16 16:52:38 +0000196}
197
198int gdlm_sysfs_init(void)
199{
Greg Kroah-Hartman0ff21e42007-11-06 10:36:58 -0800200 gdlm_kset = kset_create_and_add("lock_dlm", NULL, kernel_kobj);
Greg Kroah-Hartman136a2752007-10-29 20:13:17 +0100201 if (!gdlm_kset) {
Harvey Harrison8e24eea2008-04-30 00:55:09 -0700202 printk(KERN_WARNING "%s: can not create kset\n", __func__);
Greg Kroah-Hartman136a2752007-10-29 20:13:17 +0100203 return -ENOMEM;
204 }
205 return 0;
David Teigland29b79982006-01-16 16:52:38 +0000206}
207
208void gdlm_sysfs_exit(void)
209{
Greg Kroah-Hartman136a2752007-10-29 20:13:17 +0100210 kset_unregister(gdlm_kset);
David Teigland29b79982006-01-16 16:52:38 +0000211}
212