hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/fs/gfs2/sys.c
....@@ -1,10 +1,7 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
34 * Copyright (C) 2004-2006 Red Hat, Inc. All rights reserved.
4
- *
5
- * This copyrighted material is made available to anyone wishing to use,
6
- * modify, copy, or redistribute it subject to the terms and conditions
7
- * of the GNU General Public License version 2.
85 */
96
107 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
....@@ -121,7 +118,7 @@
121118
122119 static ssize_t withdraw_show(struct gfs2_sbd *sdp, char *buf)
123120 {
124
- unsigned int b = test_bit(SDF_SHUTDOWN, &sdp->sd_flags);
121
+ unsigned int b = gfs2_withdrawn(sdp);
125122 return snprintf(buf, PAGE_SIZE, "%u\n", b);
126123 }
127124
....@@ -139,7 +136,8 @@
139136 if (val != 1)
140137 return -EINVAL;
141138
142
- gfs2_lm_withdraw(sdp, "withdrawing from cluster at user's request\n");
139
+ gfs2_lm(sdp, "withdrawing from cluster at user's request\n");
140
+ gfs2_withdraw(sdp);
143141
144142 return len;
145143 }
....@@ -299,17 +297,18 @@
299297 &gfs2_attr_demote_rq.attr,
300298 NULL,
301299 };
300
+ATTRIBUTE_GROUPS(gfs2);
302301
303302 static void gfs2_sbd_release(struct kobject *kobj)
304303 {
305304 struct gfs2_sbd *sdp = container_of(kobj, struct gfs2_sbd, sd_kobj);
306305
307
- kfree(sdp);
306
+ complete(&sdp->sd_kobj_unregister);
308307 }
309308
310309 static struct kobj_type gfs2_ktype = {
311310 .release = gfs2_sbd_release,
312
- .default_attrs = gfs2_attrs,
311
+ .default_groups = gfs2_groups,
313312 .sysfs_ops = &gfs2_attr_ops,
314313 };
315314
....@@ -436,6 +435,8 @@
436435 * never clear the DFL_BLOCK_LOCKS flag, so all our locks would
437436 * permanently stop working.
438437 */
438
+ if (!sdp->sd_jdesc)
439
+ goto out;
439440 if (sdp->sd_jdesc->jd_jid == jid && !sdp->sd_args.ar_spectator)
440441 goto out;
441442 rv = -ENOENT;
....@@ -650,19 +651,17 @@
650651 char ro[20];
651652 char spectator[20];
652653 char *envp[] = { ro, spectator, NULL };
653
- int sysfs_frees_sdp = 0;
654654
655655 sprintf(ro, "RDONLY=%d", sb_rdonly(sb));
656656 sprintf(spectator, "SPECTATOR=%d", sdp->sd_args.ar_spectator ? 1 : 0);
657657
658
+ init_completion(&sdp->sd_kobj_unregister);
658659 sdp->sd_kobj.kset = gfs2_kset;
659660 error = kobject_init_and_add(&sdp->sd_kobj, &gfs2_ktype, NULL,
660661 "%s", sdp->sd_table_name);
661662 if (error)
662663 goto fail_reg;
663664
664
- sysfs_frees_sdp = 1; /* Freeing sdp is now done by sysfs calling
665
- function gfs2_sbd_release. */
666665 error = sysfs_create_group(&sdp->sd_kobj, &tune_group);
667666 if (error)
668667 goto fail_reg;
....@@ -685,12 +684,9 @@
685684 fail_tune:
686685 sysfs_remove_group(&sdp->sd_kobj, &tune_group);
687686 fail_reg:
688
- free_percpu(sdp->sd_lkstats);
689687 fs_err(sdp, "error %d adding sysfs files\n", error);
690
- if (sysfs_frees_sdp)
691
- kobject_put(&sdp->sd_kobj);
692
- else
693
- kfree(sdp);
688
+ kobject_put(&sdp->sd_kobj);
689
+ wait_for_completion(&sdp->sd_kobj_unregister);
694690 sb->s_fs_info = NULL;
695691 return error;
696692 }
....@@ -701,6 +697,7 @@
701697 sysfs_remove_group(&sdp->sd_kobj, &tune_group);
702698 sysfs_remove_group(&sdp->sd_kobj, &lock_module_group);
703699 kobject_put(&sdp->sd_kobj);
700
+ wait_for_completion(&sdp->sd_kobj_unregister);
704701 }
705702
706703 static int gfs2_uevent(struct kset *kset, struct kobject *kobj,