0001
0002
0003
0004
0005
0006
0007 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
0008
0009 #include <linux/sched.h>
0010 #include <linux/cred.h>
0011 #include <linux/spinlock.h>
0012 #include <linux/completion.h>
0013 #include <linux/buffer_head.h>
0014 #include <linux/module.h>
0015 #include <linux/kobject.h>
0016 #include <linux/uaccess.h>
0017 #include <linux/gfs2_ondisk.h>
0018 #include <linux/blkdev.h>
0019
0020 #include "gfs2.h"
0021 #include "incore.h"
0022 #include "sys.h"
0023 #include "super.h"
0024 #include "glock.h"
0025 #include "quota.h"
0026 #include "util.h"
0027 #include "glops.h"
0028 #include "recovery.h"
0029
0030 struct gfs2_attr {
0031 struct attribute attr;
0032 ssize_t (*show)(struct gfs2_sbd *, char *);
0033 ssize_t (*store)(struct gfs2_sbd *, const char *, size_t);
0034 };
0035
0036 static ssize_t gfs2_attr_show(struct kobject *kobj, struct attribute *attr,
0037 char *buf)
0038 {
0039 struct gfs2_sbd *sdp = container_of(kobj, struct gfs2_sbd, sd_kobj);
0040 struct gfs2_attr *a = container_of(attr, struct gfs2_attr, attr);
0041 return a->show ? a->show(sdp, buf) : 0;
0042 }
0043
0044 static ssize_t gfs2_attr_store(struct kobject *kobj, struct attribute *attr,
0045 const char *buf, size_t len)
0046 {
0047 struct gfs2_sbd *sdp = container_of(kobj, struct gfs2_sbd, sd_kobj);
0048 struct gfs2_attr *a = container_of(attr, struct gfs2_attr, attr);
0049 return a->store ? a->store(sdp, buf, len) : len;
0050 }
0051
0052 static const struct sysfs_ops gfs2_attr_ops = {
0053 .show = gfs2_attr_show,
0054 .store = gfs2_attr_store,
0055 };
0056
0057
0058 static struct kset *gfs2_kset;
0059
0060 static ssize_t id_show(struct gfs2_sbd *sdp, char *buf)
0061 {
0062 return snprintf(buf, PAGE_SIZE, "%u:%u\n",
0063 MAJOR(sdp->sd_vfs->s_dev), MINOR(sdp->sd_vfs->s_dev));
0064 }
0065
0066 static ssize_t status_show(struct gfs2_sbd *sdp, char *buf)
0067 {
0068 unsigned long f = sdp->sd_flags;
0069 ssize_t s;
0070
0071 s = snprintf(buf, PAGE_SIZE,
0072 "Journal Checked: %d\n"
0073 "Journal Live: %d\n"
0074 "Journal ID: %d\n"
0075 "Spectator: %d\n"
0076 "Withdrawn: %d\n"
0077 "No barriers: %d\n"
0078 "No recovery: %d\n"
0079 "Demote: %d\n"
0080 "No Journal ID: %d\n"
0081 "Mounted RO: %d\n"
0082 "RO Recovery: %d\n"
0083 "Skip DLM Unlock: %d\n"
0084 "Force AIL Flush: %d\n"
0085 "FS Frozen: %d\n"
0086 "Withdrawing: %d\n"
0087 "Withdraw In Prog: %d\n"
0088 "Remote Withdraw: %d\n"
0089 "Withdraw Recovery: %d\n"
0090 "sd_log_error: %d\n"
0091 "sd_log_flush_lock: %d\n"
0092 "sd_log_num_revoke: %u\n"
0093 "sd_log_in_flight: %d\n"
0094 "sd_log_blks_needed: %d\n"
0095 "sd_log_blks_free: %d\n"
0096 "sd_log_flush_head: %d\n"
0097 "sd_log_flush_tail: %d\n"
0098 "sd_log_blks_reserved: %d\n"
0099 "sd_log_revokes_available: %d\n",
0100 test_bit(SDF_JOURNAL_CHECKED, &f),
0101 test_bit(SDF_JOURNAL_LIVE, &f),
0102 (sdp->sd_jdesc ? sdp->sd_jdesc->jd_jid : 0),
0103 (sdp->sd_args.ar_spectator ? 1 : 0),
0104 test_bit(SDF_WITHDRAWN, &f),
0105 test_bit(SDF_NOBARRIERS, &f),
0106 test_bit(SDF_NORECOVERY, &f),
0107 test_bit(SDF_DEMOTE, &f),
0108 test_bit(SDF_NOJOURNALID, &f),
0109 (sb_rdonly(sdp->sd_vfs) ? 1 : 0),
0110 test_bit(SDF_RORECOVERY, &f),
0111 test_bit(SDF_SKIP_DLM_UNLOCK, &f),
0112 test_bit(SDF_FORCE_AIL_FLUSH, &f),
0113 test_bit(SDF_FS_FROZEN, &f),
0114 test_bit(SDF_WITHDRAWING, &f),
0115 test_bit(SDF_WITHDRAW_IN_PROG, &f),
0116 test_bit(SDF_REMOTE_WITHDRAW, &f),
0117 test_bit(SDF_WITHDRAW_RECOVERY, &f),
0118 sdp->sd_log_error,
0119 rwsem_is_locked(&sdp->sd_log_flush_lock),
0120 sdp->sd_log_num_revoke,
0121 atomic_read(&sdp->sd_log_in_flight),
0122 atomic_read(&sdp->sd_log_blks_needed),
0123 atomic_read(&sdp->sd_log_blks_free),
0124 sdp->sd_log_flush_head,
0125 sdp->sd_log_flush_tail,
0126 sdp->sd_log_blks_reserved,
0127 atomic_read(&sdp->sd_log_revokes_available));
0128 return s;
0129 }
0130
0131 static ssize_t fsname_show(struct gfs2_sbd *sdp, char *buf)
0132 {
0133 return snprintf(buf, PAGE_SIZE, "%s\n", sdp->sd_fsname);
0134 }
0135
0136 static ssize_t uuid_show(struct gfs2_sbd *sdp, char *buf)
0137 {
0138 struct super_block *s = sdp->sd_vfs;
0139
0140 buf[0] = '\0';
0141 if (uuid_is_null(&s->s_uuid))
0142 return 0;
0143 return snprintf(buf, PAGE_SIZE, "%pUB\n", &s->s_uuid);
0144 }
0145
0146 static ssize_t freeze_show(struct gfs2_sbd *sdp, char *buf)
0147 {
0148 struct super_block *sb = sdp->sd_vfs;
0149 int frozen = (sb->s_writers.frozen == SB_UNFROZEN) ? 0 : 1;
0150
0151 return snprintf(buf, PAGE_SIZE, "%d\n", frozen);
0152 }
0153
0154 static ssize_t freeze_store(struct gfs2_sbd *sdp, const char *buf, size_t len)
0155 {
0156 int error, n;
0157
0158 error = kstrtoint(buf, 0, &n);
0159 if (error)
0160 return error;
0161
0162 if (!capable(CAP_SYS_ADMIN))
0163 return -EPERM;
0164
0165 switch (n) {
0166 case 0:
0167 error = thaw_super(sdp->sd_vfs);
0168 break;
0169 case 1:
0170 error = freeze_super(sdp->sd_vfs);
0171 break;
0172 default:
0173 return -EINVAL;
0174 }
0175
0176 if (error) {
0177 fs_warn(sdp, "freeze %d error %d\n", n, error);
0178 return error;
0179 }
0180
0181 return len;
0182 }
0183
0184 static ssize_t withdraw_show(struct gfs2_sbd *sdp, char *buf)
0185 {
0186 unsigned int b = gfs2_withdrawn(sdp);
0187 return snprintf(buf, PAGE_SIZE, "%u\n", b);
0188 }
0189
0190 static ssize_t withdraw_store(struct gfs2_sbd *sdp, const char *buf, size_t len)
0191 {
0192 int error, val;
0193
0194 if (!capable(CAP_SYS_ADMIN))
0195 return -EPERM;
0196
0197 error = kstrtoint(buf, 0, &val);
0198 if (error)
0199 return error;
0200
0201 if (val != 1)
0202 return -EINVAL;
0203
0204 gfs2_lm(sdp, "withdrawing from cluster at user's request\n");
0205 gfs2_withdraw(sdp);
0206
0207 return len;
0208 }
0209
0210 static ssize_t statfs_sync_store(struct gfs2_sbd *sdp, const char *buf,
0211 size_t len)
0212 {
0213 int error, val;
0214
0215 if (!capable(CAP_SYS_ADMIN))
0216 return -EPERM;
0217
0218 error = kstrtoint(buf, 0, &val);
0219 if (error)
0220 return error;
0221
0222 if (val != 1)
0223 return -EINVAL;
0224
0225 gfs2_statfs_sync(sdp->sd_vfs, 0);
0226 return len;
0227 }
0228
0229 static ssize_t quota_sync_store(struct gfs2_sbd *sdp, const char *buf,
0230 size_t len)
0231 {
0232 int error, val;
0233
0234 if (!capable(CAP_SYS_ADMIN))
0235 return -EPERM;
0236
0237 error = kstrtoint(buf, 0, &val);
0238 if (error)
0239 return error;
0240
0241 if (val != 1)
0242 return -EINVAL;
0243
0244 gfs2_quota_sync(sdp->sd_vfs, 0);
0245 return len;
0246 }
0247
0248 static ssize_t quota_refresh_user_store(struct gfs2_sbd *sdp, const char *buf,
0249 size_t len)
0250 {
0251 struct kqid qid;
0252 int error;
0253 u32 id;
0254
0255 if (!capable(CAP_SYS_ADMIN))
0256 return -EPERM;
0257
0258 error = kstrtou32(buf, 0, &id);
0259 if (error)
0260 return error;
0261
0262 qid = make_kqid(current_user_ns(), USRQUOTA, id);
0263 if (!qid_valid(qid))
0264 return -EINVAL;
0265
0266 error = gfs2_quota_refresh(sdp, qid);
0267 return error ? error : len;
0268 }
0269
0270 static ssize_t quota_refresh_group_store(struct gfs2_sbd *sdp, const char *buf,
0271 size_t len)
0272 {
0273 struct kqid qid;
0274 int error;
0275 u32 id;
0276
0277 if (!capable(CAP_SYS_ADMIN))
0278 return -EPERM;
0279
0280 error = kstrtou32(buf, 0, &id);
0281 if (error)
0282 return error;
0283
0284 qid = make_kqid(current_user_ns(), GRPQUOTA, id);
0285 if (!qid_valid(qid))
0286 return -EINVAL;
0287
0288 error = gfs2_quota_refresh(sdp, qid);
0289 return error ? error : len;
0290 }
0291
0292 static ssize_t demote_rq_store(struct gfs2_sbd *sdp, const char *buf, size_t len)
0293 {
0294 struct gfs2_glock *gl;
0295 const struct gfs2_glock_operations *glops;
0296 unsigned int glmode;
0297 unsigned int gltype;
0298 unsigned long long glnum;
0299 char mode[16];
0300 int rv;
0301
0302 if (!capable(CAP_SYS_ADMIN))
0303 return -EPERM;
0304
0305 rv = sscanf(buf, "%u:%llu %15s", &gltype, &glnum,
0306 mode);
0307 if (rv != 3)
0308 return -EINVAL;
0309
0310 if (strcmp(mode, "EX") == 0)
0311 glmode = LM_ST_UNLOCKED;
0312 else if ((strcmp(mode, "CW") == 0) || (strcmp(mode, "DF") == 0))
0313 glmode = LM_ST_DEFERRED;
0314 else if ((strcmp(mode, "PR") == 0) || (strcmp(mode, "SH") == 0))
0315 glmode = LM_ST_SHARED;
0316 else
0317 return -EINVAL;
0318
0319 if (gltype > LM_TYPE_JOURNAL)
0320 return -EINVAL;
0321 if (gltype == LM_TYPE_NONDISK && glnum == GFS2_FREEZE_LOCK)
0322 glops = &gfs2_freeze_glops;
0323 else
0324 glops = gfs2_glops_list[gltype];
0325 if (glops == NULL)
0326 return -EINVAL;
0327 if (!test_and_set_bit(SDF_DEMOTE, &sdp->sd_flags))
0328 fs_info(sdp, "demote interface used\n");
0329 rv = gfs2_glock_get(sdp, glnum, glops, 0, &gl);
0330 if (rv)
0331 return rv;
0332 gfs2_glock_cb(gl, glmode);
0333 gfs2_glock_put(gl);
0334 return len;
0335 }
0336
0337
0338 #define GFS2_ATTR(name, mode, show, store) \
0339 static struct gfs2_attr gfs2_attr_##name = __ATTR(name, mode, show, store)
0340
0341 GFS2_ATTR(id, 0444, id_show, NULL);
0342 GFS2_ATTR(fsname, 0444, fsname_show, NULL);
0343 GFS2_ATTR(uuid, 0444, uuid_show, NULL);
0344 GFS2_ATTR(freeze, 0644, freeze_show, freeze_store);
0345 GFS2_ATTR(withdraw, 0644, withdraw_show, withdraw_store);
0346 GFS2_ATTR(statfs_sync, 0200, NULL, statfs_sync_store);
0347 GFS2_ATTR(quota_sync, 0200, NULL, quota_sync_store);
0348 GFS2_ATTR(quota_refresh_user, 0200, NULL, quota_refresh_user_store);
0349 GFS2_ATTR(quota_refresh_group, 0200, NULL, quota_refresh_group_store);
0350 GFS2_ATTR(demote_rq, 0200, NULL, demote_rq_store);
0351 GFS2_ATTR(status, 0400, status_show, NULL);
0352
0353 static struct attribute *gfs2_attrs[] = {
0354 &gfs2_attr_id.attr,
0355 &gfs2_attr_fsname.attr,
0356 &gfs2_attr_uuid.attr,
0357 &gfs2_attr_freeze.attr,
0358 &gfs2_attr_withdraw.attr,
0359 &gfs2_attr_statfs_sync.attr,
0360 &gfs2_attr_quota_sync.attr,
0361 &gfs2_attr_quota_refresh_user.attr,
0362 &gfs2_attr_quota_refresh_group.attr,
0363 &gfs2_attr_demote_rq.attr,
0364 &gfs2_attr_status.attr,
0365 NULL,
0366 };
0367 ATTRIBUTE_GROUPS(gfs2);
0368
0369 static void gfs2_sbd_release(struct kobject *kobj)
0370 {
0371 struct gfs2_sbd *sdp = container_of(kobj, struct gfs2_sbd, sd_kobj);
0372
0373 complete(&sdp->sd_kobj_unregister);
0374 }
0375
0376 static struct kobj_type gfs2_ktype = {
0377 .release = gfs2_sbd_release,
0378 .default_groups = gfs2_groups,
0379 .sysfs_ops = &gfs2_attr_ops,
0380 };
0381
0382
0383
0384
0385
0386
0387 static ssize_t proto_name_show(struct gfs2_sbd *sdp, char *buf)
0388 {
0389 const struct lm_lockops *ops = sdp->sd_lockstruct.ls_ops;
0390 return sprintf(buf, "%s\n", ops->lm_proto_name);
0391 }
0392
0393 static ssize_t block_show(struct gfs2_sbd *sdp, char *buf)
0394 {
0395 struct lm_lockstruct *ls = &sdp->sd_lockstruct;
0396 ssize_t ret;
0397 int val = 0;
0398
0399 if (test_bit(DFL_BLOCK_LOCKS, &ls->ls_recover_flags))
0400 val = 1;
0401 ret = sprintf(buf, "%d\n", val);
0402 return ret;
0403 }
0404
0405 static ssize_t block_store(struct gfs2_sbd *sdp, const char *buf, size_t len)
0406 {
0407 struct lm_lockstruct *ls = &sdp->sd_lockstruct;
0408 int ret, val;
0409
0410 ret = kstrtoint(buf, 0, &val);
0411 if (ret)
0412 return ret;
0413
0414 if (val == 1)
0415 set_bit(DFL_BLOCK_LOCKS, &ls->ls_recover_flags);
0416 else if (val == 0) {
0417 clear_bit(DFL_BLOCK_LOCKS, &ls->ls_recover_flags);
0418 smp_mb__after_atomic();
0419 gfs2_glock_thaw(sdp);
0420 } else {
0421 return -EINVAL;
0422 }
0423 return len;
0424 }
0425
0426 static ssize_t wdack_show(struct gfs2_sbd *sdp, char *buf)
0427 {
0428 int val = completion_done(&sdp->sd_wdack) ? 1 : 0;
0429
0430 return sprintf(buf, "%d\n", val);
0431 }
0432
0433 static ssize_t wdack_store(struct gfs2_sbd *sdp, const char *buf, size_t len)
0434 {
0435 int ret, val;
0436
0437 ret = kstrtoint(buf, 0, &val);
0438 if (ret)
0439 return ret;
0440
0441 if ((val == 1) &&
0442 !strcmp(sdp->sd_lockstruct.ls_ops->lm_proto_name, "lock_dlm"))
0443 complete(&sdp->sd_wdack);
0444 else
0445 return -EINVAL;
0446 return len;
0447 }
0448
0449 static ssize_t lkfirst_show(struct gfs2_sbd *sdp, char *buf)
0450 {
0451 struct lm_lockstruct *ls = &sdp->sd_lockstruct;
0452 return sprintf(buf, "%d\n", ls->ls_first);
0453 }
0454
0455 static ssize_t lkfirst_store(struct gfs2_sbd *sdp, const char *buf, size_t len)
0456 {
0457 unsigned first;
0458 int rv;
0459
0460 rv = sscanf(buf, "%u", &first);
0461 if (rv != 1 || first > 1)
0462 return -EINVAL;
0463 rv = wait_for_completion_killable(&sdp->sd_locking_init);
0464 if (rv)
0465 return rv;
0466 spin_lock(&sdp->sd_jindex_spin);
0467 rv = -EBUSY;
0468 if (test_bit(SDF_NOJOURNALID, &sdp->sd_flags) == 0)
0469 goto out;
0470 rv = -EINVAL;
0471 if (sdp->sd_args.ar_spectator)
0472 goto out;
0473 if (sdp->sd_lockstruct.ls_ops->lm_mount == NULL)
0474 goto out;
0475 sdp->sd_lockstruct.ls_first = first;
0476 rv = 0;
0477 out:
0478 spin_unlock(&sdp->sd_jindex_spin);
0479 return rv ? rv : len;
0480 }
0481
0482 static ssize_t first_done_show(struct gfs2_sbd *sdp, char *buf)
0483 {
0484 struct lm_lockstruct *ls = &sdp->sd_lockstruct;
0485 return sprintf(buf, "%d\n", !!test_bit(DFL_FIRST_MOUNT_DONE, &ls->ls_recover_flags));
0486 }
0487
0488 int gfs2_recover_set(struct gfs2_sbd *sdp, unsigned jid)
0489 {
0490 struct gfs2_jdesc *jd;
0491 int rv;
0492
0493
0494 wait_for_completion(&sdp->sd_journal_ready);
0495
0496 spin_lock(&sdp->sd_jindex_spin);
0497 rv = -EBUSY;
0498
0499
0500
0501
0502
0503
0504
0505 if (!sdp->sd_jdesc)
0506 goto out;
0507 if (sdp->sd_jdesc->jd_jid == jid && !sdp->sd_args.ar_spectator)
0508 goto out;
0509 rv = -ENOENT;
0510 list_for_each_entry(jd, &sdp->sd_jindex_list, jd_list) {
0511 if (jd->jd_jid != jid && !sdp->sd_args.ar_spectator)
0512 continue;
0513 rv = gfs2_recover_journal(jd, false);
0514 break;
0515 }
0516 out:
0517 spin_unlock(&sdp->sd_jindex_spin);
0518 return rv;
0519 }
0520
0521 static ssize_t recover_store(struct gfs2_sbd *sdp, const char *buf, size_t len)
0522 {
0523 unsigned jid;
0524 int rv;
0525
0526 rv = sscanf(buf, "%u", &jid);
0527 if (rv != 1)
0528 return -EINVAL;
0529
0530 if (test_bit(SDF_NORECOVERY, &sdp->sd_flags)) {
0531 rv = -ESHUTDOWN;
0532 goto out;
0533 }
0534
0535 rv = gfs2_recover_set(sdp, jid);
0536 out:
0537 return rv ? rv : len;
0538 }
0539
0540 static ssize_t recover_done_show(struct gfs2_sbd *sdp, char *buf)
0541 {
0542 struct lm_lockstruct *ls = &sdp->sd_lockstruct;
0543 return sprintf(buf, "%d\n", ls->ls_recover_jid_done);
0544 }
0545
0546 static ssize_t recover_status_show(struct gfs2_sbd *sdp, char *buf)
0547 {
0548 struct lm_lockstruct *ls = &sdp->sd_lockstruct;
0549 return sprintf(buf, "%d\n", ls->ls_recover_jid_status);
0550 }
0551
0552 static ssize_t jid_show(struct gfs2_sbd *sdp, char *buf)
0553 {
0554 return sprintf(buf, "%d\n", sdp->sd_lockstruct.ls_jid);
0555 }
0556
0557 static ssize_t jid_store(struct gfs2_sbd *sdp, const char *buf, size_t len)
0558 {
0559 int jid;
0560 int rv;
0561
0562 rv = sscanf(buf, "%d", &jid);
0563 if (rv != 1)
0564 return -EINVAL;
0565 rv = wait_for_completion_killable(&sdp->sd_locking_init);
0566 if (rv)
0567 return rv;
0568 spin_lock(&sdp->sd_jindex_spin);
0569 rv = -EINVAL;
0570 if (sdp->sd_lockstruct.ls_ops->lm_mount == NULL)
0571 goto out;
0572 rv = -EBUSY;
0573 if (test_bit(SDF_NOJOURNALID, &sdp->sd_flags) == 0)
0574 goto out;
0575 rv = 0;
0576 if (sdp->sd_args.ar_spectator && jid > 0)
0577 rv = jid = -EINVAL;
0578 sdp->sd_lockstruct.ls_jid = jid;
0579 clear_bit(SDF_NOJOURNALID, &sdp->sd_flags);
0580 smp_mb__after_atomic();
0581 wake_up_bit(&sdp->sd_flags, SDF_NOJOURNALID);
0582 out:
0583 spin_unlock(&sdp->sd_jindex_spin);
0584 return rv ? rv : len;
0585 }
0586
0587 #define GDLM_ATTR(_name,_mode,_show,_store) \
0588 static struct gfs2_attr gdlm_attr_##_name = __ATTR(_name,_mode,_show,_store)
0589
0590 GDLM_ATTR(proto_name, 0444, proto_name_show, NULL);
0591 GDLM_ATTR(block, 0644, block_show, block_store);
0592 GDLM_ATTR(withdraw, 0644, wdack_show, wdack_store);
0593 GDLM_ATTR(jid, 0644, jid_show, jid_store);
0594 GDLM_ATTR(first, 0644, lkfirst_show, lkfirst_store);
0595 GDLM_ATTR(first_done, 0444, first_done_show, NULL);
0596 GDLM_ATTR(recover, 0600, NULL, recover_store);
0597 GDLM_ATTR(recover_done, 0444, recover_done_show, NULL);
0598 GDLM_ATTR(recover_status, 0444, recover_status_show, NULL);
0599
0600 static struct attribute *lock_module_attrs[] = {
0601 &gdlm_attr_proto_name.attr,
0602 &gdlm_attr_block.attr,
0603 &gdlm_attr_withdraw.attr,
0604 &gdlm_attr_jid.attr,
0605 &gdlm_attr_first.attr,
0606 &gdlm_attr_first_done.attr,
0607 &gdlm_attr_recover.attr,
0608 &gdlm_attr_recover_done.attr,
0609 &gdlm_attr_recover_status.attr,
0610 NULL,
0611 };
0612
0613
0614
0615
0616
0617 static ssize_t quota_scale_show(struct gfs2_sbd *sdp, char *buf)
0618 {
0619 return snprintf(buf, PAGE_SIZE, "%u %u\n",
0620 sdp->sd_tune.gt_quota_scale_num,
0621 sdp->sd_tune.gt_quota_scale_den);
0622 }
0623
0624 static ssize_t quota_scale_store(struct gfs2_sbd *sdp, const char *buf,
0625 size_t len)
0626 {
0627 struct gfs2_tune *gt = &sdp->sd_tune;
0628 unsigned int x, y;
0629
0630 if (!capable(CAP_SYS_ADMIN))
0631 return -EPERM;
0632
0633 if (sscanf(buf, "%u %u", &x, &y) != 2 || !y)
0634 return -EINVAL;
0635
0636 spin_lock(>->gt_spin);
0637 gt->gt_quota_scale_num = x;
0638 gt->gt_quota_scale_den = y;
0639 spin_unlock(>->gt_spin);
0640 return len;
0641 }
0642
0643 static ssize_t tune_set(struct gfs2_sbd *sdp, unsigned int *field,
0644 int check_zero, const char *buf, size_t len)
0645 {
0646 struct gfs2_tune *gt = &sdp->sd_tune;
0647 unsigned int x;
0648 int error;
0649
0650 if (!capable(CAP_SYS_ADMIN))
0651 return -EPERM;
0652
0653 error = kstrtouint(buf, 0, &x);
0654 if (error)
0655 return error;
0656
0657 if (check_zero && !x)
0658 return -EINVAL;
0659
0660 spin_lock(>->gt_spin);
0661 *field = x;
0662 spin_unlock(>->gt_spin);
0663 return len;
0664 }
0665
0666 #define TUNE_ATTR_3(name, show, store) \
0667 static struct gfs2_attr tune_attr_##name = __ATTR(name, 0644, show, store)
0668
0669 #define TUNE_ATTR_2(name, store) \
0670 static ssize_t name##_show(struct gfs2_sbd *sdp, char *buf) \
0671 { \
0672 return snprintf(buf, PAGE_SIZE, "%u\n", sdp->sd_tune.gt_##name); \
0673 } \
0674 TUNE_ATTR_3(name, name##_show, store)
0675
0676 #define TUNE_ATTR(name, check_zero) \
0677 static ssize_t name##_store(struct gfs2_sbd *sdp, const char *buf, size_t len)\
0678 { \
0679 return tune_set(sdp, &sdp->sd_tune.gt_##name, check_zero, buf, len); \
0680 } \
0681 TUNE_ATTR_2(name, name##_store)
0682
0683 TUNE_ATTR(quota_warn_period, 0);
0684 TUNE_ATTR(quota_quantum, 0);
0685 TUNE_ATTR(max_readahead, 0);
0686 TUNE_ATTR(complain_secs, 0);
0687 TUNE_ATTR(statfs_slow, 0);
0688 TUNE_ATTR(new_files_jdata, 0);
0689 TUNE_ATTR(statfs_quantum, 1);
0690 TUNE_ATTR_3(quota_scale, quota_scale_show, quota_scale_store);
0691
0692 static struct attribute *tune_attrs[] = {
0693 &tune_attr_quota_warn_period.attr,
0694 &tune_attr_quota_quantum.attr,
0695 &tune_attr_max_readahead.attr,
0696 &tune_attr_complain_secs.attr,
0697 &tune_attr_statfs_slow.attr,
0698 &tune_attr_statfs_quantum.attr,
0699 &tune_attr_quota_scale.attr,
0700 &tune_attr_new_files_jdata.attr,
0701 NULL,
0702 };
0703
0704 static const struct attribute_group tune_group = {
0705 .name = "tune",
0706 .attrs = tune_attrs,
0707 };
0708
0709 static const struct attribute_group lock_module_group = {
0710 .name = "lock_module",
0711 .attrs = lock_module_attrs,
0712 };
0713
0714 int gfs2_sys_fs_add(struct gfs2_sbd *sdp)
0715 {
0716 struct super_block *sb = sdp->sd_vfs;
0717 int error;
0718 char ro[20];
0719 char spectator[20];
0720 char *envp[] = { ro, spectator, NULL };
0721
0722 sprintf(ro, "RDONLY=%d", sb_rdonly(sb));
0723 sprintf(spectator, "SPECTATOR=%d", sdp->sd_args.ar_spectator ? 1 : 0);
0724
0725 init_completion(&sdp->sd_kobj_unregister);
0726 sdp->sd_kobj.kset = gfs2_kset;
0727 error = kobject_init_and_add(&sdp->sd_kobj, &gfs2_ktype, NULL,
0728 "%s", sdp->sd_table_name);
0729 if (error)
0730 goto fail_reg;
0731
0732 error = sysfs_create_group(&sdp->sd_kobj, &tune_group);
0733 if (error)
0734 goto fail_reg;
0735
0736 error = sysfs_create_group(&sdp->sd_kobj, &lock_module_group);
0737 if (error)
0738 goto fail_tune;
0739
0740 error = sysfs_create_link(&sdp->sd_kobj,
0741 &disk_to_dev(sb->s_bdev->bd_disk)->kobj,
0742 "device");
0743 if (error)
0744 goto fail_lock_module;
0745
0746 kobject_uevent_env(&sdp->sd_kobj, KOBJ_ADD, envp);
0747 return 0;
0748
0749 fail_lock_module:
0750 sysfs_remove_group(&sdp->sd_kobj, &lock_module_group);
0751 fail_tune:
0752 sysfs_remove_group(&sdp->sd_kobj, &tune_group);
0753 fail_reg:
0754 fs_err(sdp, "error %d adding sysfs files\n", error);
0755 kobject_put(&sdp->sd_kobj);
0756 wait_for_completion(&sdp->sd_kobj_unregister);
0757 sb->s_fs_info = NULL;
0758 return error;
0759 }
0760
0761 void gfs2_sys_fs_del(struct gfs2_sbd *sdp)
0762 {
0763 sysfs_remove_link(&sdp->sd_kobj, "device");
0764 sysfs_remove_group(&sdp->sd_kobj, &tune_group);
0765 sysfs_remove_group(&sdp->sd_kobj, &lock_module_group);
0766 kobject_put(&sdp->sd_kobj);
0767 wait_for_completion(&sdp->sd_kobj_unregister);
0768 }
0769
0770 static int gfs2_uevent(struct kobject *kobj, struct kobj_uevent_env *env)
0771 {
0772 struct gfs2_sbd *sdp = container_of(kobj, struct gfs2_sbd, sd_kobj);
0773 struct super_block *s = sdp->sd_vfs;
0774
0775 add_uevent_var(env, "LOCKTABLE=%s", sdp->sd_table_name);
0776 add_uevent_var(env, "LOCKPROTO=%s", sdp->sd_proto_name);
0777 if (!test_bit(SDF_NOJOURNALID, &sdp->sd_flags))
0778 add_uevent_var(env, "JOURNALID=%d", sdp->sd_lockstruct.ls_jid);
0779 if (!uuid_is_null(&s->s_uuid))
0780 add_uevent_var(env, "UUID=%pUB", &s->s_uuid);
0781 return 0;
0782 }
0783
0784 static const struct kset_uevent_ops gfs2_uevent_ops = {
0785 .uevent = gfs2_uevent,
0786 };
0787
0788 int gfs2_sys_init(void)
0789 {
0790 gfs2_kset = kset_create_and_add("gfs2", &gfs2_uevent_ops, fs_kobj);
0791 if (!gfs2_kset)
0792 return -ENOMEM;
0793 return 0;
0794 }
0795
0796 void gfs2_sys_uninit(void)
0797 {
0798 kset_unregister(gfs2_kset);
0799 }
0800