Commit | Line | Data |
---|---|---|
869d81df DT |
1 | /* |
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 | |
e9fc2aa0 | 7 | * of the GNU General Public License version 2. |
869d81df | 8 | */ |
29b7998d DT |
9 | |
10 | #include <linux/ctype.h> | |
11 | #include <linux/stat.h> | |
12 | ||
13 | #include "lock_dlm.h" | |
14 | ||
869d81df DT |
15 | extern struct lm_lockops gdlm_ops; |
16 | ||
17 | static ssize_t proto_name_show(struct gdlm_ls *ls, char *buf) | |
18 | { | |
19 | return sprintf(buf, "%s\n", gdlm_ops.lm_proto_name); | |
20 | } | |
21 | ||
22 | static ssize_t block_show(struct gdlm_ls *ls, char *buf) | |
29b7998d DT |
23 | { |
24 | ssize_t ret; | |
25 | int val = 0; | |
26 | ||
27 | if (test_bit(DFL_BLOCK_LOCKS, &ls->flags)) | |
28 | val = 1; | |
29 | ret = sprintf(buf, "%d\n", val); | |
30 | return ret; | |
31 | } | |
32 | ||
869d81df | 33 | static ssize_t block_store(struct gdlm_ls *ls, const char *buf, size_t len) |
29b7998d DT |
34 | { |
35 | ssize_t ret = len; | |
36 | int val; | |
37 | ||
38 | val = simple_strtol(buf, NULL, 0); | |
39 | ||
40 | if (val == 1) | |
41 | set_bit(DFL_BLOCK_LOCKS, &ls->flags); | |
42 | else if (val == 0) { | |
43 | clear_bit(DFL_BLOCK_LOCKS, &ls->flags); | |
44 | gdlm_submit_delayed(ls); | |
62f140c1 | 45 | } else { |
29b7998d | 46 | ret = -EINVAL; |
62f140c1 | 47 | } |
29b7998d DT |
48 | return ret; |
49 | } | |
50 | ||
869d81df | 51 | static ssize_t withdraw_show(struct gdlm_ls *ls, char *buf) |
29b7998d DT |
52 | { |
53 | ssize_t ret; | |
54 | int val = 0; | |
55 | ||
56 | if (test_bit(DFL_WITHDRAW, &ls->flags)) | |
57 | val = 1; | |
58 | ret = sprintf(buf, "%d\n", val); | |
59 | return ret; | |
60 | } | |
61 | ||
869d81df | 62 | static ssize_t withdraw_store(struct gdlm_ls *ls, const char *buf, size_t len) |
29b7998d DT |
63 | { |
64 | ssize_t ret = len; | |
65 | int val; | |
66 | ||
67 | val = simple_strtol(buf, NULL, 0); | |
68 | ||
69 | if (val == 1) | |
70 | set_bit(DFL_WITHDRAW, &ls->flags); | |
71 | else | |
72 | ret = -EINVAL; | |
73 | wake_up(&ls->wait_control); | |
74 | return ret; | |
75 | } | |
76 | ||
869d81df | 77 | static ssize_t id_show(struct gdlm_ls *ls, char *buf) |
29b7998d | 78 | { |
869d81df | 79 | return sprintf(buf, "%u\n", ls->id); |
29b7998d DT |
80 | } |
81 | ||
869d81df | 82 | static ssize_t jid_show(struct gdlm_ls *ls, char *buf) |
29b7998d | 83 | { |
869d81df | 84 | return sprintf(buf, "%d\n", ls->jid); |
29b7998d DT |
85 | } |
86 | ||
869d81df | 87 | static ssize_t first_show(struct gdlm_ls *ls, char *buf) |
29b7998d | 88 | { |
869d81df | 89 | return sprintf(buf, "%d\n", ls->first); |
29b7998d DT |
90 | } |
91 | ||
869d81df | 92 | static ssize_t first_done_show(struct gdlm_ls *ls, char *buf) |
29b7998d DT |
93 | { |
94 | return sprintf(buf, "%d\n", ls->first_done); | |
95 | } | |
96 | ||
869d81df | 97 | static ssize_t recover_show(struct gdlm_ls *ls, char *buf) |
29b7998d | 98 | { |
869d81df | 99 | return sprintf(buf, "%d\n", ls->recover_jid); |
29b7998d DT |
100 | } |
101 | ||
869d81df | 102 | static ssize_t recover_store(struct gdlm_ls *ls, const char *buf, size_t len) |
29b7998d DT |
103 | { |
104 | ls->recover_jid = simple_strtol(buf, NULL, 0); | |
1c089c32 | 105 | ls->fscb(ls->sdp, LM_CB_NEED_RECOVERY, &ls->recover_jid); |
29b7998d DT |
106 | return len; |
107 | } | |
108 | ||
869d81df | 109 | static ssize_t recover_done_show(struct gdlm_ls *ls, char *buf) |
29b7998d | 110 | { |
869d81df | 111 | return sprintf(buf, "%d\n", ls->recover_jid_done); |
29b7998d DT |
112 | } |
113 | ||
6bd70aba DT |
114 | static ssize_t recover_status_show(struct gdlm_ls *ls, char *buf) |
115 | { | |
116 | return sprintf(buf, "%d\n", ls->recover_jid_status); | |
117 | } | |
118 | ||
ee32e4f3 DT |
119 | static ssize_t drop_count_show(struct gdlm_ls *ls, char *buf) |
120 | { | |
121 | return sprintf(buf, "%d\n", ls->drop_locks_count); | |
122 | } | |
123 | ||
124 | static ssize_t drop_count_store(struct gdlm_ls *ls, const char *buf, size_t len) | |
125 | { | |
126 | ls->drop_locks_count = simple_strtol(buf, NULL, 0); | |
127 | return len; | |
128 | } | |
129 | ||
29b7998d DT |
130 | struct gdlm_attr { |
131 | struct attribute attr; | |
132 | ssize_t (*show)(struct gdlm_ls *, char *); | |
133 | ssize_t (*store)(struct gdlm_ls *, const char *, size_t); | |
134 | }; | |
135 | ||
869d81df DT |
136 | #define GDLM_ATTR(_name,_mode,_show,_store) \ |
137 | static struct gdlm_attr gdlm_attr_##_name = __ATTR(_name,_mode,_show,_store) | |
29b7998d | 138 | |
6bd70aba DT |
139 | GDLM_ATTR(proto_name, 0444, proto_name_show, NULL); |
140 | GDLM_ATTR(block, 0644, block_show, block_store); | |
141 | GDLM_ATTR(withdraw, 0644, withdraw_show, withdraw_store); | |
142 | GDLM_ATTR(id, 0444, id_show, NULL); | |
143 | GDLM_ATTR(jid, 0444, jid_show, NULL); | |
144 | GDLM_ATTR(first, 0444, first_show, NULL); | |
145 | GDLM_ATTR(first_done, 0444, first_done_show, NULL); | |
146 | GDLM_ATTR(recover, 0644, recover_show, recover_store); | |
147 | GDLM_ATTR(recover_done, 0444, recover_done_show, NULL); | |
148 | GDLM_ATTR(recover_status, 0444, recover_status_show, NULL); | |
ee32e4f3 | 149 | GDLM_ATTR(drop_count, 0644, drop_count_show, drop_count_store); |
29b7998d DT |
150 | |
151 | static struct attribute *gdlm_attrs[] = { | |
869d81df | 152 | &gdlm_attr_proto_name.attr, |
29b7998d | 153 | &gdlm_attr_block.attr, |
29b7998d | 154 | &gdlm_attr_withdraw.attr, |
869d81df | 155 | &gdlm_attr_id.attr, |
29b7998d DT |
156 | &gdlm_attr_jid.attr, |
157 | &gdlm_attr_first.attr, | |
158 | &gdlm_attr_first_done.attr, | |
159 | &gdlm_attr_recover.attr, | |
160 | &gdlm_attr_recover_done.attr, | |
6bd70aba | 161 | &gdlm_attr_recover_status.attr, |
ee32e4f3 | 162 | &gdlm_attr_drop_count.attr, |
29b7998d DT |
163 | NULL, |
164 | }; | |
165 | ||
166 | static ssize_t gdlm_attr_show(struct kobject *kobj, struct attribute *attr, | |
167 | char *buf) | |
168 | { | |
169 | struct gdlm_ls *ls = container_of(kobj, struct gdlm_ls, kobj); | |
170 | struct gdlm_attr *a = container_of(attr, struct gdlm_attr, attr); | |
171 | return a->show ? a->show(ls, buf) : 0; | |
172 | } | |
173 | ||
174 | static ssize_t gdlm_attr_store(struct kobject *kobj, struct attribute *attr, | |
175 | const char *buf, size_t len) | |
176 | { | |
177 | struct gdlm_ls *ls = container_of(kobj, struct gdlm_ls, kobj); | |
178 | struct gdlm_attr *a = container_of(attr, struct gdlm_attr, attr); | |
179 | return a->store ? a->store(ls, buf, len) : len; | |
180 | } | |
181 | ||
182 | static struct sysfs_ops gdlm_attr_ops = { | |
183 | .show = gdlm_attr_show, | |
184 | .store = gdlm_attr_store, | |
185 | }; | |
186 | ||
187 | static struct kobj_type gdlm_ktype = { | |
188 | .default_attrs = gdlm_attrs, | |
189 | .sysfs_ops = &gdlm_attr_ops, | |
190 | }; | |
191 | ||
136a2750 | 192 | static struct kset *gdlm_kset; |
29b7998d | 193 | |
869d81df | 194 | int gdlm_kobject_setup(struct gdlm_ls *ls, struct kobject *fskobj) |
29b7998d DT |
195 | { |
196 | int error; | |
197 | ||
869d81df DT |
198 | error = kobject_set_name(&ls->kobj, "%s", "lock_module"); |
199 | if (error) { | |
200 | log_error("can't set kobj name %d", error); | |
29b7998d | 201 | return error; |
869d81df | 202 | } |
29b7998d | 203 | |
136a2750 | 204 | ls->kobj.kset = gdlm_kset; |
29b7998d | 205 | ls->kobj.ktype = &gdlm_ktype; |
869d81df | 206 | ls->kobj.parent = fskobj; |
29b7998d DT |
207 | |
208 | error = kobject_register(&ls->kobj); | |
869d81df DT |
209 | if (error) |
210 | log_error("can't register kobj %d", error); | |
29b7998d | 211 | |
869d81df | 212 | return error; |
29b7998d DT |
213 | } |
214 | ||
215 | void gdlm_kobject_release(struct gdlm_ls *ls) | |
216 | { | |
217 | kobject_unregister(&ls->kobj); | |
218 | } | |
219 | ||
220 | int gdlm_sysfs_init(void) | |
221 | { | |
0ff21e46 | 222 | gdlm_kset = kset_create_and_add("lock_dlm", NULL, kernel_kobj); |
136a2750 GKH |
223 | if (!gdlm_kset) { |
224 | printk(KERN_WARNING "%s: can not create kset\n", __FUNCTION__); | |
225 | return -ENOMEM; | |
226 | } | |
227 | return 0; | |
29b7998d DT |
228 | } |
229 | ||
230 | void gdlm_sysfs_exit(void) | |
231 | { | |
136a2750 | 232 | kset_unregister(gdlm_kset); |
29b7998d DT |
233 | } |
234 |