|
@@ -80,12 +80,6 @@ static struct kmem_cache *ocfs2_inode_cachep;
|
|
|
struct kmem_cache *ocfs2_dquot_cachep;
|
|
|
struct kmem_cache *ocfs2_qf_chunk_cachep;
|
|
|
|
|
|
-/* OCFS2 needs to schedule several different types of work which
|
|
|
- * require cluster locking, disk I/O, recovery waits, etc. Since these
|
|
|
- * types of work tend to be heavy we avoid using the kernel events
|
|
|
- * workqueue and schedule on our own. */
|
|
|
-struct workqueue_struct *ocfs2_wq = NULL;
|
|
|
-
|
|
|
static struct dentry *ocfs2_debugfs_root;
|
|
|
|
|
|
MODULE_AUTHOR("Oracle");
|
|
@@ -1613,33 +1607,25 @@ static int __init ocfs2_init(void)
|
|
|
if (status < 0)
|
|
|
goto out2;
|
|
|
|
|
|
- ocfs2_wq = create_singlethread_workqueue("ocfs2_wq");
|
|
|
- if (!ocfs2_wq) {
|
|
|
- status = -ENOMEM;
|
|
|
- goto out3;
|
|
|
- }
|
|
|
-
|
|
|
ocfs2_debugfs_root = debugfs_create_dir("ocfs2", NULL);
|
|
|
if (!ocfs2_debugfs_root) {
|
|
|
status = -ENOMEM;
|
|
|
mlog(ML_ERROR, "Unable to create ocfs2 debugfs root.\n");
|
|
|
- goto out4;
|
|
|
+ goto out3;
|
|
|
}
|
|
|
|
|
|
ocfs2_set_locking_protocol();
|
|
|
|
|
|
status = register_quota_format(&ocfs2_quota_format);
|
|
|
if (status < 0)
|
|
|
- goto out4;
|
|
|
+ goto out3;
|
|
|
status = register_filesystem(&ocfs2_fs_type);
|
|
|
if (!status)
|
|
|
return 0;
|
|
|
|
|
|
unregister_quota_format(&ocfs2_quota_format);
|
|
|
-out4:
|
|
|
- destroy_workqueue(ocfs2_wq);
|
|
|
- debugfs_remove(ocfs2_debugfs_root);
|
|
|
out3:
|
|
|
+ debugfs_remove(ocfs2_debugfs_root);
|
|
|
ocfs2_free_mem_caches();
|
|
|
out2:
|
|
|
exit_ocfs2_uptodate_cache();
|
|
@@ -1650,11 +1636,6 @@ out1:
|
|
|
|
|
|
static void __exit ocfs2_exit(void)
|
|
|
{
|
|
|
- if (ocfs2_wq) {
|
|
|
- flush_workqueue(ocfs2_wq);
|
|
|
- destroy_workqueue(ocfs2_wq);
|
|
|
- }
|
|
|
-
|
|
|
unregister_quota_format(&ocfs2_quota_format);
|
|
|
|
|
|
debugfs_remove(ocfs2_debugfs_root);
|
|
@@ -2349,6 +2330,12 @@ static int ocfs2_initialize_super(struct super_block *sb,
|
|
|
}
|
|
|
cleancache_init_shared_fs(sb);
|
|
|
|
|
|
+ osb->ocfs2_wq = create_singlethread_workqueue("ocfs2_wq");
|
|
|
+ if (!osb->ocfs2_wq) {
|
|
|
+ status = -ENOMEM;
|
|
|
+ mlog_errno(status);
|
|
|
+ }
|
|
|
+
|
|
|
bail:
|
|
|
return status;
|
|
|
}
|
|
@@ -2536,6 +2523,12 @@ static void ocfs2_delete_osb(struct ocfs2_super *osb)
|
|
|
{
|
|
|
/* This function assumes that the caller has the main osb resource */
|
|
|
|
|
|
+ /* ocfs2_initializer_super have already created this workqueue */
|
|
|
+ if (osb->ocfs2_wq) {
|
|
|
+ flush_workqueue(osb->ocfs2_wq);
|
|
|
+ destroy_workqueue(osb->ocfs2_wq);
|
|
|
+ }
|
|
|
+
|
|
|
ocfs2_free_slot_info(osb);
|
|
|
|
|
|
kfree(osb->osb_orphan_wipes);
|