svn commit: r198734 -
user/kmacy/releng_8_fcs_buf/sys/cddl/contrib/opensolaris/uts/common/fs/zfs
Kip Macy
kmacy at FreeBSD.org
Sat Oct 31 22:50:29 UTC 2009
Author: kmacy
Date: Sat Oct 31 22:50:29 2009
New Revision: 198734
URL: http://svn.freebsd.org/changeset/base/198734
Log:
force unmount ZFS volumes earlier in shutdown to release bufs back to the system
Modified:
user/kmacy/releng_8_fcs_buf/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c
Modified: user/kmacy/releng_8_fcs_buf/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c
==============================================================================
--- user/kmacy/releng_8_fcs_buf/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c Sat Oct 31 22:27:31 2009 (r198733)
+++ user/kmacy/releng_8_fcs_buf/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c Sat Oct 31 22:50:29 2009 (r198734)
@@ -3657,6 +3657,7 @@ arc_tempreserve_space(uint64_t reserve,
static kmutex_t arc_lowmem_lock;
#ifdef _KERNEL
static eventhandler_tag arc_event_lowmem = NULL;
+static eventhandler_tag arc_event_shutdown = NULL;
static void
arc_lowmem(void *arg __unused, int howto __unused)
@@ -3670,6 +3671,30 @@ arc_lowmem(void *arg __unused, int howto
tsleep(&needfree, 0, "zfs:lowmem", hz / 5);
mutex_exit(&arc_lowmem_lock);
}
+void
+arc_shutdown(void *arg __unused, int howto __unused)
+{
+ struct mount *mp, *tmpmp;
+ int error;
+
+ arc_flush(NULL);
+ TAILQ_FOREACH_SAFE(mp, &mountlist, mnt_list, tmpmp) {
+ if (strcmp(mp->mnt_vfc->vfc_name, "zfs") == 0) {
+ error = dounmount(mp, MNT_FORCE, curthread);
+ if (error) {
+ TAILQ_REMOVE(&mountlist, mp, mnt_list);
+ printf("unmount of %s failed (",
+ mp->mnt_stat.f_mntonname);
+ if (error == EBUSY)
+ printf("BUSY)\n");
+ else
+ printf("%d)\n", error);
+ }
+ }
+
+ }
+}
+
#endif
void
@@ -3793,8 +3818,10 @@ arc_init(void)
TS_RUN, minclsyspri);
#ifdef _KERNEL
- arc_event_lowmem = EVENTHANDLER_REGISTER(vm_lowmem, arc_lowmem, NULL,
- EVENTHANDLER_PRI_FIRST);
+ arc_event_lowmem = EVENTHANDLER_REGISTER(vm_lowmem, arc_lowmem,
+ NULL, EVENTHANDLER_PRI_FIRST);
+ arc_event_shutdown = EVENTHANDLER_REGISTER(shutdown_pre_sync,
+ arc_event_shutdown, NULL, EVENTHANDLER_PRI_FIRST);
#endif
arc_dead = FALSE;
@@ -3885,6 +3912,8 @@ arc_fini(void)
#ifdef _KERNEL
if (arc_event_lowmem != NULL)
EVENTHANDLER_DEREGISTER(vm_lowmem, arc_event_lowmem);
+ if (arc_event_shutdown != NULL)
+ EVENTHANDLER_DEREGISTER(shutdown_pre_sync, arc_event_shutdown);
#endif
}
More information about the svn-src-user
mailing list