]> Git Repo - linux.git/blame - fs/gfs2/main.c
Linux 6.14-rc3
[linux.git] / fs / gfs2 / main.c
CommitLineData
7336d0e6 1// SPDX-License-Identifier: GPL-2.0-only
b3b94faa
DT
2/*
3 * Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
3a8a9a10 4 * Copyright (C) 2004-2006 Red Hat, Inc. All rights reserved.
b3b94faa
DT
5 */
6
d77d1b58
JP
7#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
8
b3b94faa
DT
9#include <linux/slab.h>
10#include <linux/spinlock.h>
11#include <linux/completion.h>
12#include <linux/buffer_head.h>
13#include <linux/module.h>
14#include <linux/init.h>
5c676f6d 15#include <linux/gfs2_ondisk.h>
bc015cb8
SW
16#include <linux/rcupdate.h>
17#include <linux/rculist_bl.h>
60063497 18#include <linux/atomic.h>
75ca61c1 19#include <linux/mempool.h>
b3b94faa
DT
20
21#include "gfs2.h"
5c676f6d 22#include "incore.h"
b2760583 23#include "super.h"
b3b94faa 24#include "sys.h"
5c676f6d 25#include "util.h"
85d1da67 26#include "glock.h"
0a7ab79c 27#include "quota.h"
6ecd7c2d 28#include "recovery.h"
8d123585 29#include "dir.h"
2e60d768 30#include "glops.h"
0a7ab79c 31
e0c2a9aa
DT
32struct workqueue_struct *gfs2_control_wq;
33
51cc5068 34static void gfs2_init_inode_once(void *foo)
320dd101
SW
35{
36 struct gfs2_inode *ip = foo;
a35afb83
CL
37
38 inode_init_once(&ip->i_inode);
21f09c43 39 atomic_set(&ip->i_sizehint, 0);
a35afb83 40 init_rwsem(&ip->i_rw_mutex);
7542486b 41 INIT_LIST_HEAD(&ip->i_ordered);
b54e9a0b 42 ip->i_qadata = NULL;
21f09c43 43 gfs2_holder_mark_uninitialized(&ip->i_rgd_gh);
a097dc7e
BP
44 memset(&ip->i_res, 0, sizeof(ip->i_res));
45 RB_CLEAR_NODE(&ip->i_res.rs_node);
17d539f0 46 ip->i_hash_cache = NULL;
6df9f9a2 47 gfs2_holder_mark_uninitialized(&ip->i_iopen_gh);
320dd101
SW
48}
49
51cc5068 50static void gfs2_init_glock_once(void *foo)
ec45d9f5
SW
51{
52 struct gfs2_glock *gl = foo;
a35afb83 53
a35afb83 54 INIT_LIST_HEAD(&gl->gl_holders);
97cc1025 55 INIT_LIST_HEAD(&gl->gl_lru);
a35afb83
CL
56 INIT_LIST_HEAD(&gl->gl_ail_list);
57 atomic_set(&gl->gl_ail_count, 0);
638803d4 58 atomic_set(&gl->gl_revokes, 0);
ec45d9f5
SW
59}
60
009d8518
SW
61static void gfs2_init_gl_aspace_once(void *foo)
62{
11d8b79e 63 struct gfs2_glock_aspace *gla = foo;
009d8518 64
11d8b79e
KC
65 gfs2_init_glock_once(&gla->glock);
66 address_space_init_once(&gla->mapping);
009d8518
SW
67}
68
b3b94faa
DT
69/**
70 * init_gfs2_fs - Register GFS2 as a filesystem
71 *
72 * Returns: 0 on success, error code on failure
73 */
74
75static int __init init_gfs2_fs(void)
76{
77 int error;
78
8d123585
SW
79 gfs2_str2qstr(&gfs2_qdot, ".");
80 gfs2_str2qstr(&gfs2_qdotdot, "..");
c754fbbb 81 gfs2_quota_hash_init();
8d123585 82
b3b94faa
DT
83 error = gfs2_sys_init();
84 if (error)
85 return error;
86
2147dbfd
SW
87 error = list_lru_init(&gfs2_qd_lru);
88 if (error)
89 goto fail_lru;
90
85d1da67
SW
91 error = gfs2_glock_init();
92 if (error)
8b0d7f56 93 goto fail_glock;
b3b94faa 94
85d1da67 95 error = -ENOMEM;
b3b94faa
DT
96 gfs2_glock_cachep = kmem_cache_create("gfs2_glock",
97 sizeof(struct gfs2_glock),
00e8e9bc 98 0, SLAB_RECLAIM_ACCOUNT,
20c2df83 99 gfs2_init_glock_once);
b3b94faa 100 if (!gfs2_glock_cachep)
8b0d7f56 101 goto fail_cachep1;
b3b94faa 102
7c9a84a5 103 gfs2_glock_aspace_cachep = kmem_cache_create("gfs2_glock(aspace)",
11d8b79e 104 sizeof(struct gfs2_glock_aspace),
009d8518
SW
105 0, 0, gfs2_init_gl_aspace_once);
106
107 if (!gfs2_glock_aspace_cachep)
8b0d7f56 108 goto fail_cachep2;
009d8518 109
b3b94faa
DT
110 gfs2_inode_cachep = kmem_cache_create("gfs2_inode",
111 sizeof(struct gfs2_inode),
eb1dc33a 112 0, SLAB_RECLAIM_ACCOUNT|
5d097056 113 SLAB_ACCOUNT,
20c2df83 114 gfs2_init_inode_once);
b3b94faa 115 if (!gfs2_inode_cachep)
8b0d7f56 116 goto fail_cachep3;
b3b94faa
DT
117
118 gfs2_bufdata_cachep = kmem_cache_create("gfs2_bufdata",
119 sizeof(struct gfs2_bufdata),
20c2df83 120 0, 0, NULL);
b3b94faa 121 if (!gfs2_bufdata_cachep)
8b0d7f56 122 goto fail_cachep4;
b3b94faa 123
6bdd9be6
BP
124 gfs2_rgrpd_cachep = kmem_cache_create("gfs2_rgrpd",
125 sizeof(struct gfs2_rgrpd),
126 0, 0, NULL);
127 if (!gfs2_rgrpd_cachep)
8b0d7f56 128 goto fail_cachep5;
6bdd9be6 129
37b2c837
SW
130 gfs2_quotad_cachep = kmem_cache_create("gfs2_quotad",
131 sizeof(struct gfs2_quota_data),
00e8e9bc 132 0, SLAB_RECLAIM_ACCOUNT, NULL);
37b2c837 133 if (!gfs2_quotad_cachep)
8b0d7f56 134 goto fail_cachep6;
37b2c837 135
b54e9a0b
BP
136 gfs2_qadata_cachep = kmem_cache_create("gfs2_qadata",
137 sizeof(struct gfs2_qadata),
138 0, 0, NULL);
139 if (!gfs2_qadata_cachep)
8b0d7f56 140 goto fail_cachep7;
b54e9a0b 141
b839dada
BP
142 gfs2_trans_cachep = kmem_cache_create("gfs2_trans",
143 sizeof(struct gfs2_trans),
144 0, 0, NULL);
145 if (!gfs2_trans_cachep)
146 goto fail_cachep8;
147
8ee0fd9c 148 error = gfs2_qd_shrinker_init();
e0d735c1 149 if (error)
8b0d7f56 150 goto fail_shrinker;
0a7ab79c 151
6ecd7c2d 152 error = -ENOMEM;
5c0dc371 153 gfs2_recovery_wq = alloc_workqueue("gfs2_recovery",
58a69cb4 154 WQ_MEM_RECLAIM | WQ_FREEZABLE, 0);
5c0dc371 155 if (!gfs2_recovery_wq)
8b0d7f56 156 goto fail_wq1;
fe64d517 157
e0c2a9aa 158 gfs2_control_wq = alloc_workqueue("gfs2_control",
d08fa65a 159 WQ_UNBOUND | WQ_FREEZABLE, 0);
e0c2a9aa 160 if (!gfs2_control_wq)
8b0d7f56 161 goto fail_wq2;
75ca61c1 162
ab8eecf5 163 gfs2_freeze_wq = alloc_workqueue("gfs2_freeze", 0, 0);
2e60d768
BM
164
165 if (!gfs2_freeze_wq)
8b0d7f56 166 goto fail_wq3;
2e60d768 167
e8c92ed7
SW
168 gfs2_page_pool = mempool_create_page_pool(64, 0);
169 if (!gfs2_page_pool)
8b0d7f56 170 goto fail_mempool;
e0c2a9aa 171
2abbf9a4 172 gfs2_register_debugfs();
74b1b10e
BP
173 error = register_filesystem(&gfs2_fs_type);
174 if (error)
175 goto fail_fs1;
176
177 error = register_filesystem(&gfs2meta_fs_type);
178 if (error)
179 goto fail_fs2;
180
7c52b166 181
fc554ed3 182 pr_info("GFS2 installed\n");
b3b94faa
DT
183
184 return 0;
185
74b1b10e
BP
186fail_fs2:
187 unregister_filesystem(&gfs2_fs_type);
188fail_fs1:
189 mempool_destroy(gfs2_page_pool);
8b0d7f56 190fail_mempool:
2e60d768 191 destroy_workqueue(gfs2_freeze_wq);
8b0d7f56 192fail_wq3:
75ca61c1 193 destroy_workqueue(gfs2_control_wq);
8b0d7f56 194fail_wq2:
5c0dc371 195 destroy_workqueue(gfs2_recovery_wq);
8b0d7f56 196fail_wq1:
8ee0fd9c 197 gfs2_qd_shrinker_exit();
8b0d7f56 198fail_shrinker:
b839dada
BP
199 kmem_cache_destroy(gfs2_trans_cachep);
200fail_cachep8:
8b0d7f56
TH
201 kmem_cache_destroy(gfs2_qadata_cachep);
202fail_cachep7:
203 kmem_cache_destroy(gfs2_quotad_cachep);
204fail_cachep6:
205 kmem_cache_destroy(gfs2_rgrpd_cachep);
206fail_cachep5:
207 kmem_cache_destroy(gfs2_bufdata_cachep);
208fail_cachep4:
209 kmem_cache_destroy(gfs2_inode_cachep);
210fail_cachep3:
211 kmem_cache_destroy(gfs2_glock_aspace_cachep);
212fail_cachep2:
213 kmem_cache_destroy(gfs2_glock_cachep);
214fail_cachep1:
8fbbfd21 215 gfs2_glock_exit();
8b0d7f56
TH
216fail_glock:
217 list_lru_destroy(&gfs2_qd_lru);
218fail_lru:
b3b94faa
DT
219 gfs2_sys_uninit();
220 return error;
221}
222
223/**
224 * exit_gfs2_fs - Unregister the file system
225 *
226 */
227
228static void __exit exit_gfs2_fs(void)
229{
8ee0fd9c 230 gfs2_qd_shrinker_exit();
8fbbfd21 231 gfs2_glock_exit();
7c52b166 232 gfs2_unregister_debugfs();
b3b94faa 233 unregister_filesystem(&gfs2_fs_type);
419c93e0 234 unregister_filesystem(&gfs2meta_fs_type);
5c0dc371 235 destroy_workqueue(gfs2_recovery_wq);
e0c2a9aa 236 destroy_workqueue(gfs2_control_wq);
2e60d768 237 destroy_workqueue(gfs2_freeze_wq);
2147dbfd 238 list_lru_destroy(&gfs2_qd_lru);
b3b94faa 239
bc015cb8
SW
240 rcu_barrier();
241
e8c92ed7 242 mempool_destroy(gfs2_page_pool);
b839dada 243 kmem_cache_destroy(gfs2_trans_cachep);
b54e9a0b 244 kmem_cache_destroy(gfs2_qadata_cachep);
37b2c837 245 kmem_cache_destroy(gfs2_quotad_cachep);
6bdd9be6 246 kmem_cache_destroy(gfs2_rgrpd_cachep);
b3b94faa
DT
247 kmem_cache_destroy(gfs2_bufdata_cachep);
248 kmem_cache_destroy(gfs2_inode_cachep);
009d8518 249 kmem_cache_destroy(gfs2_glock_aspace_cachep);
b3b94faa
DT
250 kmem_cache_destroy(gfs2_glock_cachep);
251
252 gfs2_sys_uninit();
253}
254
255MODULE_DESCRIPTION("Global File System");
256MODULE_AUTHOR("Red Hat, Inc.");
257MODULE_LICENSE("GPL");
258
259module_init(init_gfs2_fs);
260module_exit(exit_gfs2_fs);
261
This page took 1.114235 seconds and 4 git commands to generate.