From: Jeff Mahoney <jeffm@suse.com>
Subject: ocfs2: Fixup orphan scan cleanup after failed mount


 If the mount fails for any reason, ocfs2_dismount_volume calls
 ocfs2_orphan_scan_stop. It requires that ocfs2_orphan_scan_init
 be called to setup the mutex and work queues, but that doesn't
 happen if the mount has failed and we oops accessing an uninitialized
 work queue.

 This patch splits the init and startup of the orphan scan, eliminating
 the oops.

Signed-off-by: Jeff Mahoney <jeffm@suse.com>
---
 fs/ocfs2/journal.c |    8 +++++++-
 fs/ocfs2/journal.h |    1 +
 fs/ocfs2/super.c   |    4 +++-
 3 files changed, 11 insertions(+), 2 deletions(-)

--- a/fs/ocfs2/journal.c
+++ b/fs/ocfs2/journal.c
@@ -1954,10 +1954,16 @@ void ocfs2_orphan_scan_init(struct ocfs2
 	os->os_osb = osb;
 	os->os_count = 0;
 	os->os_seqno = 0;
-	os->os_scantime = CURRENT_TIME;
 	mutex_init(&os->os_lock);
 	INIT_DELAYED_WORK(&os->os_orphan_scan_work, ocfs2_orphan_scan_work);
+}
+
+void ocfs2_orphan_scan_start(struct ocfs2_super *osb)
+{
+	struct ocfs2_orphan_scan *os;
 
+	os = &osb->osb_orphan_scan;
+	os->os_scantime = CURRENT_TIME;
 	if (ocfs2_is_hard_readonly(osb) || ocfs2_mount_local(osb))
 		atomic_set(&os->os_state, ORPHAN_SCAN_INACTIVE);
 	else {
--- a/fs/ocfs2/journal.h
+++ b/fs/ocfs2/journal.h
@@ -145,6 +145,7 @@ static inline void ocfs2_inode_set_new(s
 
 /* Exported only for the journal struct init code in super.c. Do not call. */
 void ocfs2_orphan_scan_init(struct ocfs2_super *osb);
+void ocfs2_orphan_scan_start(struct ocfs2_super *osb);
 void ocfs2_orphan_scan_stop(struct ocfs2_super *osb);
 void ocfs2_orphan_scan_exit(struct ocfs2_super *osb);
 
--- a/fs/ocfs2/super.c
+++ b/fs/ocfs2/super.c
@@ -1182,7 +1182,7 @@ static int ocfs2_fill_super(struct super
 	wake_up(&osb->osb_mount_event);
 
 	/* Start this when the mount is almost sure of being successful */
-	ocfs2_orphan_scan_init(osb);
+	ocfs2_orphan_scan_start(osb);
 
 	mlog_exit(status);
 	return status;
@@ -2194,6 +2194,8 @@ static int ocfs2_initialize_super(struct
 		goto bail;
 	}
 
+	ocfs2_orphan_scan_init(osb);
+
 bail:
 	mlog_exit(status);
 	return status;
