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