VisionFive2 Linux kernel

StarFive Tech Linux Kernel for VisionFive (JH7110) boards (mirror)

More than 9999 Commits   32 Branches   54 Tags
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->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->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->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->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)