Module Name: src
Committed By: hannken
Date: Mon Jun 17 08:09:57 UTC 2019
Modified Files:
src/external/cddl/osnet/dist/uts/common/fs/zfs: zfs_vfsops.c
Log Message:
Add native vfs_suspend()/vfs_resume() before and after
zfs_suspend_fs()/zfs_resume_fs() and get rid of dead "z_sa_hdl == NULL"
znodes before vfs_resume() to keep the vnode cache consistent.
Live rollback should work now.
PR port-xen/54273 ("zpool create pool xbd2" panics DOMU kernel)
To generate a diff of this commit:
cvs rdiff -u -r1.23 -r1.24 \
src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vfsops.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vfsops.c
diff -u src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vfsops.c:1.23 src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vfsops.c:1.24
--- src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vfsops.c:1.23 Wed May 22 08:45:32 2019
+++ src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vfsops.c Mon Jun 17 08:09:57 2019
@@ -121,6 +121,7 @@ VFS_SET(zfs_vfsops, zfs, VFCF_JAIL | VFC
#ifdef __NetBSD__
+#include <sys/fstrans.h>
#include <sys/mkdev.h>
#include <miscfs/genfs/genfs.h>
@@ -2669,8 +2670,17 @@ zfs_suspend_fs(zfsvfs_t *zfsvfs)
{
int error;
+#ifdef __NetBSD__
+ if ((error = vfs_suspend(zfsvfs->z_vfs, 0)) != 0)
+ return error;
+ if ((error = zfsvfs_teardown(zfsvfs, B_FALSE)) != 0) {
+ vfs_resume(zfsvfs->z_vfs);
+ return (error);
+ }
+#else
if ((error = zfsvfs_teardown(zfsvfs, B_FALSE)) != 0)
return (error);
+#endif
return (0);
}
@@ -2682,6 +2692,16 @@ zfs_suspend_fs(zfsvfs_t *zfsvfs)
* are the same: the relevant objset and associated dataset are owned by
* zfsvfs, held, and long held on entry.
*/
+#ifdef __NetBSD__
+static bool
+zfs_resume_selector(void *cl, struct vnode *vp)
+{
+
+ if (zfsctl_is_node(vp))
+ return false;
+ return (VTOZ(vp)->z_sa_hdl == NULL);
+}
+#endif
int
zfs_resume_fs(zfsvfs_t *zfsvfs, dsl_dataset_t *ds)
{
@@ -2725,6 +2745,18 @@ bail:
/* release the VOPs */
rw_exit(&zfsvfs->z_teardown_inactive_lock);
rrm_exit(&zfsvfs->z_teardown_lock, FTAG);
+#ifdef __NetBSD__
+ struct vnode_iterator *marker;
+ vnode_t *vp;
+
+ vfs_vnode_iterator_init(zfsvfs->z_vfs, &marker);
+ while ((vp = vfs_vnode_iterator_next(marker,
+ zfs_resume_selector, NULL))) {
+ vgone(vp);
+ }
+ vfs_vnode_iterator_destroy(marker);
+ vfs_resume(zfsvfs->z_vfs);
+#endif
if (err) {
/*