diff --git a/sys/fs/nandfs/nandfs_subr.c b/sys/fs/nandfs/nandfs_subr.c index 8927304..93a49b9 100644 --- a/sys/fs/nandfs/nandfs_subr.c +++ b/sys/fs/nandfs/nandfs_subr.c @@ -62,6 +62,7 @@ MALLOC_DEFINE(M_NANDFSMNT, "nandfs_mount", "NANDFS mount");; MALLOC_DEFINE(M_NANDFSTEMP, "nandfs_tmt", "NANDFS tmp"); uma_zone_t nandfs_node_zone; +static eventhandler_tag nandfs_vfs_highdirtybuf_tag; void nandfs_bdflush(struct bufobj *bo, struct buf *bp); int nandfs_bufsync(struct bufobj *bo, int waitfor); @@ -115,13 +116,35 @@ nandfs_bdflush(bo, bp) __func__, error); } +static void +nandfs_highdirtybuf(void *arg, struct vnode *vp, int *flushed) +{ + struct nandfs_device *fsdev; + + if (vp != NULL) { + if (vp->v_op != &nandfs_vnodeops && + vp->v_op != &nandfs_system_vnodeops) + return; + *flushed += vp->v_bufobj.bo_dirty.bv_cnt; + VOP_FSYNC(vp, MNT_WAIT, curthread); + return; + } + + SLIST_FOREACH(fsdev, &nandfs_devices, nd_next_device) { + DPRINTF(SYNC, ("%s: calling sync on %p\n", __func__, fsdev)); + *flushed += fsdev->nd_dirty_bufs; + nandfs_wakeup_wait_sync(fsdev, SYNCER_VFS_SYNC); + } +} + int nandfs_init(struct vfsconf *vfsp) { nandfs_node_zone = uma_zcreate("nandfs node zone", sizeof(struct nandfs_node), NULL, NULL, NULL, NULL, 0, 0); - + nandfs_vfs_highdirtybuf_tag = EVENTHANDLER_REGISTER(vfs_highdirtybuf, + nandfs_highdirtybuf, NULL, EVENTHANDLER_PRI_ANY); return (0); } @@ -129,6 +152,7 @@ int nandfs_uninit(struct vfsconf *vfsp) { + EVENTHANDLER_DEREGISTER(vfs_highdirtybuf, nandfs_vfs_highdirtybuf_tag); uma_zdestroy(nandfs_node_zone); return (0); }