Merge git://git.kernel.org/pub/scm/linux/kernel/git/steve/gfs2-3.0-nmw
[~shefty/rdma-dev.git] / fs / gfs2 / sys.c
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