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
This commit is contained in:
parent
904ed548bb
commit
a25100c539
@ -1773,6 +1773,8 @@ sync_vnode(struct synclist *slp, struct bufobj **bo, struct thread *td)
|
||||
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
|
||||
|
@ -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>
|
||||
|
Loading…
Reference in New Issue
Block a user