svn commit: r275620 - in head/sys: kern sys
Konstantin Belousov
kib at FreeBSD.org
Mon Dec 8 16:48:58 UTC 2014
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>
More information about the svn-src-head
mailing list