xfs: stop the sync worker before xfs_unmountfs

Ben Myers bpm at sgi.com
Wed Sep 12 13:33:47 CDT 2012


See what you think of this.  Not heavily tested yet, and not pretty... but it
is fairly minimal. 

Pull startup and shutdown of the sync worker out of xfs_syncd_init and
xfs_syncd_stop into their callers.  In the case of unmount, move shutdown of
the xfs_sync_worker before teardown of the log in xfs_unmountfs.  This prevents
occasional crashes on unmount like so:

PID: 21602  TASK: ee9df060  CPU: 0   COMMAND: "kworker/0:3"                                                                                                                               
 #0 [c5377d28] crash_kexec at c0292c94                                                                                                                                                    
 #1 [c5377d80] oops_end at c07090c2                                                                                                                                                       
 #2 [c5377d98] no_context at c06f614e                                                                                                                                                     
 #3 [c5377dbc] __bad_area_nosemaphore at c06f6281                                                                                                                                         
 #4 [c5377df4] bad_area_nosemaphore at c06f629b                                                                                                                                           
 #5 [c5377e00] do_page_fault at c070b0cb                                                                                                                                                  
 #6 [c5377e7c] error_code (via page_fault) at c070892c                                                                                                                                    
    EAX: f300c6a8  EBX: f300c6a8  ECX: 000000c0  EDX: 000000c0  EBP: c5377ed0                                                                                                             
    DS:  007b      ESI: 00000000  ES:  007b      EDI: 00000001  GS:  ffffad20                                                                                                             
    CS:  0060      EIP: c0481ad0  ERR: ffffffff  EFLAGS: 00010246                                                                                                                         
 #7 [c5377eb0] atomic64_read_cx8 at c0481ad0                                                                                                                                              
 #8 [c5377ebc] xlog_assign_tail_lsn_locked at f7cc7c6e [xfs]                                                                                                                              
 #9 [c5377ed4] xfs_trans_ail_delete_bulk at f7ccd520 [xfs]                                                                                                                                
#10 [c5377f0c] xfs_buf_iodone at f7ccb602 [xfs]                                                                                                                                           
#11 [c5377f24] xfs_buf_do_callbacks at f7cca524 [xfs]                                                                                                                                     
#12 [c5377f30] xfs_buf_iodone_callbacks at f7cca5da [xfs]                                                                                                                                 
#13 [c5377f4c] xfs_buf_iodone_work at f7c718d0 [xfs]                                                                                                                                      
#14 [c5377f58] process_one_work at c024ee4c                                                                                                                                               
#15 [c5377f98] worker_thread at c024f43d                                                                                                                                                  
#16 [c5377fbc] kthread at c025326b                                                                                                                                                        
#17 [c5377fe8] kernel_thread_helper at c070e834                                                                                                                                           
                                                                                                                                                                                          
PID: 26653  TASK: e79143b0  CPU: 3   COMMAND: "umount"                                                                                                                                    
 #0 [cde0fda0] __schedule at c0706595                                                                                                                                                     
 #1 [cde0fe28] schedule at c0706b89                                                                                                                                                       
 #2 [cde0fe30] schedule_timeout at c0705600                                                                                                                                               
 #3 [cde0fe94] __down_common at c0706098                                                                                                                                                  
 #4 [cde0fec8] __down at c0706122                                                                                                                                                         
 #5 [cde0fed0] down at c025936f                                                                                                                                                           
 #6 [cde0fee0] xfs_buf_lock at f7c7131d [xfs]                                                                                                                                             
 #7 [cde0ff00] xfs_freesb at f7cc2236 [xfs]                                                                                                                                               
 #8 [cde0ff10] xfs_fs_put_super at f7c80f21 [xfs]                                                                                                                                         
 #9 [cde0ff1c] generic_shutdown_super at c0333d7a                                                                                                                                         
#10 [cde0ff38] kill_block_super at c0333e0f                                                                                                                                               
#11 [cde0ff48] deactivate_locked_super at c0334218                                                                                                                                        
#12 [cde0ff58] deactivate_super at c033495d                                                                                                                                               
#13 [cde0ff68] mntput_no_expire at c034bc13                                                                                                                                               
#14 [cde0ff7c] sys_umount at c034cc69                                                                                                                                                     
#15 [cde0ffa0] sys_oldumount at c034ccd4                                                                                                                                                  
#16 [cde0ffb0] system_call at c0707e66 

Signed-off-by: Ben Myers <bpm at sgi.com>

Index: xfs/fs/xfs/xfs_super.c
===================================================================
--- xfs.orig/fs/xfs/xfs_super.c
+++ xfs/fs/xfs/xfs_super.c
@@ -919,6 +919,7 @@ xfs_fs_put_super(
 	struct xfs_mount	*mp = XFS_M(sb);
 
 	xfs_filestream_unmount(mp);
+	cancel_delayed_work_sync(&mp->m_sync_work);
 	xfs_unmountfs(mp);
 	xfs_syncd_stop(mp);
 	xfs_freesb(mp);
@@ -1210,6 +1211,9 @@ xfs_finish_flags(
 	return 0;
 }
 
+extern void xfs_sync_worker(struct work_struct *);
+extern void xfs_syncd_queue_sync(struct xfs_mount *);
+
 STATIC int
 xfs_fs_fill_super(
 	struct super_block	*sb,
@@ -1291,6 +1295,8 @@ xfs_fs_fill_super(
 	set_posix_acl_flag(sb);
 
 	error = xfs_syncd_init(mp);
+	INIT_DELAYED_WORK(&mp->m_sync_work, xfs_sync_worker);
+	xfs_syncd_queue_sync(mp);
 	if (error)
 		goto out_filestream_unmount;
 
@@ -1315,6 +1321,7 @@ xfs_fs_fill_super(
 
 	return 0;
  out_syncd_stop:
+	cancel_delayed_work_sync(&mp->m_sync_work);
 	xfs_syncd_stop(mp);
  out_filestream_unmount:
 	xfs_filestream_unmount(mp);
@@ -1335,6 +1342,7 @@ out_destroy_workqueues:
  out_unmount:
 	xfs_filestream_unmount(mp);
 	xfs_unmountfs(mp);
+	cancel_delayed_work_sync(&mp->m_sync_work);
 	xfs_syncd_stop(mp);
 	goto out_free_sb;
 }
Index: xfs/fs/xfs/xfs_sync.c
===================================================================
--- xfs.orig/fs/xfs/xfs_sync.c
+++ xfs/fs/xfs/xfs_sync.c
@@ -370,7 +370,7 @@ xfs_quiesce_attr(
 	xfs_buf_unlock(mp->m_sb_bp);
 }
 
-static void
+void
 xfs_syncd_queue_sync(
 	struct xfs_mount        *mp)
 {
@@ -383,7 +383,7 @@ xfs_syncd_queue_sync(
  * disk quotas.  We might need to cover the log to indicate that the
  * filesystem is idle and not frozen.
  */
-STATIC void
+void
 xfs_sync_worker(
 	struct work_struct *work)
 {
@@ -494,11 +494,8 @@ xfs_syncd_init(
 	struct xfs_mount	*mp)
 {
 	INIT_WORK(&mp->m_flush_work, xfs_flush_worker);
-	INIT_DELAYED_WORK(&mp->m_sync_work, xfs_sync_worker);
 	INIT_DELAYED_WORK(&mp->m_reclaim_work, xfs_reclaim_worker);
 
-	xfs_syncd_queue_sync(mp);
-
 	return 0;
 }
 
@@ -506,7 +503,6 @@ void
 xfs_syncd_stop(
 	struct xfs_mount	*mp)
 {
-	cancel_delayed_work_sync(&mp->m_sync_work);
 	cancel_delayed_work_sync(&mp->m_reclaim_work);
 	cancel_work_sync(&mp->m_flush_work);
 }



More information about the xfs mailing list