Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  * Copyright (C) Sistina Software, Inc.  1997-2003 All rights reserved.
0004  * Copyright (C) 2004-2006 Red Hat, Inc.  All rights reserved.
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  * lock_module. Originally from lock_dlm
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     /* Wait for our primary journal to be initialized */
0494     wait_for_completion(&sdp->sd_journal_ready);
0495 
0496     spin_lock(&sdp->sd_jindex_spin);
0497     rv = -EBUSY;
0498     /**
0499      * If we're a spectator, we use journal0, but it's not really ours.
0500      * So we need to wait for its recovery too. If we skip it we'd never
0501      * queue work to the recovery workqueue, and so its completion would
0502      * never clear the DFL_BLOCK_LOCKS flag, so all our locks would
0503      * permanently stop working.
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  * get and set struct gfs2_tune fields
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->gt_spin);
0637     gt->gt_quota_scale_num = x;
0638     gt->gt_quota_scale_den = y;
0639     spin_unlock(&gt->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->gt_spin);
0661     *field = x;
0662     spin_unlock(&gt->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