xref: /openbmc/linux/fs/gfs2/sys.c (revision 9d749629)
1 /*
2  * Copyright (C) Sistina Software, Inc.  1997-2003 All rights reserved.
3  * Copyright (C) 2004-2006 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
7  * of the GNU General Public License version 2.
8  */
9 
10 #include <linux/sched.h>
11 #include <linux/spinlock.h>
12 #include <linux/completion.h>
13 #include <linux/buffer_head.h>
14 #include <linux/module.h>
15 #include <linux/kobject.h>
16 #include <asm/uaccess.h>
17 #include <linux/gfs2_ondisk.h>
18 #include <linux/genhd.h>
19 
20 #include "gfs2.h"
21 #include "incore.h"
22 #include "sys.h"
23 #include "super.h"
24 #include "glock.h"
25 #include "quota.h"
26 #include "util.h"
27 #include "glops.h"
28 #include "recovery.h"
29 
30 struct gfs2_attr {
31 	struct attribute attr;
32 	ssize_t (*show)(struct gfs2_sbd *, char *);
33 	ssize_t (*store)(struct gfs2_sbd *, const char *, size_t);
34 };
35 
36 static ssize_t gfs2_attr_show(struct kobject *kobj, struct attribute *attr,
37 			      char *buf)
38 {
39 	struct gfs2_sbd *sdp = container_of(kobj, struct gfs2_sbd, sd_kobj);
40 	struct gfs2_attr *a = container_of(attr, struct gfs2_attr, attr);
41 	return a->show ? a->show(sdp, buf) : 0;
42 }
43 
44 static ssize_t gfs2_attr_store(struct kobject *kobj, struct attribute *attr,
45 			       const char *buf, size_t len)
46 {
47 	struct gfs2_sbd *sdp = container_of(kobj, struct gfs2_sbd, sd_kobj);
48 	struct gfs2_attr *a = container_of(attr, struct gfs2_attr, attr);
49 	return a->store ? a->store(sdp, buf, len) : len;
50 }
51 
52 static const struct sysfs_ops gfs2_attr_ops = {
53 	.show  = gfs2_attr_show,
54 	.store = gfs2_attr_store,
55 };
56 
57 
58 static struct kset *gfs2_kset;
59 
60 static ssize_t id_show(struct gfs2_sbd *sdp, char *buf)
61 {
62 	return snprintf(buf, PAGE_SIZE, "%u:%u\n",
63 			MAJOR(sdp->sd_vfs->s_dev), MINOR(sdp->sd_vfs->s_dev));
64 }
65 
66 static ssize_t fsname_show(struct gfs2_sbd *sdp, char *buf)
67 {
68 	return snprintf(buf, PAGE_SIZE, "%s\n", sdp->sd_fsname);
69 }
70 
71 static int gfs2_uuid_valid(const u8 *uuid)
72 {
73 	int i;
74 
75 	for (i = 0; i < 16; i++) {
76 		if (uuid[i])
77 			return 1;
78 	}
79 	return 0;
80 }
81 
82 static ssize_t uuid_show(struct gfs2_sbd *sdp, char *buf)
83 {
84 	struct super_block *s = sdp->sd_vfs;
85 	const u8 *uuid = s->s_uuid;
86 	buf[0] = '\0';
87 	if (!gfs2_uuid_valid(uuid))
88 		return 0;
89 	return snprintf(buf, PAGE_SIZE, "%pUB\n", uuid);
90 }
91 
92 static ssize_t freeze_show(struct gfs2_sbd *sdp, char *buf)
93 {
94 	struct super_block *sb = sdp->sd_vfs;
95 	int frozen = (sb->s_writers.frozen == SB_UNFROZEN) ? 0 : 1;
96 
97 	return snprintf(buf, PAGE_SIZE, "%u\n", frozen);
98 }
99 
100 static ssize_t freeze_store(struct gfs2_sbd *sdp, const char *buf, size_t len)
101 {
102 	int error;
103 	int n = simple_strtol(buf, NULL, 0);
104 
105 	if (!capable(CAP_SYS_ADMIN))
106 		return -EACCES;
107 
108 	switch (n) {
109 	case 0:
110 		error = thaw_super(sdp->sd_vfs);
111 		break;
112 	case 1:
113 		error = freeze_super(sdp->sd_vfs);
114 		break;
115 	default:
116 		return -EINVAL;
117 	}
118 
119 	if (error) {
120 		fs_warn(sdp, "freeze %d error %d", n, error);
121 		return error;
122 	}
123 
124 	return len;
125 }
126 
127 static ssize_t withdraw_show(struct gfs2_sbd *sdp, char *buf)
128 {
129 	unsigned int b = test_bit(SDF_SHUTDOWN, &sdp->sd_flags);
130 	return snprintf(buf, PAGE_SIZE, "%u\n", b);
131 }
132 
133 static ssize_t withdraw_store(struct gfs2_sbd *sdp, const char *buf, size_t len)
134 {
135 	if (!capable(CAP_SYS_ADMIN))
136 		return -EACCES;
137 
138 	if (simple_strtol(buf, NULL, 0) != 1)
139 		return -EINVAL;
140 
141 	gfs2_lm_withdraw(sdp,
142 		"GFS2: fsid=%s: withdrawing from cluster at user's request\n",
143 		sdp->sd_fsname);
144 	return len;
145 }
146 
147 static ssize_t statfs_sync_store(struct gfs2_sbd *sdp, const char *buf,
148 				 size_t len)
149 {
150 	if (!capable(CAP_SYS_ADMIN))
151 		return -EACCES;
152 
153 	if (simple_strtol(buf, NULL, 0) != 1)
154 		return -EINVAL;
155 
156 	gfs2_statfs_sync(sdp->sd_vfs, 0);
157 	return len;
158 }
159 
160 static ssize_t quota_sync_store(struct gfs2_sbd *sdp, const char *buf,
161 				size_t len)
162 {
163 	if (!capable(CAP_SYS_ADMIN))
164 		return -EACCES;
165 
166 	if (simple_strtol(buf, NULL, 0) != 1)
167 		return -EINVAL;
168 
169 	gfs2_quota_sync(sdp->sd_vfs, 0);
170 	return len;
171 }
172 
173 static ssize_t quota_refresh_user_store(struct gfs2_sbd *sdp, const char *buf,
174 					size_t len)
175 {
176 	int error;
177 	u32 id;
178 
179 	if (!capable(CAP_SYS_ADMIN))
180 		return -EACCES;
181 
182 	id = simple_strtoul(buf, NULL, 0);
183 
184 	error = gfs2_quota_refresh(sdp, 1, id);
185 	return error ? error : len;
186 }
187 
188 static ssize_t quota_refresh_group_store(struct gfs2_sbd *sdp, const char *buf,
189 					 size_t len)
190 {
191 	int error;
192 	u32 id;
193 
194 	if (!capable(CAP_SYS_ADMIN))
195 		return -EACCES;
196 
197 	id = simple_strtoul(buf, NULL, 0);
198 
199 	error = gfs2_quota_refresh(sdp, 0, id);
200 	return error ? error : len;
201 }
202 
203 static ssize_t demote_rq_store(struct gfs2_sbd *sdp, const char *buf, size_t len)
204 {
205 	struct gfs2_glock *gl;
206 	const struct gfs2_glock_operations *glops;
207 	unsigned int glmode;
208 	unsigned int gltype;
209 	unsigned long long glnum;
210 	char mode[16];
211 	int rv;
212 
213 	if (!capable(CAP_SYS_ADMIN))
214 		return -EACCES;
215 
216 	rv = sscanf(buf, "%u:%llu %15s", &gltype, &glnum,
217 		    mode);
218 	if (rv != 3)
219 		return -EINVAL;
220 
221 	if (strcmp(mode, "EX") == 0)
222 		glmode = LM_ST_UNLOCKED;
223 	else if ((strcmp(mode, "CW") == 0) || (strcmp(mode, "DF") == 0))
224 		glmode = LM_ST_DEFERRED;
225 	else if ((strcmp(mode, "PR") == 0) || (strcmp(mode, "SH") == 0))
226 		glmode = LM_ST_SHARED;
227 	else
228 		return -EINVAL;
229 
230 	if (gltype > LM_TYPE_JOURNAL)
231 		return -EINVAL;
232 	if (gltype == LM_TYPE_NONDISK && glnum == GFS2_TRANS_LOCK)
233 		glops = &gfs2_trans_glops;
234 	else
235 		glops = gfs2_glops_list[gltype];
236 	if (glops == NULL)
237 		return -EINVAL;
238 	if (!test_and_set_bit(SDF_DEMOTE, &sdp->sd_flags))
239 		fs_info(sdp, "demote interface used\n");
240 	rv = gfs2_glock_get(sdp, glnum, glops, 0, &gl);
241 	if (rv)
242 		return rv;
243 	gfs2_glock_cb(gl, glmode);
244 	gfs2_glock_put(gl);
245 	return len;
246 }
247 
248 
249 #define GFS2_ATTR(name, mode, show, store) \
250 static struct gfs2_attr gfs2_attr_##name = __ATTR(name, mode, show, store)
251 
252 GFS2_ATTR(id,                  0444, id_show,       NULL);
253 GFS2_ATTR(fsname,              0444, fsname_show,   NULL);
254 GFS2_ATTR(uuid,                0444, uuid_show,     NULL);
255 GFS2_ATTR(freeze,              0644, freeze_show,   freeze_store);
256 GFS2_ATTR(withdraw,            0644, withdraw_show, withdraw_store);
257 GFS2_ATTR(statfs_sync,         0200, NULL,          statfs_sync_store);
258 GFS2_ATTR(quota_sync,          0200, NULL,          quota_sync_store);
259 GFS2_ATTR(quota_refresh_user,  0200, NULL,          quota_refresh_user_store);
260 GFS2_ATTR(quota_refresh_group, 0200, NULL,          quota_refresh_group_store);
261 GFS2_ATTR(demote_rq,           0200, NULL,	    demote_rq_store);
262 
263 static struct attribute *gfs2_attrs[] = {
264 	&gfs2_attr_id.attr,
265 	&gfs2_attr_fsname.attr,
266 	&gfs2_attr_uuid.attr,
267 	&gfs2_attr_freeze.attr,
268 	&gfs2_attr_withdraw.attr,
269 	&gfs2_attr_statfs_sync.attr,
270 	&gfs2_attr_quota_sync.attr,
271 	&gfs2_attr_quota_refresh_user.attr,
272 	&gfs2_attr_quota_refresh_group.attr,
273 	&gfs2_attr_demote_rq.attr,
274 	NULL,
275 };
276 
277 static void gfs2_sbd_release(struct kobject *kobj)
278 {
279 	struct gfs2_sbd *sdp = container_of(kobj, struct gfs2_sbd, sd_kobj);
280 
281 	kfree(sdp);
282 }
283 
284 static struct kobj_type gfs2_ktype = {
285 	.release = gfs2_sbd_release,
286 	.default_attrs = gfs2_attrs,
287 	.sysfs_ops     = &gfs2_attr_ops,
288 };
289 
290 
291 /*
292  * lock_module. Originally from lock_dlm
293  */
294 
295 static ssize_t proto_name_show(struct gfs2_sbd *sdp, char *buf)
296 {
297 	const struct lm_lockops *ops = sdp->sd_lockstruct.ls_ops;
298 	return sprintf(buf, "%s\n", ops->lm_proto_name);
299 }
300 
301 static ssize_t block_show(struct gfs2_sbd *sdp, char *buf)
302 {
303 	struct lm_lockstruct *ls = &sdp->sd_lockstruct;
304 	ssize_t ret;
305 	int val = 0;
306 
307 	if (test_bit(DFL_BLOCK_LOCKS, &ls->ls_recover_flags))
308 		val = 1;
309 	ret = sprintf(buf, "%d\n", val);
310 	return ret;
311 }
312 
313 static ssize_t block_store(struct gfs2_sbd *sdp, const char *buf, size_t len)
314 {
315 	struct lm_lockstruct *ls = &sdp->sd_lockstruct;
316 	ssize_t ret = len;
317 	int val;
318 
319 	val = simple_strtol(buf, NULL, 0);
320 
321 	if (val == 1)
322 		set_bit(DFL_BLOCK_LOCKS, &ls->ls_recover_flags);
323 	else if (val == 0) {
324 		clear_bit(DFL_BLOCK_LOCKS, &ls->ls_recover_flags);
325 		smp_mb__after_clear_bit();
326 		gfs2_glock_thaw(sdp);
327 	} else {
328 		ret = -EINVAL;
329 	}
330 	return ret;
331 }
332 
333 static ssize_t wdack_show(struct gfs2_sbd *sdp, char *buf)
334 {
335 	int val = completion_done(&sdp->sd_wdack) ? 1 : 0;
336 
337 	return sprintf(buf, "%d\n", val);
338 }
339 
340 static ssize_t wdack_store(struct gfs2_sbd *sdp, const char *buf, size_t len)
341 {
342 	ssize_t ret = len;
343 	int val;
344 
345 	val = simple_strtol(buf, NULL, 0);
346 
347 	if ((val == 1) &&
348 	    !strcmp(sdp->sd_lockstruct.ls_ops->lm_proto_name, "lock_dlm"))
349 		complete(&sdp->sd_wdack);
350 	else
351 		ret = -EINVAL;
352 	return ret;
353 }
354 
355 static ssize_t lkfirst_show(struct gfs2_sbd *sdp, char *buf)
356 {
357 	struct lm_lockstruct *ls = &sdp->sd_lockstruct;
358 	return sprintf(buf, "%d\n", ls->ls_first);
359 }
360 
361 static ssize_t lkfirst_store(struct gfs2_sbd *sdp, const char *buf, size_t len)
362 {
363 	unsigned first;
364 	int rv;
365 
366 	rv = sscanf(buf, "%u", &first);
367 	if (rv != 1 || first > 1)
368 		return -EINVAL;
369 	rv = wait_for_completion_killable(&sdp->sd_locking_init);
370 	if (rv)
371 		return rv;
372 	spin_lock(&sdp->sd_jindex_spin);
373 	rv = -EBUSY;
374 	if (test_bit(SDF_NOJOURNALID, &sdp->sd_flags) == 0)
375 		goto out;
376 	rv = -EINVAL;
377 	if (sdp->sd_args.ar_spectator)
378 		goto out;
379 	if (sdp->sd_lockstruct.ls_ops->lm_mount == NULL)
380 		goto out;
381 	sdp->sd_lockstruct.ls_first = first;
382 	rv = 0;
383 out:
384         spin_unlock(&sdp->sd_jindex_spin);
385         return rv ? rv : len;
386 }
387 
388 static ssize_t first_done_show(struct gfs2_sbd *sdp, char *buf)
389 {
390 	struct lm_lockstruct *ls = &sdp->sd_lockstruct;
391 	return sprintf(buf, "%d\n", !!test_bit(DFL_FIRST_MOUNT_DONE, &ls->ls_recover_flags));
392 }
393 
394 int gfs2_recover_set(struct gfs2_sbd *sdp, unsigned jid)
395 {
396 	struct gfs2_jdesc *jd;
397 	int rv;
398 
399 	spin_lock(&sdp->sd_jindex_spin);
400 	rv = -EBUSY;
401 	if (sdp->sd_jdesc->jd_jid == jid)
402 		goto out;
403 	rv = -ENOENT;
404 	list_for_each_entry(jd, &sdp->sd_jindex_list, jd_list) {
405 		if (jd->jd_jid != jid)
406 			continue;
407 		rv = gfs2_recover_journal(jd, false);
408 		break;
409 	}
410 out:
411 	spin_unlock(&sdp->sd_jindex_spin);
412 	return rv;
413 }
414 
415 static ssize_t recover_store(struct gfs2_sbd *sdp, const char *buf, size_t len)
416 {
417 	unsigned jid;
418 	int rv;
419 
420 	rv = sscanf(buf, "%u", &jid);
421 	if (rv != 1)
422 		return -EINVAL;
423 
424 	if (test_bit(SDF_NORECOVERY, &sdp->sd_flags)) {
425 		rv = -ESHUTDOWN;
426 		goto out;
427 	}
428 
429 	rv = gfs2_recover_set(sdp, jid);
430 out:
431 	return rv ? rv : len;
432 }
433 
434 static ssize_t recover_done_show(struct gfs2_sbd *sdp, char *buf)
435 {
436 	struct lm_lockstruct *ls = &sdp->sd_lockstruct;
437 	return sprintf(buf, "%d\n", ls->ls_recover_jid_done);
438 }
439 
440 static ssize_t recover_status_show(struct gfs2_sbd *sdp, char *buf)
441 {
442 	struct lm_lockstruct *ls = &sdp->sd_lockstruct;
443 	return sprintf(buf, "%d\n", ls->ls_recover_jid_status);
444 }
445 
446 static ssize_t jid_show(struct gfs2_sbd *sdp, char *buf)
447 {
448 	return sprintf(buf, "%d\n", sdp->sd_lockstruct.ls_jid);
449 }
450 
451 static ssize_t jid_store(struct gfs2_sbd *sdp, const char *buf, size_t len)
452 {
453         int jid;
454 	int rv;
455 
456 	rv = sscanf(buf, "%d", &jid);
457 	if (rv != 1)
458 		return -EINVAL;
459 	rv = wait_for_completion_killable(&sdp->sd_locking_init);
460 	if (rv)
461 		return rv;
462 	spin_lock(&sdp->sd_jindex_spin);
463 	rv = -EINVAL;
464 	if (sdp->sd_lockstruct.ls_ops->lm_mount == NULL)
465 		goto out;
466 	rv = -EBUSY;
467 	if (test_bit(SDF_NOJOURNALID, &sdp->sd_flags) == 0)
468 		goto out;
469 	rv = 0;
470 	if (sdp->sd_args.ar_spectator && jid > 0)
471 		rv = jid = -EINVAL;
472 	sdp->sd_lockstruct.ls_jid = jid;
473 	clear_bit(SDF_NOJOURNALID, &sdp->sd_flags);
474 	smp_mb__after_clear_bit();
475 	wake_up_bit(&sdp->sd_flags, SDF_NOJOURNALID);
476 out:
477 	spin_unlock(&sdp->sd_jindex_spin);
478 	return rv ? rv : len;
479 }
480 
481 #define GDLM_ATTR(_name,_mode,_show,_store) \
482 static struct gfs2_attr gdlm_attr_##_name = __ATTR(_name,_mode,_show,_store)
483 
484 GDLM_ATTR(proto_name,		0444, proto_name_show,		NULL);
485 GDLM_ATTR(block,		0644, block_show,		block_store);
486 GDLM_ATTR(withdraw,		0644, wdack_show,		wdack_store);
487 GDLM_ATTR(jid,			0644, jid_show,			jid_store);
488 GDLM_ATTR(first,		0644, lkfirst_show,		lkfirst_store);
489 GDLM_ATTR(first_done,		0444, first_done_show,		NULL);
490 GDLM_ATTR(recover,		0600, NULL,			recover_store);
491 GDLM_ATTR(recover_done,		0444, recover_done_show,	NULL);
492 GDLM_ATTR(recover_status,	0444, recover_status_show,	NULL);
493 
494 static struct attribute *lock_module_attrs[] = {
495 	&gdlm_attr_proto_name.attr,
496 	&gdlm_attr_block.attr,
497 	&gdlm_attr_withdraw.attr,
498 	&gdlm_attr_jid.attr,
499 	&gdlm_attr_first.attr,
500 	&gdlm_attr_first_done.attr,
501 	&gdlm_attr_recover.attr,
502 	&gdlm_attr_recover_done.attr,
503 	&gdlm_attr_recover_status.attr,
504 	NULL,
505 };
506 
507 /*
508  * get and set struct gfs2_tune fields
509  */
510 
511 static ssize_t quota_scale_show(struct gfs2_sbd *sdp, char *buf)
512 {
513 	return snprintf(buf, PAGE_SIZE, "%u %u\n",
514 			sdp->sd_tune.gt_quota_scale_num,
515 			sdp->sd_tune.gt_quota_scale_den);
516 }
517 
518 static ssize_t quota_scale_store(struct gfs2_sbd *sdp, const char *buf,
519 				 size_t len)
520 {
521 	struct gfs2_tune *gt = &sdp->sd_tune;
522 	unsigned int x, y;
523 
524 	if (!capable(CAP_SYS_ADMIN))
525 		return -EACCES;
526 
527 	if (sscanf(buf, "%u %u", &x, &y) != 2 || !y)
528 		return -EINVAL;
529 
530 	spin_lock(&gt->gt_spin);
531 	gt->gt_quota_scale_num = x;
532 	gt->gt_quota_scale_den = y;
533 	spin_unlock(&gt->gt_spin);
534 	return len;
535 }
536 
537 static ssize_t tune_set(struct gfs2_sbd *sdp, unsigned int *field,
538 			int check_zero, const char *buf, size_t len)
539 {
540 	struct gfs2_tune *gt = &sdp->sd_tune;
541 	unsigned int x;
542 
543 	if (!capable(CAP_SYS_ADMIN))
544 		return -EACCES;
545 
546 	x = simple_strtoul(buf, NULL, 0);
547 
548 	if (check_zero && !x)
549 		return -EINVAL;
550 
551 	spin_lock(&gt->gt_spin);
552 	*field = x;
553 	spin_unlock(&gt->gt_spin);
554 	return len;
555 }
556 
557 #define TUNE_ATTR_3(name, show, store)                                        \
558 static struct gfs2_attr tune_attr_##name = __ATTR(name, 0644, show, store)
559 
560 #define TUNE_ATTR_2(name, store)                                              \
561 static ssize_t name##_show(struct gfs2_sbd *sdp, char *buf)                   \
562 {                                                                             \
563 	return snprintf(buf, PAGE_SIZE, "%u\n", sdp->sd_tune.gt_##name);      \
564 }                                                                             \
565 TUNE_ATTR_3(name, name##_show, store)
566 
567 #define TUNE_ATTR(name, check_zero)                                           \
568 static ssize_t name##_store(struct gfs2_sbd *sdp, const char *buf, size_t len)\
569 {                                                                             \
570 	return tune_set(sdp, &sdp->sd_tune.gt_##name, check_zero, buf, len);  \
571 }                                                                             \
572 TUNE_ATTR_2(name, name##_store)
573 
574 TUNE_ATTR(quota_warn_period, 0);
575 TUNE_ATTR(quota_quantum, 0);
576 TUNE_ATTR(max_readahead, 0);
577 TUNE_ATTR(complain_secs, 0);
578 TUNE_ATTR(statfs_slow, 0);
579 TUNE_ATTR(new_files_jdata, 0);
580 TUNE_ATTR(quota_simul_sync, 1);
581 TUNE_ATTR(statfs_quantum, 1);
582 TUNE_ATTR_3(quota_scale, quota_scale_show, quota_scale_store);
583 
584 static struct attribute *tune_attrs[] = {
585 	&tune_attr_quota_warn_period.attr,
586 	&tune_attr_quota_quantum.attr,
587 	&tune_attr_max_readahead.attr,
588 	&tune_attr_complain_secs.attr,
589 	&tune_attr_statfs_slow.attr,
590 	&tune_attr_quota_simul_sync.attr,
591 	&tune_attr_statfs_quantum.attr,
592 	&tune_attr_quota_scale.attr,
593 	&tune_attr_new_files_jdata.attr,
594 	NULL,
595 };
596 
597 static struct attribute_group tune_group = {
598 	.name = "tune",
599 	.attrs = tune_attrs,
600 };
601 
602 static struct attribute_group lock_module_group = {
603 	.name = "lock_module",
604 	.attrs = lock_module_attrs,
605 };
606 
607 int gfs2_sys_fs_add(struct gfs2_sbd *sdp)
608 {
609 	struct super_block *sb = sdp->sd_vfs;
610 	int error;
611 	char ro[20];
612 	char spectator[20];
613 	char *envp[] = { ro, spectator, NULL };
614 	int sysfs_frees_sdp = 0;
615 
616 	sprintf(ro, "RDONLY=%d", (sb->s_flags & MS_RDONLY) ? 1 : 0);
617 	sprintf(spectator, "SPECTATOR=%d", sdp->sd_args.ar_spectator ? 1 : 0);
618 
619 	sdp->sd_kobj.kset = gfs2_kset;
620 	error = kobject_init_and_add(&sdp->sd_kobj, &gfs2_ktype, NULL,
621 				     "%s", sdp->sd_table_name);
622 	if (error)
623 		goto fail_reg;
624 
625 	sysfs_frees_sdp = 1; /* Freeing sdp is now done by sysfs calling
626 				function gfs2_sbd_release. */
627 	error = sysfs_create_group(&sdp->sd_kobj, &tune_group);
628 	if (error)
629 		goto fail_reg;
630 
631 	error = sysfs_create_group(&sdp->sd_kobj, &lock_module_group);
632 	if (error)
633 		goto fail_tune;
634 
635 	error = sysfs_create_link(&sdp->sd_kobj,
636 				  &disk_to_dev(sb->s_bdev->bd_disk)->kobj,
637 				  "device");
638 	if (error)
639 		goto fail_lock_module;
640 
641 	kobject_uevent_env(&sdp->sd_kobj, KOBJ_ADD, envp);
642 	return 0;
643 
644 fail_lock_module:
645 	sysfs_remove_group(&sdp->sd_kobj, &lock_module_group);
646 fail_tune:
647 	sysfs_remove_group(&sdp->sd_kobj, &tune_group);
648 fail_reg:
649 	free_percpu(sdp->sd_lkstats);
650 	fs_err(sdp, "error %d adding sysfs files", error);
651 	if (sysfs_frees_sdp)
652 		kobject_put(&sdp->sd_kobj);
653 	else
654 		kfree(sdp);
655 	sb->s_fs_info = NULL;
656 	return error;
657 }
658 
659 void gfs2_sys_fs_del(struct gfs2_sbd *sdp)
660 {
661 	sysfs_remove_link(&sdp->sd_kobj, "device");
662 	sysfs_remove_group(&sdp->sd_kobj, &tune_group);
663 	sysfs_remove_group(&sdp->sd_kobj, &lock_module_group);
664 	kobject_put(&sdp->sd_kobj);
665 }
666 
667 static int gfs2_uevent(struct kset *kset, struct kobject *kobj,
668 		       struct kobj_uevent_env *env)
669 {
670 	struct gfs2_sbd *sdp = container_of(kobj, struct gfs2_sbd, sd_kobj);
671 	struct super_block *s = sdp->sd_vfs;
672 	const u8 *uuid = s->s_uuid;
673 
674 	add_uevent_var(env, "LOCKTABLE=%s", sdp->sd_table_name);
675 	add_uevent_var(env, "LOCKPROTO=%s", sdp->sd_proto_name);
676 	if (!test_bit(SDF_NOJOURNALID, &sdp->sd_flags))
677 		add_uevent_var(env, "JOURNALID=%d", sdp->sd_lockstruct.ls_jid);
678 	if (gfs2_uuid_valid(uuid))
679 		add_uevent_var(env, "UUID=%pUB", uuid);
680 	return 0;
681 }
682 
683 static const struct kset_uevent_ops gfs2_uevent_ops = {
684 	.uevent = gfs2_uevent,
685 };
686 
687 int gfs2_sys_init(void)
688 {
689 	gfs2_kset = kset_create_and_add("gfs2", &gfs2_uevent_ops, fs_kobj);
690 	if (!gfs2_kset)
691 		return -ENOMEM;
692 	return 0;
693 }
694 
695 void gfs2_sys_uninit(void)
696 {
697 	kset_unregister(gfs2_kset);
698 }
699 
700