Module Name: src
Committed By: hannken
Date: Fri Feb 17 08:30:00 UTC 2017
Modified Files:
src/sys/dev: fss.c
src/sys/kern: vfs_vnode.c
src/sys/sys: vnode.h
src/sys/ufs/ffs: ffs_snapshot.c
Log Message:
Bring back vrele_flush() to flush deferred vrele() o an suspended file system.
To generate a diff of this commit:
cvs rdiff -u -r1.96 -r1.97 src/sys/dev/fss.c
cvs rdiff -u -r1.74 -r1.75 src/sys/kern/vfs_vnode.c
cvs rdiff -u -r1.273 -r1.274 src/sys/sys/vnode.h
cvs rdiff -u -r1.144 -r1.145 src/sys/ufs/ffs/ffs_snapshot.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/dev/fss.c
diff -u src/sys/dev/fss.c:1.96 src/sys/dev/fss.c:1.97
--- src/sys/dev/fss.c:1.96 Fri Feb 17 08:29:11 2017
+++ src/sys/dev/fss.c Fri Feb 17 08:30:00 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: fss.c,v 1.96 2017/02/17 08:29:11 hannken Exp $ */
+/* $NetBSD: fss.c,v 1.97 2017/02/17 08:30:00 hannken Exp $ */
/*-
* Copyright (c) 2003 The NetBSD Foundation, Inc.
@@ -36,7 +36,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: fss.c,v 1.96 2017/02/17 08:29:11 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fss.c,v 1.97 2017/02/17 08:30:00 hannken Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -851,6 +851,7 @@ fss_create_snapshot(struct fss_softc *sc
microtime(&sc->sc_time);
+ vrele_flush(sc->sc_mount);
error = VFS_SYNC(sc->sc_mount, MNT_WAIT, curlwp->l_cred);
if (error == 0)
error = fscow_establish(sc->sc_mount, fss_copy_on_write, sc);
Index: src/sys/kern/vfs_vnode.c
diff -u src/sys/kern/vfs_vnode.c:1.74 src/sys/kern/vfs_vnode.c:1.75
--- src/sys/kern/vfs_vnode.c:1.74 Fri Feb 17 08:27:58 2017
+++ src/sys/kern/vfs_vnode.c Fri Feb 17 08:30:00 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: vfs_vnode.c,v 1.74 2017/02/17 08:27:58 hannken Exp $ */
+/* $NetBSD: vfs_vnode.c,v 1.75 2017/02/17 08:30:00 hannken Exp $ */
/*-
* Copyright (c) 1997-2011 The NetBSD Foundation, Inc.
@@ -156,7 +156,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_vnode.c,v 1.74 2017/02/17 08:27:58 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_vnode.c,v 1.75 2017/02/17 08:30:00 hannken Exp $");
#include <sys/param.h>
#include <sys/kernel.h>
@@ -455,6 +455,45 @@ lru_requeue(vnode_t *vp, vnodelst_t *lis
}
/*
+ * Release deferred vrele vnodes for this mount.
+ * Called with file system suspended.
+ */
+void
+vrele_flush(struct mount *mp)
+{
+ vnode_impl_t *vip, *marker;
+
+ KASSERT(fstrans_is_owner(mp));
+
+ marker = VNODE_TO_VIMPL(vnalloc_marker(NULL));
+
+ mutex_enter(&vdrain_lock);
+ TAILQ_INSERT_HEAD(&lru_vrele_list, marker, vi_lrulist);
+
+ while ((vip = TAILQ_NEXT(marker, vi_lrulist))) {
+ TAILQ_REMOVE(&lru_vrele_list, marker, vi_lrulist);
+ TAILQ_INSERT_AFTER(&lru_vrele_list, vip, marker, vi_lrulist);
+ if (vnis_marker(VIMPL_TO_VNODE(vip)))
+ continue;
+
+ KASSERT(vip->vi_lrulisthd == &lru_vrele_list);
+ TAILQ_REMOVE(vip->vi_lrulisthd, vip, vi_lrulist);
+ vip->vi_lrulisthd = &lru_hold_list;
+ TAILQ_INSERT_TAIL(vip->vi_lrulisthd, vip, vi_lrulist);
+ mutex_exit(&vdrain_lock);
+
+ vrele(VIMPL_TO_VNODE(vip));
+
+ mutex_enter(&vdrain_lock);
+ }
+
+ TAILQ_REMOVE(&lru_vrele_list, marker, vi_lrulist);
+ mutex_exit(&vdrain_lock);
+
+ vnfree_marker(VIMPL_TO_VNODE(marker));
+}
+
+/*
* Reclaim a cached vnode. Used from vdrain_thread only.
*/
static __inline void
@@ -556,6 +595,8 @@ vdrain_thread(void *cookie)
TAILQ_REMOVE(listhd[i], marker, vi_lrulist);
TAILQ_INSERT_AFTER(listhd[i], vip, marker,
vi_lrulist);
+ if (vnis_marker(VIMPL_TO_VNODE(vip)))
+ continue;
if (listhd[i] == &lru_vrele_list)
vdrain_vrele(VIMPL_TO_VNODE(vip));
else if (numvnodes < target)
Index: src/sys/sys/vnode.h
diff -u src/sys/sys/vnode.h:1.273 src/sys/sys/vnode.h:1.274
--- src/sys/sys/vnode.h:1.273 Wed Jan 11 12:17:34 2017
+++ src/sys/sys/vnode.h Fri Feb 17 08:30:00 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: vnode.h,v 1.273 2017/01/11 12:17:34 joerg Exp $ */
+/* $NetBSD: vnode.h,v 1.274 2017/02/17 08:30:00 hannken Exp $ */
/*-
* Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -515,6 +515,7 @@ void vput(struct vnode *);
bool vrecycle(struct vnode *);
void vrele(struct vnode *);
void vrele_async(struct vnode *);
+void vrele_flush(struct mount *);
int vtruncbuf(struct vnode *, daddr_t, bool, int);
void vwakeup(struct buf *);
int vdead_check(struct vnode *, int);
Index: src/sys/ufs/ffs/ffs_snapshot.c
diff -u src/sys/ufs/ffs/ffs_snapshot.c:1.144 src/sys/ufs/ffs/ffs_snapshot.c:1.145
--- src/sys/ufs/ffs/ffs_snapshot.c:1.144 Fri Feb 17 08:29:11 2017
+++ src/sys/ufs/ffs/ffs_snapshot.c Fri Feb 17 08:30:00 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: ffs_snapshot.c,v 1.144 2017/02/17 08:29:11 hannken Exp $ */
+/* $NetBSD: ffs_snapshot.c,v 1.145 2017/02/17 08:30:00 hannken Exp $ */
/*
* Copyright 2000 Marshall Kirk McKusick. All Rights Reserved.
@@ -38,7 +38,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ffs_snapshot.c,v 1.144 2017/02/17 08:29:11 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ffs_snapshot.c,v 1.145 2017/02/17 08:30:00 hannken Exp $");
#if defined(_KERNEL_OPT)
#include "opt_ffs.h"
@@ -256,6 +256,7 @@ ffs_snapshot(struct mount *mp, struct vn
error = vfs_suspend(vp->v_mount, 0);
if (error == 0) {
suspended = true;
+ vrele_flush(vp->v_mount);
error = VFS_SYNC(vp->v_mount, MNT_WAIT, curlwp->l_cred);
}
vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);