Author: kib
Date: Mon Dec  8 16:48:57 2014
New Revision: 275620
URL: https://svnweb.freebsd.org/changeset/base/275620

Log:
  Add functions syncer_suspend() and syncer_resume(), which are supposed
  to be called before suspension and after resume, correspondingly.  The
  syncer_suspend() ensures that all filesystems dirty data and metadata
  are saved to the permanent storage, and stops kernel threads which
  might modify filesystems.  The syncer_resume() restores stopped
  threads.
  
  For now, only syncer is stopped.  This is needed, because each sync
  loop causes superblock updates for UFS.
  
  Tested by:    pho
  Sponsored by: The FreeBSD Foundation
  MFC after:    1 week

Modified:
  head/sys/kern/vfs_subr.c
  head/sys/sys/mount.h

Modified: head/sys/kern/vfs_subr.c
==============================================================================
--- head/sys/kern/vfs_subr.c    Mon Dec  8 16:42:34 2014        (r275619)
+++ head/sys/kern/vfs_subr.c    Mon Dec  8 16:48:57 2014        (r275620)
@@ -1773,6 +1773,8 @@ sync_vnode(struct synclist *slp, struct 
        return (0);
 }
 
+static int first_printf = 1;
+
 /*
  * System filesystem synchronizer daemon.
  */
@@ -1791,7 +1793,6 @@ sched_sync(void)
 
        last_work_seen = 0;
        syncer_final_iter = 0;
-       first_printf = 1;
        syncer_state = SYNCER_RUNNING;
        starttime = time_uptime;
        td->td_pflags |= TDP_NORUNNINGBUF;
@@ -1955,6 +1956,25 @@ syncer_shutdown(void *arg, int howto)
        kproc_shutdown(arg, howto);
 }
 
+void
+syncer_suspend(void)
+{
+
+       syncer_shutdown(updateproc, 0);
+}
+
+void
+syncer_resume(void)
+{
+
+       mtx_lock(&sync_mtx);
+       first_printf = 1;
+       syncer_state = SYNCER_RUNNING;
+       mtx_unlock(&sync_mtx);
+       cv_broadcast(&sync_wakeup);
+       kproc_resume(updateproc);
+}
+
 /*
  * Reassign a buffer from one vnode to another.
  * Used to assign file specific control information

Modified: head/sys/sys/mount.h
==============================================================================
--- head/sys/sys/mount.h        Mon Dec  8 16:42:34 2014        (r275619)
+++ head/sys/sys/mount.h        Mon Dec  8 16:48:57 2014        (r275620)
@@ -917,6 +917,9 @@ vfs_uninit_t                vfs_stduninit;
 vfs_extattrctl_t       vfs_stdextattrctl;
 vfs_sysctl_t           vfs_stdsysctl;
 
+void   syncer_suspend(void);
+void   syncer_resume(void);
+
 #else /* !_KERNEL */
 
 #include <sys/cdefs.h>
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to