Date: Sat, 31 Oct 2009 22:50:29 +0000 (UTC) From: Kip Macy <kmacy@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r198734 - user/kmacy/releng_8_fcs_buf/sys/cddl/contrib/opensolaris/uts/common/fs/zfs Message-ID: <200910312250.n9VMoTFJ005614@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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 }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200910312250.n9VMoTFJ005614>