7336d0e654f7a (Thomas Gleixner 2019-05-31 01:09:56 -0700 1) // SPDX-License-Identifier: GPL-2.0-only
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 2) /*
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 3) * Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
3a8a9a1034813 (Steven Whitehouse 2006-05-18 15:09:15 -0400 4) * Copyright (C) 2004-2006 Red Hat, Inc. All rights reserved.
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 5) */
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 6)
d77d1b58aaf44 (Joe Perches 2014-03-06 12:10:45 -0800 7) #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
d77d1b58aaf44 (Joe Perches 2014-03-06 12:10:45 -0800 8)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 9) #include <linux/sched.h>
5b825c3af1d8a (Ingo Molnar 2017-02-02 17:54:15 +0100 10) #include <linux/cred.h>
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 11) #include <linux/spinlock.h>
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 12) #include <linux/completion.h>
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 13) #include <linux/buffer_head.h>
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 14) #include <linux/module.h>
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 15) #include <linux/kobject.h>
7c0f6ba682b9c (Linus Torvalds 2016-12-24 11:46:01 -0800 16) #include <linux/uaccess.h>
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 17) #include <linux/gfs2_ondisk.h>
31e54b01f3f00 (Steven Whitehouse 2009-08-13 12:18:08 +0100 18) #include <linux/genhd.h>
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 19)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 20) #include "gfs2.h"
5c676f6d359b0 (Steven Whitehouse 2006-02-27 17:23:27 -0500 21) #include "incore.h"
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 22) #include "sys.h"
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 23) #include "super.h"
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 24) #include "glock.h"
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 25) #include "quota.h"
5c676f6d359b0 (Steven Whitehouse 2006-02-27 17:23:27 -0500 26) #include "util.h"
64d576ba23bfd (Steven Whitehouse 2009-02-12 13:31:58 +0000 27) #include "glops.h"
6ecd7c2dd9f5d (Tejun Heo 2010-07-20 22:09:02 +0200 28) #include "recovery.h"
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 29)
48c2b61361623 (Steven Whitehouse 2009-05-13 14:49:48 +0100 30) struct gfs2_attr {
48c2b61361623 (Steven Whitehouse 2009-05-13 14:49:48 +0100 31) struct attribute attr;
48c2b61361623 (Steven Whitehouse 2009-05-13 14:49:48 +0100 32) ssize_t (*show)(struct gfs2_sbd *, char *);
48c2b61361623 (Steven Whitehouse 2009-05-13 14:49:48 +0100 33) ssize_t (*store)(struct gfs2_sbd *, const char *, size_t);
48c2b61361623 (Steven Whitehouse 2009-05-13 14:49:48 +0100 34) };
48c2b61361623 (Steven Whitehouse 2009-05-13 14:49:48 +0100 35)
48c2b61361623 (Steven Whitehouse 2009-05-13 14:49:48 +0100 36) static ssize_t gfs2_attr_show(struct kobject *kobj, struct attribute *attr,
48c2b61361623 (Steven Whitehouse 2009-05-13 14:49:48 +0100 37) char *buf)
48c2b61361623 (Steven Whitehouse 2009-05-13 14:49:48 +0100 38) {
48c2b61361623 (Steven Whitehouse 2009-05-13 14:49:48 +0100 39) struct gfs2_sbd *sdp = container_of(kobj, struct gfs2_sbd, sd_kobj);
48c2b61361623 (Steven Whitehouse 2009-05-13 14:49:48 +0100 40) struct gfs2_attr *a = container_of(attr, struct gfs2_attr, attr);
48c2b61361623 (Steven Whitehouse 2009-05-13 14:49:48 +0100 41) return a->show ? a->show(sdp, buf) : 0;
48c2b61361623 (Steven Whitehouse 2009-05-13 14:49:48 +0100 42) }
48c2b61361623 (Steven Whitehouse 2009-05-13 14:49:48 +0100 43)
48c2b61361623 (Steven Whitehouse 2009-05-13 14:49:48 +0100 44) static ssize_t gfs2_attr_store(struct kobject *kobj, struct attribute *attr,
48c2b61361623 (Steven Whitehouse 2009-05-13 14:49:48 +0100 45) const char *buf, size_t len)
48c2b61361623 (Steven Whitehouse 2009-05-13 14:49:48 +0100 46) {
48c2b61361623 (Steven Whitehouse 2009-05-13 14:49:48 +0100 47) struct gfs2_sbd *sdp = container_of(kobj, struct gfs2_sbd, sd_kobj);
48c2b61361623 (Steven Whitehouse 2009-05-13 14:49:48 +0100 48) struct gfs2_attr *a = container_of(attr, struct gfs2_attr, attr);
48c2b61361623 (Steven Whitehouse 2009-05-13 14:49:48 +0100 49) return a->store ? a->store(sdp, buf, len) : len;
48c2b61361623 (Steven Whitehouse 2009-05-13 14:49:48 +0100 50) }
48c2b61361623 (Steven Whitehouse 2009-05-13 14:49:48 +0100 51)
52cf25d0ab7f7 (Emese Revfy 2010-01-19 02:58:23 +0100 52) static const struct sysfs_ops gfs2_attr_ops = {
48c2b61361623 (Steven Whitehouse 2009-05-13 14:49:48 +0100 53) .show = gfs2_attr_show,
48c2b61361623 (Steven Whitehouse 2009-05-13 14:49:48 +0100 54) .store = gfs2_attr_store,
48c2b61361623 (Steven Whitehouse 2009-05-13 14:49:48 +0100 55) };
48c2b61361623 (Steven Whitehouse 2009-05-13 14:49:48 +0100 56)
48c2b61361623 (Steven Whitehouse 2009-05-13 14:49:48 +0100 57)
48c2b61361623 (Steven Whitehouse 2009-05-13 14:49:48 +0100 58) static struct kset *gfs2_kset;
48c2b61361623 (Steven Whitehouse 2009-05-13 14:49:48 +0100 59)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 60) static ssize_t id_show(struct gfs2_sbd *sdp, char *buf)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 61) {
c7227e46423a5 (Bob Peterson 2007-11-02 09:37:15 -0500 62) return snprintf(buf, PAGE_SIZE, "%u:%u\n",
c7227e46423a5 (Bob Peterson 2007-11-02 09:37:15 -0500 63) MAJOR(sdp->sd_vfs->s_dev), MINOR(sdp->sd_vfs->s_dev));
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 64) }
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 65)
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 66) static ssize_t status_show(struct gfs2_sbd *sdp, char *buf)
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 67) {
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 68) unsigned long f = sdp->sd_flags;
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 69) ssize_t s;
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 70)
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 71) s = snprintf(buf, PAGE_SIZE,
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 72) "Journal Checked: %d\n"
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 73) "Journal Live: %d\n"
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 74) "Journal ID: %d\n"
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 75) "Spectator: %d\n"
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 76) "Withdrawn: %d\n"
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 77) "No barriers: %d\n"
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 78) "No recovery: %d\n"
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 79) "Demote: %d\n"
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 80) "No Journal ID: %d\n"
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 81) "Mounted RO: %d\n"
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 82) "RO Recovery: %d\n"
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 83) "Skip DLM Unlock: %d\n"
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 84) "Force AIL Flush: %d\n"
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 85) "FS Frozen: %d\n"
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 86) "Withdrawing: %d\n"
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 87) "Withdraw In Prog: %d\n"
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 88) "Remote Withdraw: %d\n"
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 89) "Withdraw Recovery: %d\n"
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 90) "sd_log_error: %d\n"
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 91) "sd_log_flush_lock: %d\n"
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 92) "sd_log_num_revoke: %u\n"
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 93) "sd_log_in_flight: %d\n"
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 94) "sd_log_blks_needed: %d\n"
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 95) "sd_log_blks_free: %d\n"
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 96) "sd_log_flush_head: %d\n"
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 97) "sd_log_flush_tail: %d\n"
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 98) "sd_log_blks_reserved: %d\n"
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 99) "sd_log_revokes_available: %d\n",
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 100) test_bit(SDF_JOURNAL_CHECKED, &f),
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 101) test_bit(SDF_JOURNAL_LIVE, &f),
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 102) (sdp->sd_jdesc ? sdp->sd_jdesc->jd_jid : 0),
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 103) (sdp->sd_args.ar_spectator ? 1 : 0),
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 104) test_bit(SDF_WITHDRAWN, &f),
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 105) test_bit(SDF_NOBARRIERS, &f),
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 106) test_bit(SDF_NORECOVERY, &f),
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 107) test_bit(SDF_DEMOTE, &f),
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 108) test_bit(SDF_NOJOURNALID, &f),
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 109) (sb_rdonly(sdp->sd_vfs) ? 1 : 0),
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 110) test_bit(SDF_RORECOVERY, &f),
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 111) test_bit(SDF_SKIP_DLM_UNLOCK, &f),
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 112) test_bit(SDF_FORCE_AIL_FLUSH, &f),
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 113) test_bit(SDF_FS_FROZEN, &f),
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 114) test_bit(SDF_WITHDRAWING, &f),
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 115) test_bit(SDF_WITHDRAW_IN_PROG, &f),
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 116) test_bit(SDF_REMOTE_WITHDRAW, &f),
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 117) test_bit(SDF_WITHDRAW_RECOVERY, &f),
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 118) sdp->sd_log_error,
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 119) rwsem_is_locked(&sdp->sd_log_flush_lock),
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 120) sdp->sd_log_num_revoke,
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 121) atomic_read(&sdp->sd_log_in_flight),
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 122) atomic_read(&sdp->sd_log_blks_needed),
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 123) atomic_read(&sdp->sd_log_blks_free),
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 124) sdp->sd_log_flush_head,
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 125) sdp->sd_log_flush_tail,
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 126) sdp->sd_log_blks_reserved,
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 127) atomic_read(&sdp->sd_log_revokes_available));
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 128) return s;
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 129) }
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 130)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 131) static ssize_t fsname_show(struct gfs2_sbd *sdp, char *buf)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 132) {
3204a6c055887 (David Teigland 2006-09-06 16:57:06 -0500 133) return snprintf(buf, PAGE_SIZE, "%s\n", sdp->sd_fsname);
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 134) }
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 135)
02e3cc70ecbd4 (Steven Whitehouse 2009-02-10 13:48:30 +0000 136) static ssize_t uuid_show(struct gfs2_sbd *sdp, char *buf)
02e3cc70ecbd4 (Steven Whitehouse 2009-02-10 13:48:30 +0000 137) {
32e471ef1057e (Steven Whitehouse 2011-05-10 15:01:59 +0100 138) struct super_block *s = sdp->sd_vfs;
85787090a21eb (Christoph Hellwig 2017-05-10 15:06:33 +0200 139)
02e3cc70ecbd4 (Steven Whitehouse 2009-02-10 13:48:30 +0000 140) buf[0] = '\0';
85787090a21eb (Christoph Hellwig 2017-05-10 15:06:33 +0200 141) if (uuid_is_null(&s->s_uuid))
02e3cc70ecbd4 (Steven Whitehouse 2009-02-10 13:48:30 +0000 142) return 0;
85787090a21eb (Christoph Hellwig 2017-05-10 15:06:33 +0200 143) return snprintf(buf, PAGE_SIZE, "%pUB\n", &s->s_uuid);
02e3cc70ecbd4 (Steven Whitehouse 2009-02-10 13:48:30 +0000 144) }
02e3cc70ecbd4 (Steven Whitehouse 2009-02-10 13:48:30 +0000 145)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 146) static ssize_t freeze_show(struct gfs2_sbd *sdp, char *buf)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 147) {
d564053f07463 (Steven Whitehouse 2013-01-11 10:49:34 +0000 148) struct super_block *sb = sdp->sd_vfs;
d564053f07463 (Steven Whitehouse 2013-01-11 10:49:34 +0000 149) int frozen = (sb->s_writers.frozen == SB_UNFROZEN) ? 0 : 1;
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 150)
3566c96476781 (alex chen 2015-01-12 19:01:03 +0800 151) return snprintf(buf, PAGE_SIZE, "%d\n", frozen);
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 152) }
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 153)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 154) static ssize_t freeze_store(struct gfs2_sbd *sdp, const char *buf, size_t len)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 155) {
e50ead480fac6 (Fabian Frederick 2015-05-05 13:23:22 -0500 156) int error, n;
e50ead480fac6 (Fabian Frederick 2015-05-05 13:23:22 -0500 157)
e50ead480fac6 (Fabian Frederick 2015-05-05 13:23:22 -0500 158) error = kstrtoint(buf, 0, &n);
e50ead480fac6 (Fabian Frederick 2015-05-05 13:23:22 -0500 159) if (error)
e50ead480fac6 (Fabian Frederick 2015-05-05 13:23:22 -0500 160) return error;
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 161)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 162) if (!capable(CAP_SYS_ADMIN))
41735818766c0 (Zhao Hongjiang 2013-02-20 13:13:55 +1100 163) return -EPERM;
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 164)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 165) switch (n) {
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 166) case 0:
d564053f07463 (Steven Whitehouse 2013-01-11 10:49:34 +0000 167) error = thaw_super(sdp->sd_vfs);
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 168) break;
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 169) case 1:
d564053f07463 (Steven Whitehouse 2013-01-11 10:49:34 +0000 170) error = freeze_super(sdp->sd_vfs);
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 171) break;
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 172) default:
d564053f07463 (Steven Whitehouse 2013-01-11 10:49:34 +0000 173) return -EINVAL;
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 174) }
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 175)
d564053f07463 (Steven Whitehouse 2013-01-11 10:49:34 +0000 176) if (error) {
af38816e4801d (Andreas Gruenbacher 2018-01-30 10:32:30 -0700 177) fs_warn(sdp, "freeze %d error %d\n", n, error);
d564053f07463 (Steven Whitehouse 2013-01-11 10:49:34 +0000 178) return error;
d564053f07463 (Steven Whitehouse 2013-01-11 10:49:34 +0000 179) }
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 180)
d564053f07463 (Steven Whitehouse 2013-01-11 10:49:34 +0000 181) return len;
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 182) }
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 183)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 184) static ssize_t withdraw_show(struct gfs2_sbd *sdp, char *buf)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 185) {
eb43e660c0940 (Bob Peterson 2019-11-14 09:52:15 -0500 186) unsigned int b = gfs2_withdrawn(sdp);
3204a6c055887 (David Teigland 2006-09-06 16:57:06 -0500 187) return snprintf(buf, PAGE_SIZE, "%u\n", b);
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 188) }
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 189)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 190) static ssize_t withdraw_store(struct gfs2_sbd *sdp, const char *buf, size_t len)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 191) {
e50ead480fac6 (Fabian Frederick 2015-05-05 13:23:22 -0500 192) int error, val;
e50ead480fac6 (Fabian Frederick 2015-05-05 13:23:22 -0500 193)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 194) if (!capable(CAP_SYS_ADMIN))
41735818766c0 (Zhao Hongjiang 2013-02-20 13:13:55 +1100 195) return -EPERM;
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 196)
e50ead480fac6 (Fabian Frederick 2015-05-05 13:23:22 -0500 197) error = kstrtoint(buf, 0, &val);
e50ead480fac6 (Fabian Frederick 2015-05-05 13:23:22 -0500 198) if (error)
e50ead480fac6 (Fabian Frederick 2015-05-05 13:23:22 -0500 199) return error;
e50ead480fac6 (Fabian Frederick 2015-05-05 13:23:22 -0500 200)
e50ead480fac6 (Fabian Frederick 2015-05-05 13:23:22 -0500 201) if (val != 1)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 202) return -EINVAL;
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 203)
badb55ec208ad (Andreas Gruenbacher 2020-01-23 18:41:00 +0100 204) gfs2_lm(sdp, "withdrawing from cluster at user's request\n");
badb55ec208ad (Andreas Gruenbacher 2020-01-23 18:41:00 +0100 205) gfs2_withdraw(sdp);
cb94eb066e089 (Joe Perches 2014-03-06 12:17:21 -0800 206)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 207) return len;
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 208) }
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 209)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 210) static ssize_t statfs_sync_store(struct gfs2_sbd *sdp, const char *buf,
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 211) size_t len)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 212) {
e50ead480fac6 (Fabian Frederick 2015-05-05 13:23:22 -0500 213) int error, val;
e50ead480fac6 (Fabian Frederick 2015-05-05 13:23:22 -0500 214)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 215) if (!capable(CAP_SYS_ADMIN))
41735818766c0 (Zhao Hongjiang 2013-02-20 13:13:55 +1100 216) return -EPERM;
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 217)
e50ead480fac6 (Fabian Frederick 2015-05-05 13:23:22 -0500 218) error = kstrtoint(buf, 0, &val);
e50ead480fac6 (Fabian Frederick 2015-05-05 13:23:22 -0500 219) if (error)
e50ead480fac6 (Fabian Frederick 2015-05-05 13:23:22 -0500 220) return error;
e50ead480fac6 (Fabian Frederick 2015-05-05 13:23:22 -0500 221)
e50ead480fac6 (Fabian Frederick 2015-05-05 13:23:22 -0500 222) if (val != 1)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 223) return -EINVAL;
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 224)
8c42d637f6f28 (Steven Whitehouse 2009-09-11 14:36:44 +0100 225) gfs2_statfs_sync(sdp->sd_vfs, 0);
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 226) return len;
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 227) }
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 228)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 229) static ssize_t quota_sync_store(struct gfs2_sbd *sdp, const char *buf,
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 230) size_t len)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 231) {
e50ead480fac6 (Fabian Frederick 2015-05-05 13:23:22 -0500 232) int error, val;
e50ead480fac6 (Fabian Frederick 2015-05-05 13:23:22 -0500 233)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 234) if (!capable(CAP_SYS_ADMIN))
41735818766c0 (Zhao Hongjiang 2013-02-20 13:13:55 +1100 235) return -EPERM;
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 236)
e50ead480fac6 (Fabian Frederick 2015-05-05 13:23:22 -0500 237) error = kstrtoint(buf, 0, &val);
e50ead480fac6 (Fabian Frederick 2015-05-05 13:23:22 -0500 238) if (error)
e50ead480fac6 (Fabian Frederick 2015-05-05 13:23:22 -0500 239) return error;
e50ead480fac6 (Fabian Frederick 2015-05-05 13:23:22 -0500 240)
e50ead480fac6 (Fabian Frederick 2015-05-05 13:23:22 -0500 241) if (val != 1)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 242) return -EINVAL;
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 243)
ceed17236a749 (Jan Kara 2012-07-03 16:45:28 +0200 244) gfs2_quota_sync(sdp->sd_vfs, 0);
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 245) return len;
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 246) }
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 247)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 248) static ssize_t quota_refresh_user_store(struct gfs2_sbd *sdp, const char *buf,
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 249) size_t len)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 250) {
ed87dabcc3fc0 (Eric W. Biederman 2013-01-31 19:42:40 -0800 251) struct kqid qid;
ea7623385930c (Steven Whitehouse 2009-09-15 16:20:30 +0100 252) int error;
cd915493fce91 (Steven Whitehouse 2006-09-04 12:49:07 -0400 253) u32 id;
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 254)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 255) if (!capable(CAP_SYS_ADMIN))
41735818766c0 (Zhao Hongjiang 2013-02-20 13:13:55 +1100 256) return -EPERM;
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 257)
e50ead480fac6 (Fabian Frederick 2015-05-05 13:23:22 -0500 258) error = kstrtou32(buf, 0, &id);
e50ead480fac6 (Fabian Frederick 2015-05-05 13:23:22 -0500 259) if (error)
e50ead480fac6 (Fabian Frederick 2015-05-05 13:23:22 -0500 260) return error;
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 261)
ed87dabcc3fc0 (Eric W. Biederman 2013-01-31 19:42:40 -0800 262) qid = make_kqid(current_user_ns(), USRQUOTA, id);
ed87dabcc3fc0 (Eric W. Biederman 2013-01-31 19:42:40 -0800 263) if (!qid_valid(qid))
ed87dabcc3fc0 (Eric W. Biederman 2013-01-31 19:42:40 -0800 264) return -EINVAL;
ed87dabcc3fc0 (Eric W. Biederman 2013-01-31 19:42:40 -0800 265)
ed87dabcc3fc0 (Eric W. Biederman 2013-01-31 19:42:40 -0800 266) error = gfs2_quota_refresh(sdp, qid);
ea7623385930c (Steven Whitehouse 2009-09-15 16:20:30 +0100 267) return error ? error : len;
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 268) }
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 269)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 270) static ssize_t quota_refresh_group_store(struct gfs2_sbd *sdp, const char *buf,
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 271) size_t len)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 272) {
ed87dabcc3fc0 (Eric W. Biederman 2013-01-31 19:42:40 -0800 273) struct kqid qid;
ea7623385930c (Steven Whitehouse 2009-09-15 16:20:30 +0100 274) int error;
cd915493fce91 (Steven Whitehouse 2006-09-04 12:49:07 -0400 275) u32 id;
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 276)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 277) if (!capable(CAP_SYS_ADMIN))
41735818766c0 (Zhao Hongjiang 2013-02-20 13:13:55 +1100 278) return -EPERM;
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 279)
e50ead480fac6 (Fabian Frederick 2015-05-05 13:23:22 -0500 280) error = kstrtou32(buf, 0, &id);
e50ead480fac6 (Fabian Frederick 2015-05-05 13:23:22 -0500 281) if (error)
e50ead480fac6 (Fabian Frederick 2015-05-05 13:23:22 -0500 282) return error;
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 283)
ed87dabcc3fc0 (Eric W. Biederman 2013-01-31 19:42:40 -0800 284) qid = make_kqid(current_user_ns(), GRPQUOTA, id);
ed87dabcc3fc0 (Eric W. Biederman 2013-01-31 19:42:40 -0800 285) if (!qid_valid(qid))
ed87dabcc3fc0 (Eric W. Biederman 2013-01-31 19:42:40 -0800 286) return -EINVAL;
ed87dabcc3fc0 (Eric W. Biederman 2013-01-31 19:42:40 -0800 287)
ed87dabcc3fc0 (Eric W. Biederman 2013-01-31 19:42:40 -0800 288) error = gfs2_quota_refresh(sdp, qid);
ea7623385930c (Steven Whitehouse 2009-09-15 16:20:30 +0100 289) return error ? error : len;
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 290) }
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 291)
64d576ba23bfd (Steven Whitehouse 2009-02-12 13:31:58 +0000 292) static ssize_t demote_rq_store(struct gfs2_sbd *sdp, const char *buf, size_t len)
64d576ba23bfd (Steven Whitehouse 2009-02-12 13:31:58 +0000 293) {
64d576ba23bfd (Steven Whitehouse 2009-02-12 13:31:58 +0000 294) struct gfs2_glock *gl;
64d576ba23bfd (Steven Whitehouse 2009-02-12 13:31:58 +0000 295) const struct gfs2_glock_operations *glops;
64d576ba23bfd (Steven Whitehouse 2009-02-12 13:31:58 +0000 296) unsigned int glmode;
64d576ba23bfd (Steven Whitehouse 2009-02-12 13:31:58 +0000 297) unsigned int gltype;
64d576ba23bfd (Steven Whitehouse 2009-02-12 13:31:58 +0000 298) unsigned long long glnum;
64d576ba23bfd (Steven Whitehouse 2009-02-12 13:31:58 +0000 299) char mode[16];
64d576ba23bfd (Steven Whitehouse 2009-02-12 13:31:58 +0000 300) int rv;
64d576ba23bfd (Steven Whitehouse 2009-02-12 13:31:58 +0000 301)
64d576ba23bfd (Steven Whitehouse 2009-02-12 13:31:58 +0000 302) if (!capable(CAP_SYS_ADMIN))
41735818766c0 (Zhao Hongjiang 2013-02-20 13:13:55 +1100 303) return -EPERM;
64d576ba23bfd (Steven Whitehouse 2009-02-12 13:31:58 +0000 304)
64d576ba23bfd (Steven Whitehouse 2009-02-12 13:31:58 +0000 305) rv = sscanf(buf, "%u:%llu %15s", &gltype, &glnum,
64d576ba23bfd (Steven Whitehouse 2009-02-12 13:31:58 +0000 306) mode);
64d576ba23bfd (Steven Whitehouse 2009-02-12 13:31:58 +0000 307) if (rv != 3)
64d576ba23bfd (Steven Whitehouse 2009-02-12 13:31:58 +0000 308) return -EINVAL;
64d576ba23bfd (Steven Whitehouse 2009-02-12 13:31:58 +0000 309)
64d576ba23bfd (Steven Whitehouse 2009-02-12 13:31:58 +0000 310) if (strcmp(mode, "EX") == 0)
64d576ba23bfd (Steven Whitehouse 2009-02-12 13:31:58 +0000 311) glmode = LM_ST_UNLOCKED;
64d576ba23bfd (Steven Whitehouse 2009-02-12 13:31:58 +0000 312) else if ((strcmp(mode, "CW") == 0) || (strcmp(mode, "DF") == 0))
64d576ba23bfd (Steven Whitehouse 2009-02-12 13:31:58 +0000 313) glmode = LM_ST_DEFERRED;
64d576ba23bfd (Steven Whitehouse 2009-02-12 13:31:58 +0000 314) else if ((strcmp(mode, "PR") == 0) || (strcmp(mode, "SH") == 0))
64d576ba23bfd (Steven Whitehouse 2009-02-12 13:31:58 +0000 315) glmode = LM_ST_SHARED;
64d576ba23bfd (Steven Whitehouse 2009-02-12 13:31:58 +0000 316) else
64d576ba23bfd (Steven Whitehouse 2009-02-12 13:31:58 +0000 317) return -EINVAL;
64d576ba23bfd (Steven Whitehouse 2009-02-12 13:31:58 +0000 318)
64d576ba23bfd (Steven Whitehouse 2009-02-12 13:31:58 +0000 319) if (gltype > LM_TYPE_JOURNAL)
64d576ba23bfd (Steven Whitehouse 2009-02-12 13:31:58 +0000 320) return -EINVAL;
24972557b12ce (Benjamin Marzinski 2014-05-01 22:26:55 -0500 321) if (gltype == LM_TYPE_NONDISK && glnum == GFS2_FREEZE_LOCK)
24972557b12ce (Benjamin Marzinski 2014-05-01 22:26:55 -0500 322) glops = &gfs2_freeze_glops;
134669854e3a6 (Steven Whitehouse 2010-10-06 09:58:44 +0100 323) else
134669854e3a6 (Steven Whitehouse 2010-10-06 09:58:44 +0100 324) glops = gfs2_glops_list[gltype];
64d576ba23bfd (Steven Whitehouse 2009-02-12 13:31:58 +0000 325) if (glops == NULL)
64d576ba23bfd (Steven Whitehouse 2009-02-12 13:31:58 +0000 326) return -EINVAL;
6a99be5d7b597 (Steven Whitehouse 2010-05-14 14:05:51 +0100 327) if (!test_and_set_bit(SDF_DEMOTE, &sdp->sd_flags))
913a71d250803 (Steven Whitehouse 2010-05-06 11:03:29 +0100 328) fs_info(sdp, "demote interface used\n");
64d576ba23bfd (Steven Whitehouse 2009-02-12 13:31:58 +0000 329) rv = gfs2_glock_get(sdp, glnum, glops, 0, &gl);
64d576ba23bfd (Steven Whitehouse 2009-02-12 13:31:58 +0000 330) if (rv)
64d576ba23bfd (Steven Whitehouse 2009-02-12 13:31:58 +0000 331) return rv;
64d576ba23bfd (Steven Whitehouse 2009-02-12 13:31:58 +0000 332) gfs2_glock_cb(gl, glmode);
64d576ba23bfd (Steven Whitehouse 2009-02-12 13:31:58 +0000 333) gfs2_glock_put(gl);
64d576ba23bfd (Steven Whitehouse 2009-02-12 13:31:58 +0000 334) return len;
64d576ba23bfd (Steven Whitehouse 2009-02-12 13:31:58 +0000 335) }
64d576ba23bfd (Steven Whitehouse 2009-02-12 13:31:58 +0000 336)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 337)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 338) #define GFS2_ATTR(name, mode, show, store) \
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 339) static struct gfs2_attr gfs2_attr_##name = __ATTR(name, mode, show, store)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 340)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 341) GFS2_ATTR(id, 0444, id_show, NULL);
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 342) GFS2_ATTR(fsname, 0444, fsname_show, NULL);
02e3cc70ecbd4 (Steven Whitehouse 2009-02-10 13:48:30 +0000 343) GFS2_ATTR(uuid, 0444, uuid_show, NULL);
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 344) GFS2_ATTR(freeze, 0644, freeze_show, freeze_store);
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 345) GFS2_ATTR(withdraw, 0644, withdraw_show, withdraw_store);
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 346) GFS2_ATTR(statfs_sync, 0200, NULL, statfs_sync_store);
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 347) GFS2_ATTR(quota_sync, 0200, NULL, quota_sync_store);
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 348) GFS2_ATTR(quota_refresh_user, 0200, NULL, quota_refresh_user_store);
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 349) GFS2_ATTR(quota_refresh_group, 0200, NULL, quota_refresh_group_store);
64d576ba23bfd (Steven Whitehouse 2009-02-12 13:31:58 +0000 350) GFS2_ATTR(demote_rq, 0200, NULL, demote_rq_store);
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 351) GFS2_ATTR(status, 0400, status_show, NULL);
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 352)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 353) static struct attribute *gfs2_attrs[] = {
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 354) &gfs2_attr_id.attr,
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 355) &gfs2_attr_fsname.attr,
02e3cc70ecbd4 (Steven Whitehouse 2009-02-10 13:48:30 +0000 356) &gfs2_attr_uuid.attr,
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 357) &gfs2_attr_freeze.attr,
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 358) &gfs2_attr_withdraw.attr,
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 359) &gfs2_attr_statfs_sync.attr,
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 360) &gfs2_attr_quota_sync.attr,
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 361) &gfs2_attr_quota_refresh_user.attr,
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 362) &gfs2_attr_quota_refresh_group.attr,
64d576ba23bfd (Steven Whitehouse 2009-02-12 13:31:58 +0000 363) &gfs2_attr_demote_rq.attr,
9f9eb5a516e37 (Bob Peterson 2020-05-22 13:54:41 -0500 364) &gfs2_attr_status.attr,
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 365) NULL,
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 366) };
ef254d13f1783 (Kimberly Brown 2019-06-07 14:23:00 -0400 367) ATTRIBUTE_GROUPS(gfs2);
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 368)
0d515210b6969 (Bob Peterson 2012-06-13 10:27:41 -0400 369) static void gfs2_sbd_release(struct kobject *kobj)
0d515210b6969 (Bob Peterson 2012-06-13 10:27:41 -0400 370) {
0d515210b6969 (Bob Peterson 2012-06-13 10:27:41 -0400 371) struct gfs2_sbd *sdp = container_of(kobj, struct gfs2_sbd, sd_kobj);
0d515210b6969 (Bob Peterson 2012-06-13 10:27:41 -0400 372)
c2a04b02c060c (Jamie Iles 2020-10-12 14:13:09 +0100 373) complete(&sdp->sd_kobj_unregister);
0d515210b6969 (Bob Peterson 2012-06-13 10:27:41 -0400 374) }
0d515210b6969 (Bob Peterson 2012-06-13 10:27:41 -0400 375)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 376) static struct kobj_type gfs2_ktype = {
0d515210b6969 (Bob Peterson 2012-06-13 10:27:41 -0400 377) .release = gfs2_sbd_release,
ef254d13f1783 (Kimberly Brown 2019-06-07 14:23:00 -0400 378) .default_groups = gfs2_groups,
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 379) .sysfs_ops = &gfs2_attr_ops,
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 380) };
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 381)
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 382)
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 383) /*
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 384) * lock_module. Originally from lock_dlm
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 385) */
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 386)
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 387) static ssize_t proto_name_show(struct gfs2_sbd *sdp, char *buf)
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 388) {
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 389) const struct lm_lockops *ops = sdp->sd_lockstruct.ls_ops;
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 390) return sprintf(buf, "%s\n", ops->lm_proto_name);
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 391) }
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 392)
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 393) static ssize_t block_show(struct gfs2_sbd *sdp, char *buf)
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 394) {
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 395) struct lm_lockstruct *ls = &sdp->sd_lockstruct;
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 396) ssize_t ret;
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 397) int val = 0;
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 398)
e0c2a9aa1e684 (David Teigland 2012-01-09 17:18:05 -0500 399) if (test_bit(DFL_BLOCK_LOCKS, &ls->ls_recover_flags))
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 400) val = 1;
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 401) ret = sprintf(buf, "%d\n", val);
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 402) return ret;
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 403) }
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 404)
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 405) static ssize_t block_store(struct gfs2_sbd *sdp, const char *buf, size_t len)
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 406) {
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 407) struct lm_lockstruct *ls = &sdp->sd_lockstruct;
e50ead480fac6 (Fabian Frederick 2015-05-05 13:23:22 -0500 408) int ret, val;
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 409)
e50ead480fac6 (Fabian Frederick 2015-05-05 13:23:22 -0500 410) ret = kstrtoint(buf, 0, &val);
e50ead480fac6 (Fabian Frederick 2015-05-05 13:23:22 -0500 411) if (ret)
e50ead480fac6 (Fabian Frederick 2015-05-05 13:23:22 -0500 412) return ret;
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 413)
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 414) if (val == 1)
e0c2a9aa1e684 (David Teigland 2012-01-09 17:18:05 -0500 415) set_bit(DFL_BLOCK_LOCKS, &ls->ls_recover_flags);
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 416) else if (val == 0) {
e0c2a9aa1e684 (David Teigland 2012-01-09 17:18:05 -0500 417) clear_bit(DFL_BLOCK_LOCKS, &ls->ls_recover_flags);
4e857c58efeb9 (Peter Zijlstra 2014-03-17 18:06:10 +0100 418) smp_mb__after_atomic();
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 419) gfs2_glock_thaw(sdp);
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 420) } else {
e50ead480fac6 (Fabian Frederick 2015-05-05 13:23:22 -0500 421) return -EINVAL;
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 422) }
e50ead480fac6 (Fabian Frederick 2015-05-05 13:23:22 -0500 423) return len;
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 424) }
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 425)
fd95e81cb1c74 (Steven Whitehouse 2013-02-13 12:21:40 +0000 426) static ssize_t wdack_show(struct gfs2_sbd *sdp, char *buf)
fd95e81cb1c74 (Steven Whitehouse 2013-02-13 12:21:40 +0000 427) {
fd95e81cb1c74 (Steven Whitehouse 2013-02-13 12:21:40 +0000 428) int val = completion_done(&sdp->sd_wdack) ? 1 : 0;
fd95e81cb1c74 (Steven Whitehouse 2013-02-13 12:21:40 +0000 429)
fd95e81cb1c74 (Steven Whitehouse 2013-02-13 12:21:40 +0000 430) return sprintf(buf, "%d\n", val);
fd95e81cb1c74 (Steven Whitehouse 2013-02-13 12:21:40 +0000 431) }
fd95e81cb1c74 (Steven Whitehouse 2013-02-13 12:21:40 +0000 432)
fd95e81cb1c74 (Steven Whitehouse 2013-02-13 12:21:40 +0000 433) static ssize_t wdack_store(struct gfs2_sbd *sdp, const char *buf, size_t len)
fd95e81cb1c74 (Steven Whitehouse 2013-02-13 12:21:40 +0000 434) {
e50ead480fac6 (Fabian Frederick 2015-05-05 13:23:22 -0500 435) int ret, val;
fd95e81cb1c74 (Steven Whitehouse 2013-02-13 12:21:40 +0000 436)
e50ead480fac6 (Fabian Frederick 2015-05-05 13:23:22 -0500 437) ret = kstrtoint(buf, 0, &val);
e50ead480fac6 (Fabian Frederick 2015-05-05 13:23:22 -0500 438) if (ret)
e50ead480fac6 (Fabian Frederick 2015-05-05 13:23:22 -0500 439) return ret;
fd95e81cb1c74 (Steven Whitehouse 2013-02-13 12:21:40 +0000 440)
fd95e81cb1c74 (Steven Whitehouse 2013-02-13 12:21:40 +0000 441) if ((val == 1) &&
fd95e81cb1c74 (Steven Whitehouse 2013-02-13 12:21:40 +0000 442) !strcmp(sdp->sd_lockstruct.ls_ops->lm_proto_name, "lock_dlm"))
fd95e81cb1c74 (Steven Whitehouse 2013-02-13 12:21:40 +0000 443) complete(&sdp->sd_wdack);
fd95e81cb1c74 (Steven Whitehouse 2013-02-13 12:21:40 +0000 444) else
e50ead480fac6 (Fabian Frederick 2015-05-05 13:23:22 -0500 445) return -EINVAL;
e50ead480fac6 (Fabian Frederick 2015-05-05 13:23:22 -0500 446) return len;
fd95e81cb1c74 (Steven Whitehouse 2013-02-13 12:21:40 +0000 447) }
fd95e81cb1c74 (Steven Whitehouse 2013-02-13 12:21:40 +0000 448)
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 449) static ssize_t lkfirst_show(struct gfs2_sbd *sdp, char *buf)
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 450) {
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 451) struct lm_lockstruct *ls = &sdp->sd_lockstruct;
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 452) return sprintf(buf, "%d\n", ls->ls_first);
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 453) }
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 454)
ba6e93645f039 (Steven Whitehouse 2010-06-14 10:01:30 +0100 455) static ssize_t lkfirst_store(struct gfs2_sbd *sdp, const char *buf, size_t len)
ba6e93645f039 (Steven Whitehouse 2010-06-14 10:01:30 +0100 456) {
ba6e93645f039 (Steven Whitehouse 2010-06-14 10:01:30 +0100 457) unsigned first;
ba6e93645f039 (Steven Whitehouse 2010-06-14 10:01:30 +0100 458) int rv;
ba6e93645f039 (Steven Whitehouse 2010-06-14 10:01:30 +0100 459)
ba6e93645f039 (Steven Whitehouse 2010-06-14 10:01:30 +0100 460) rv = sscanf(buf, "%u", &first);
ba6e93645f039 (Steven Whitehouse 2010-06-14 10:01:30 +0100 461) if (rv != 1 || first > 1)
ba6e93645f039 (Steven Whitehouse 2010-06-14 10:01:30 +0100 462) return -EINVAL;
3942ae5319640 (Steven Whitehouse 2011-07-11 08:53:30 +0100 463) rv = wait_for_completion_killable(&sdp->sd_locking_init);
3942ae5319640 (Steven Whitehouse 2011-07-11 08:53:30 +0100 464) if (rv)
3942ae5319640 (Steven Whitehouse 2011-07-11 08:53:30 +0100 465) return rv;
ba6e93645f039 (Steven Whitehouse 2010-06-14 10:01:30 +0100 466) spin_lock(&sdp->sd_jindex_spin);
ba6e93645f039 (Steven Whitehouse 2010-06-14 10:01:30 +0100 467) rv = -EBUSY;
ba6e93645f039 (Steven Whitehouse 2010-06-14 10:01:30 +0100 468) if (test_bit(SDF_NOJOURNALID, &sdp->sd_flags) == 0)
ba6e93645f039 (Steven Whitehouse 2010-06-14 10:01:30 +0100 469) goto out;
ba6e93645f039 (Steven Whitehouse 2010-06-14 10:01:30 +0100 470) rv = -EINVAL;
ba6e93645f039 (Steven Whitehouse 2010-06-14 10:01:30 +0100 471) if (sdp->sd_args.ar_spectator)
ba6e93645f039 (Steven Whitehouse 2010-06-14 10:01:30 +0100 472) goto out;
ba6e93645f039 (Steven Whitehouse 2010-06-14 10:01:30 +0100 473) if (sdp->sd_lockstruct.ls_ops->lm_mount == NULL)
ba6e93645f039 (Steven Whitehouse 2010-06-14 10:01:30 +0100 474) goto out;
e0c2a9aa1e684 (David Teigland 2012-01-09 17:18:05 -0500 475) sdp->sd_lockstruct.ls_first = first;
e0c2a9aa1e684 (David Teigland 2012-01-09 17:18:05 -0500 476) rv = 0;
ba6e93645f039 (Steven Whitehouse 2010-06-14 10:01:30 +0100 477) out:
ba6e93645f039 (Steven Whitehouse 2010-06-14 10:01:30 +0100 478) spin_unlock(&sdp->sd_jindex_spin);
ba6e93645f039 (Steven Whitehouse 2010-06-14 10:01:30 +0100 479) return rv ? rv : len;
ba6e93645f039 (Steven Whitehouse 2010-06-14 10:01:30 +0100 480) }
ba6e93645f039 (Steven Whitehouse 2010-06-14 10:01:30 +0100 481)
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 482) static ssize_t first_done_show(struct gfs2_sbd *sdp, char *buf)
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 483) {
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 484) struct lm_lockstruct *ls = &sdp->sd_lockstruct;
e0c2a9aa1e684 (David Teigland 2012-01-09 17:18:05 -0500 485) return sprintf(buf, "%d\n", !!test_bit(DFL_FIRST_MOUNT_DONE, &ls->ls_recover_flags));
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 486) }
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 487)
e0c2a9aa1e684 (David Teigland 2012-01-09 17:18:05 -0500 488) int gfs2_recover_set(struct gfs2_sbd *sdp, unsigned jid)
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 489) {
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 490) struct gfs2_jdesc *jd;
fe64d517df097 (Steven Whitehouse 2009-05-19 10:01:18 +0100 491) int rv;
fe64d517df097 (Steven Whitehouse 2009-05-19 10:01:18 +0100 492)
0e48e055a7dfc (Bob Peterson 2014-06-02 09:40:25 -0400 493) /* Wait for our primary journal to be initialized */
0e48e055a7dfc (Bob Peterson 2014-06-02 09:40:25 -0400 494) wait_for_completion(&sdp->sd_journal_ready);
0e48e055a7dfc (Bob Peterson 2014-06-02 09:40:25 -0400 495)
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 496) spin_lock(&sdp->sd_jindex_spin);
fe64d517df097 (Steven Whitehouse 2009-05-19 10:01:18 +0100 497) rv = -EBUSY;
4a7727725dc7d (Bob Peterson 2018-07-05 14:40:46 -0500 498) /**
4a7727725dc7d (Bob Peterson 2018-07-05 14:40:46 -0500 499) * If we're a spectator, we use journal0, but it's not really ours.
4a7727725dc7d (Bob Peterson 2018-07-05 14:40:46 -0500 500) * So we need to wait for its recovery too. If we skip it we'd never
4a7727725dc7d (Bob Peterson 2018-07-05 14:40:46 -0500 501) * queue work to the recovery workqueue, and so its completion would
4a7727725dc7d (Bob Peterson 2018-07-05 14:40:46 -0500 502) * never clear the DFL_BLOCK_LOCKS flag, so all our locks would
4a7727725dc7d (Bob Peterson 2018-07-05 14:40:46 -0500 503) * permanently stop working.
4a7727725dc7d (Bob Peterson 2018-07-05 14:40:46 -0500 504) */
601ef0d52e961 (Bob Peterson 2020-01-28 20:23:45 +0100 505) if (!sdp->sd_jdesc)
601ef0d52e961 (Bob Peterson 2020-01-28 20:23:45 +0100 506) goto out;
4a7727725dc7d (Bob Peterson 2018-07-05 14:40:46 -0500 507) if (sdp->sd_jdesc->jd_jid == jid && !sdp->sd_args.ar_spectator)
fe64d517df097 (Steven Whitehouse 2009-05-19 10:01:18 +0100 508) goto out;
fe64d517df097 (Steven Whitehouse 2009-05-19 10:01:18 +0100 509) rv = -ENOENT;
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 510) list_for_each_entry(jd, &sdp->sd_jindex_list, jd_list) {
4a7727725dc7d (Bob Peterson 2018-07-05 14:40:46 -0500 511) if (jd->jd_jid != jid && !sdp->sd_args.ar_spectator)
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 512) continue;
6ecd7c2dd9f5d (Tejun Heo 2010-07-20 22:09:02 +0200 513) rv = gfs2_recover_journal(jd, false);
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 514) break;
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 515) }
fe64d517df097 (Steven Whitehouse 2009-05-19 10:01:18 +0100 516) out:
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 517) spin_unlock(&sdp->sd_jindex_spin);
e0c2a9aa1e684 (David Teigland 2012-01-09 17:18:05 -0500 518) return rv;
e0c2a9aa1e684 (David Teigland 2012-01-09 17:18:05 -0500 519) }
e0c2a9aa1e684 (David Teigland 2012-01-09 17:18:05 -0500 520)
e0c2a9aa1e684 (David Teigland 2012-01-09 17:18:05 -0500 521) static ssize_t recover_store(struct gfs2_sbd *sdp, const char *buf, size_t len)
e0c2a9aa1e684 (David Teigland 2012-01-09 17:18:05 -0500 522) {
e0c2a9aa1e684 (David Teigland 2012-01-09 17:18:05 -0500 523) unsigned jid;
e0c2a9aa1e684 (David Teigland 2012-01-09 17:18:05 -0500 524) int rv;
e0c2a9aa1e684 (David Teigland 2012-01-09 17:18:05 -0500 525)
e0c2a9aa1e684 (David Teigland 2012-01-09 17:18:05 -0500 526) rv = sscanf(buf, "%u", &jid);
e0c2a9aa1e684 (David Teigland 2012-01-09 17:18:05 -0500 527) if (rv != 1)
e0c2a9aa1e684 (David Teigland 2012-01-09 17:18:05 -0500 528) return -EINVAL;
e0c2a9aa1e684 (David Teigland 2012-01-09 17:18:05 -0500 529)
1a058f5288a74 (David Teigland 2012-05-01 15:50:48 -0500 530) if (test_bit(SDF_NORECOVERY, &sdp->sd_flags)) {
1a058f5288a74 (David Teigland 2012-05-01 15:50:48 -0500 531) rv = -ESHUTDOWN;
1a058f5288a74 (David Teigland 2012-05-01 15:50:48 -0500 532) goto out;
1a058f5288a74 (David Teigland 2012-05-01 15:50:48 -0500 533) }
e0c2a9aa1e684 (David Teigland 2012-01-09 17:18:05 -0500 534)
1a058f5288a74 (David Teigland 2012-05-01 15:50:48 -0500 535) rv = gfs2_recover_set(sdp, jid);
1a058f5288a74 (David Teigland 2012-05-01 15:50:48 -0500 536) out:
fe64d517df097 (Steven Whitehouse 2009-05-19 10:01:18 +0100 537) return rv ? rv : len;
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 538) }
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 539)
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 540) static ssize_t recover_done_show(struct gfs2_sbd *sdp, char *buf)
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 541) {
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 542) struct lm_lockstruct *ls = &sdp->sd_lockstruct;
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 543) return sprintf(buf, "%d\n", ls->ls_recover_jid_done);
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 544) }
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 545)
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 546) static ssize_t recover_status_show(struct gfs2_sbd *sdp, char *buf)
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 547) {
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 548) struct lm_lockstruct *ls = &sdp->sd_lockstruct;
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 549) return sprintf(buf, "%d\n", ls->ls_recover_jid_status);
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 550) }
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 551)
e1b28aab5804a (Steven Whitehouse 2009-05-26 15:41:27 +0100 552) static ssize_t jid_show(struct gfs2_sbd *sdp, char *buf)
e1b28aab5804a (Steven Whitehouse 2009-05-26 15:41:27 +0100 553) {
feb47ca931466 (Steven Whitehouse 2010-09-29 15:04:18 +0100 554) return sprintf(buf, "%d\n", sdp->sd_lockstruct.ls_jid);
e1b28aab5804a (Steven Whitehouse 2009-05-26 15:41:27 +0100 555) }
e1b28aab5804a (Steven Whitehouse 2009-05-26 15:41:27 +0100 556)
ba6e93645f039 (Steven Whitehouse 2010-06-14 10:01:30 +0100 557) static ssize_t jid_store(struct gfs2_sbd *sdp, const char *buf, size_t len)
ba6e93645f039 (Steven Whitehouse 2010-06-14 10:01:30 +0100 558) {
feb47ca931466 (Steven Whitehouse 2010-09-29 15:04:18 +0100 559) int jid;
ba6e93645f039 (Steven Whitehouse 2010-06-14 10:01:30 +0100 560) int rv;
ba6e93645f039 (Steven Whitehouse 2010-06-14 10:01:30 +0100 561)
feb47ca931466 (Steven Whitehouse 2010-09-29 15:04:18 +0100 562) rv = sscanf(buf, "%d", &jid);
ba6e93645f039 (Steven Whitehouse 2010-06-14 10:01:30 +0100 563) if (rv != 1)
ba6e93645f039 (Steven Whitehouse 2010-06-14 10:01:30 +0100 564) return -EINVAL;
3942ae5319640 (Steven Whitehouse 2011-07-11 08:53:30 +0100 565) rv = wait_for_completion_killable(&sdp->sd_locking_init);
3942ae5319640 (Steven Whitehouse 2011-07-11 08:53:30 +0100 566) if (rv)
3942ae5319640 (Steven Whitehouse 2011-07-11 08:53:30 +0100 567) return rv;
ba6e93645f039 (Steven Whitehouse 2010-06-14 10:01:30 +0100 568) spin_lock(&sdp->sd_jindex_spin);
ba6e93645f039 (Steven Whitehouse 2010-06-14 10:01:30 +0100 569) rv = -EINVAL;
ba6e93645f039 (Steven Whitehouse 2010-06-14 10:01:30 +0100 570) if (sdp->sd_lockstruct.ls_ops->lm_mount == NULL)
ba6e93645f039 (Steven Whitehouse 2010-06-14 10:01:30 +0100 571) goto out;
ba6e93645f039 (Steven Whitehouse 2010-06-14 10:01:30 +0100 572) rv = -EBUSY;
feb47ca931466 (Steven Whitehouse 2010-09-29 15:04:18 +0100 573) if (test_bit(SDF_NOJOURNALID, &sdp->sd_flags) == 0)
ba6e93645f039 (Steven Whitehouse 2010-06-14 10:01:30 +0100 574) goto out;
feb47ca931466 (Steven Whitehouse 2010-09-29 15:04:18 +0100 575) rv = 0;
feb47ca931466 (Steven Whitehouse 2010-09-29 15:04:18 +0100 576) if (sdp->sd_args.ar_spectator && jid > 0)
feb47ca931466 (Steven Whitehouse 2010-09-29 15:04:18 +0100 577) rv = jid = -EINVAL;
ba6e93645f039 (Steven Whitehouse 2010-06-14 10:01:30 +0100 578) sdp->sd_lockstruct.ls_jid = jid;
feb47ca931466 (Steven Whitehouse 2010-09-29 15:04:18 +0100 579) clear_bit(SDF_NOJOURNALID, &sdp->sd_flags);
4e857c58efeb9 (Peter Zijlstra 2014-03-17 18:06:10 +0100 580) smp_mb__after_atomic();
ba6e93645f039 (Steven Whitehouse 2010-06-14 10:01:30 +0100 581) wake_up_bit(&sdp->sd_flags, SDF_NOJOURNALID);
ba6e93645f039 (Steven Whitehouse 2010-06-14 10:01:30 +0100 582) out:
ba6e93645f039 (Steven Whitehouse 2010-06-14 10:01:30 +0100 583) spin_unlock(&sdp->sd_jindex_spin);
ba6e93645f039 (Steven Whitehouse 2010-06-14 10:01:30 +0100 584) return rv ? rv : len;
ba6e93645f039 (Steven Whitehouse 2010-06-14 10:01:30 +0100 585) }
ba6e93645f039 (Steven Whitehouse 2010-06-14 10:01:30 +0100 586)
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 587) #define GDLM_ATTR(_name,_mode,_show,_store) \
48c2b61361623 (Steven Whitehouse 2009-05-13 14:49:48 +0100 588) static struct gfs2_attr gdlm_attr_##_name = __ATTR(_name,_mode,_show,_store)
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 589)
d7e623da1a757 (Steven Whitehouse 2009-08-11 11:20:11 +0100 590) GDLM_ATTR(proto_name, 0444, proto_name_show, NULL);
d7e623da1a757 (Steven Whitehouse 2009-08-11 11:20:11 +0100 591) GDLM_ATTR(block, 0644, block_show, block_store);
fd95e81cb1c74 (Steven Whitehouse 2013-02-13 12:21:40 +0000 592) GDLM_ATTR(withdraw, 0644, wdack_show, wdack_store);
ba6e93645f039 (Steven Whitehouse 2010-06-14 10:01:30 +0100 593) GDLM_ATTR(jid, 0644, jid_show, jid_store);
ba6e93645f039 (Steven Whitehouse 2010-06-14 10:01:30 +0100 594) GDLM_ATTR(first, 0644, lkfirst_show, lkfirst_store);
d7e623da1a757 (Steven Whitehouse 2009-08-11 11:20:11 +0100 595) GDLM_ATTR(first_done, 0444, first_done_show, NULL);
d7e623da1a757 (Steven Whitehouse 2009-08-11 11:20:11 +0100 596) GDLM_ATTR(recover, 0600, NULL, recover_store);
d7e623da1a757 (Steven Whitehouse 2009-08-11 11:20:11 +0100 597) GDLM_ATTR(recover_done, 0444, recover_done_show, NULL);
d7e623da1a757 (Steven Whitehouse 2009-08-11 11:20:11 +0100 598) GDLM_ATTR(recover_status, 0444, recover_status_show, NULL);
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 599)
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 600) static struct attribute *lock_module_attrs[] = {
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 601) &gdlm_attr_proto_name.attr,
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 602) &gdlm_attr_block.attr,
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 603) &gdlm_attr_withdraw.attr,
e1b28aab5804a (Steven Whitehouse 2009-05-26 15:41:27 +0100 604) &gdlm_attr_jid.attr,
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 605) &gdlm_attr_first.attr,
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 606) &gdlm_attr_first_done.attr,
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 607) &gdlm_attr_recover.attr,
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 608) &gdlm_attr_recover_done.attr,
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 609) &gdlm_attr_recover_status.attr,
ea67eedb211d3 (Steven Whitehouse 2006-09-05 10:53:09 -0400 610) NULL,
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 611) };
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 612)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 613) /*
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 614) * get and set struct gfs2_tune fields
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 615) */
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 616)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 617) static ssize_t quota_scale_show(struct gfs2_sbd *sdp, char *buf)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 618) {
3204a6c055887 (David Teigland 2006-09-06 16:57:06 -0500 619) return snprintf(buf, PAGE_SIZE, "%u %u\n",
3204a6c055887 (David Teigland 2006-09-06 16:57:06 -0500 620) sdp->sd_tune.gt_quota_scale_num,
3204a6c055887 (David Teigland 2006-09-06 16:57:06 -0500 621) sdp->sd_tune.gt_quota_scale_den);
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 622) }
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 623)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 624) static ssize_t quota_scale_store(struct gfs2_sbd *sdp, const char *buf,
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 625) size_t len)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 626) {
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 627) struct gfs2_tune *gt = &sdp->sd_tune;
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 628) unsigned int x, y;
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 629)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 630) if (!capable(CAP_SYS_ADMIN))
41735818766c0 (Zhao Hongjiang 2013-02-20 13:13:55 +1100 631) return -EPERM;
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 632)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 633) if (sscanf(buf, "%u %u", &x, &y) != 2 || !y)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 634) return -EINVAL;
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 635)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 636) spin_lock(>->gt_spin);
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 637) gt->gt_quota_scale_num = x;
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 638) gt->gt_quota_scale_den = y;
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 639) spin_unlock(>->gt_spin);
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 640) return len;
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 641) }
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 642)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 643) static ssize_t tune_set(struct gfs2_sbd *sdp, unsigned int *field,
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 644) int check_zero, const char *buf, size_t len)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 645) {
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 646) struct gfs2_tune *gt = &sdp->sd_tune;
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 647) unsigned int x;
e50ead480fac6 (Fabian Frederick 2015-05-05 13:23:22 -0500 648) int error;
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 649)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 650) if (!capable(CAP_SYS_ADMIN))
41735818766c0 (Zhao Hongjiang 2013-02-20 13:13:55 +1100 651) return -EPERM;
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 652)
e50ead480fac6 (Fabian Frederick 2015-05-05 13:23:22 -0500 653) error = kstrtouint(buf, 0, &x);
e50ead480fac6 (Fabian Frederick 2015-05-05 13:23:22 -0500 654) if (error)
e50ead480fac6 (Fabian Frederick 2015-05-05 13:23:22 -0500 655) return error;
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 656)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 657) if (check_zero && !x)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 658) return -EINVAL;
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 659)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 660) spin_lock(>->gt_spin);
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 661) *field = x;
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 662) spin_unlock(>->gt_spin);
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 663) return len;
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 664) }
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 665)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 666) #define TUNE_ATTR_3(name, show, store) \
48c2b61361623 (Steven Whitehouse 2009-05-13 14:49:48 +0100 667) static struct gfs2_attr tune_attr_##name = __ATTR(name, 0644, show, store)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 668)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 669) #define TUNE_ATTR_2(name, store) \
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 670) static ssize_t name##_show(struct gfs2_sbd *sdp, char *buf) \
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 671) { \
3204a6c055887 (David Teigland 2006-09-06 16:57:06 -0500 672) return snprintf(buf, PAGE_SIZE, "%u\n", sdp->sd_tune.gt_##name); \
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 673) } \
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 674) TUNE_ATTR_3(name, name##_show, store)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 675)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 676) #define TUNE_ATTR(name, check_zero) \
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 677) static ssize_t name##_store(struct gfs2_sbd *sdp, const char *buf, size_t len)\
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 678) { \
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 679) return tune_set(sdp, &sdp->sd_tune.gt_##name, check_zero, buf, len); \
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 680) } \
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 681) TUNE_ATTR_2(name, name##_store)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 682)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 683) TUNE_ATTR(quota_warn_period, 0);
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 684) TUNE_ATTR(quota_quantum, 0);
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 685) TUNE_ATTR(max_readahead, 0);
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 686) TUNE_ATTR(complain_secs, 0);
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 687) TUNE_ATTR(statfs_slow, 0);
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 688) TUNE_ATTR(new_files_jdata, 0);
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 689) TUNE_ATTR(statfs_quantum, 1);
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 690) TUNE_ATTR_3(quota_scale, quota_scale_show, quota_scale_store);
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 691)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 692) static struct attribute *tune_attrs[] = {
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 693) &tune_attr_quota_warn_period.attr,
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 694) &tune_attr_quota_quantum.attr,
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 695) &tune_attr_max_readahead.attr,
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 696) &tune_attr_complain_secs.attr,
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 697) &tune_attr_statfs_slow.attr,
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 698) &tune_attr_statfs_quantum.attr,
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 699) &tune_attr_quota_scale.attr,
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 700) &tune_attr_new_files_jdata.attr,
ea67eedb211d3 (Steven Whitehouse 2006-09-05 10:53:09 -0400 701) NULL,
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 702) };
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 703)
29695254ec515 (Arvind Yadav 2017-06-30 08:33:54 -0500 704) static const struct attribute_group tune_group = {
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 705) .name = "tune",
ea67eedb211d3 (Steven Whitehouse 2006-09-05 10:53:09 -0400 706) .attrs = tune_attrs,
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 707) };
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 708)
29695254ec515 (Arvind Yadav 2017-06-30 08:33:54 -0500 709) static const struct attribute_group lock_module_group = {
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 710) .name = "lock_module",
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 711) .attrs = lock_module_attrs,
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 712) };
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 713)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 714) int gfs2_sys_fs_add(struct gfs2_sbd *sdp)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 715) {
440d6da207e9e (Steven Whitehouse 2009-07-31 12:16:25 +0100 716) struct super_block *sb = sdp->sd_vfs;
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 717) int error;
440d6da207e9e (Steven Whitehouse 2009-07-31 12:16:25 +0100 718) char ro[20];
440d6da207e9e (Steven Whitehouse 2009-07-31 12:16:25 +0100 719) char spectator[20];
440d6da207e9e (Steven Whitehouse 2009-07-31 12:16:25 +0100 720) char *envp[] = { ro, spectator, NULL };
440d6da207e9e (Steven Whitehouse 2009-07-31 12:16:25 +0100 721)
bc98a42c1f7d0 (David Howells 2017-07-17 08:45:34 +0100 722) sprintf(ro, "RDONLY=%d", sb_rdonly(sb));
440d6da207e9e (Steven Whitehouse 2009-07-31 12:16:25 +0100 723) sprintf(spectator, "SPECTATOR=%d", sdp->sd_args.ar_spectator ? 1 : 0);
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 724)
c2a04b02c060c (Jamie Iles 2020-10-12 14:13:09 +0100 725) init_completion(&sdp->sd_kobj_unregister);
9bec101a0c38d (Greg Kroah-Hartman 2007-10-29 20:13:17 +0100 726) sdp->sd_kobj.kset = gfs2_kset;
901195ed7f4b2 (Greg Kroah-Hartman 2007-12-17 15:54:39 -0400 727) error = kobject_init_and_add(&sdp->sd_kobj, &gfs2_ktype, NULL,
901195ed7f4b2 (Greg Kroah-Hartman 2007-12-17 15:54:39 -0400 728) "%s", sdp->sd_table_name);
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 729) if (error)
0d515210b6969 (Bob Peterson 2012-06-13 10:27:41 -0400 730) goto fail_reg;
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 731)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 732) error = sysfs_create_group(&sdp->sd_kobj, &tune_group);
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 733) if (error)
f6eb53498ee8f (Steven Whitehouse 2009-05-26 15:50:25 +0100 734) goto fail_reg;
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 735)
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 736) error = sysfs_create_group(&sdp->sd_kobj, &lock_module_group);
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 737) if (error)
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 738) goto fail_tune;
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 739)
31e54b01f3f00 (Steven Whitehouse 2009-08-13 12:18:08 +0100 740) error = sysfs_create_link(&sdp->sd_kobj,
31e54b01f3f00 (Steven Whitehouse 2009-08-13 12:18:08 +0100 741) &disk_to_dev(sb->s_bdev->bd_disk)->kobj,
31e54b01f3f00 (Steven Whitehouse 2009-08-13 12:18:08 +0100 742) "device");
31e54b01f3f00 (Steven Whitehouse 2009-08-13 12:18:08 +0100 743) if (error)
31e54b01f3f00 (Steven Whitehouse 2009-08-13 12:18:08 +0100 744) goto fail_lock_module;
31e54b01f3f00 (Steven Whitehouse 2009-08-13 12:18:08 +0100 745)
440d6da207e9e (Steven Whitehouse 2009-07-31 12:16:25 +0100 746) kobject_uevent_env(&sdp->sd_kobj, KOBJ_ADD, envp);
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 747) return 0;
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 748)
31e54b01f3f00 (Steven Whitehouse 2009-08-13 12:18:08 +0100 749) fail_lock_module:
31e54b01f3f00 (Steven Whitehouse 2009-08-13 12:18:08 +0100 750) sysfs_remove_group(&sdp->sd_kobj, &lock_module_group);
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 751) fail_tune:
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 752) sysfs_remove_group(&sdp->sd_kobj, &tune_group);
a91ea69ffd3f8 (Steven Whitehouse 2006-09-04 12:04:26 -0400 753) fail_reg:
af38816e4801d (Andreas Gruenbacher 2018-01-30 10:32:30 -0700 754) fs_err(sdp, "error %d adding sysfs files\n", error);
fbcde197e1bef (Tobin C. Harding 2019-05-13 21:59:04 +0200 755) kobject_put(&sdp->sd_kobj);
c2a04b02c060c (Jamie Iles 2020-10-12 14:13:09 +0100 756) wait_for_completion(&sdp->sd_kobj_unregister);
0d515210b6969 (Bob Peterson 2012-06-13 10:27:41 -0400 757) sb->s_fs_info = NULL;
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 758) return error;
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 759) }
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 760)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 761) void gfs2_sys_fs_del(struct gfs2_sbd *sdp)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 762) {
31e54b01f3f00 (Steven Whitehouse 2009-08-13 12:18:08 +0100 763) sysfs_remove_link(&sdp->sd_kobj, "device");
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 764) sysfs_remove_group(&sdp->sd_kobj, &tune_group);
f057f6cdf6417 (Steven Whitehouse 2009-01-12 10:43:39 +0000 765) sysfs_remove_group(&sdp->sd_kobj, &lock_module_group);
197b12d6796a3 (Greg Kroah-Hartman 2007-12-20 08:13:05 -0800 766) kobject_put(&sdp->sd_kobj);
c2a04b02c060c (Jamie Iles 2020-10-12 14:13:09 +0100 767) wait_for_completion(&sdp->sd_kobj_unregister);
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 768) }
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 769)
fdd1062ebaa42 (Steven Whitehouse 2008-11-26 10:26:38 +0000 770) static int gfs2_uevent(struct kset *kset, struct kobject *kobj,
fdd1062ebaa42 (Steven Whitehouse 2008-11-26 10:26:38 +0000 771) struct kobj_uevent_env *env)
fdd1062ebaa42 (Steven Whitehouse 2008-11-26 10:26:38 +0000 772) {
fdd1062ebaa42 (Steven Whitehouse 2008-11-26 10:26:38 +0000 773) struct gfs2_sbd *sdp = container_of(kobj, struct gfs2_sbd, sd_kobj);
32e471ef1057e (Steven Whitehouse 2011-05-10 15:01:59 +0100 774) struct super_block *s = sdp->sd_vfs;
02e3cc70ecbd4 (Steven Whitehouse 2009-02-10 13:48:30 +0000 775)
fdd1062ebaa42 (Steven Whitehouse 2008-11-26 10:26:38 +0000 776) add_uevent_var(env, "LOCKTABLE=%s", sdp->sd_table_name);
fdd1062ebaa42 (Steven Whitehouse 2008-11-26 10:26:38 +0000 777) add_uevent_var(env, "LOCKPROTO=%s", sdp->sd_proto_name);
ba6e93645f039 (Steven Whitehouse 2010-06-14 10:01:30 +0100 778) if (!test_bit(SDF_NOJOURNALID, &sdp->sd_flags))
feb47ca931466 (Steven Whitehouse 2010-09-29 15:04:18 +0100 779) add_uevent_var(env, "JOURNALID=%d", sdp->sd_lockstruct.ls_jid);
85787090a21eb (Christoph Hellwig 2017-05-10 15:06:33 +0200 780) if (!uuid_is_null(&s->s_uuid))
85787090a21eb (Christoph Hellwig 2017-05-10 15:06:33 +0200 781) add_uevent_var(env, "UUID=%pUB", &s->s_uuid);
fdd1062ebaa42 (Steven Whitehouse 2008-11-26 10:26:38 +0000 782) return 0;
fdd1062ebaa42 (Steven Whitehouse 2008-11-26 10:26:38 +0000 783) }
fdd1062ebaa42 (Steven Whitehouse 2008-11-26 10:26:38 +0000 784)
9cd43611ccfb4 (Emese Revfy 2009-12-31 14:52:51 +0100 785) static const struct kset_uevent_ops gfs2_uevent_ops = {
fdd1062ebaa42 (Steven Whitehouse 2008-11-26 10:26:38 +0000 786) .uevent = gfs2_uevent,
fdd1062ebaa42 (Steven Whitehouse 2008-11-26 10:26:38 +0000 787) };
fdd1062ebaa42 (Steven Whitehouse 2008-11-26 10:26:38 +0000 788)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 789) int gfs2_sys_init(void)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 790) {
fdd1062ebaa42 (Steven Whitehouse 2008-11-26 10:26:38 +0000 791) gfs2_kset = kset_create_and_add("gfs2", &gfs2_uevent_ops, fs_kobj);
9bec101a0c38d (Greg Kroah-Hartman 2007-10-29 20:13:17 +0100 792) if (!gfs2_kset)
9bec101a0c38d (Greg Kroah-Hartman 2007-10-29 20:13:17 +0100 793) return -ENOMEM;
9bec101a0c38d (Greg Kroah-Hartman 2007-10-29 20:13:17 +0100 794) return 0;
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 795) }
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 796)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 797) void gfs2_sys_uninit(void)
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 798) {
9bec101a0c38d (Greg Kroah-Hartman 2007-10-29 20:13:17 +0100 799) kset_unregister(gfs2_kset);
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 800) }
b3b94faa5fe59 (David Teigland 2006-01-16 16:50:04 +0000 801)