View | Details | Raw Unified | Return to bug 258208 | Differences between
and this patch

Collapse All | Expand All

(-)b/sys/contrib/openzfs/include/os/freebsd/zfs/sys/zfs_vfsops_os.h (-2 / +2 lines)
Lines 140-146 struct zfsvfs { Link Here
140
#define	ZFS_TEARDOWN_ENTER_WRITE(zfsvfs, tag)	\
140
#define	ZFS_TEARDOWN_ENTER_WRITE(zfsvfs, tag)	\
141
	rms_wlock(&(zfsvfs)->z_teardown_lock)
141
	rms_wlock(&(zfsvfs)->z_teardown_lock)
142
142
143
#define	ZFS_TEARDOWN_EXIT_WRITE(zfsvfs)		\
143
#define	ZFS_TEARDOWN_EXIT_WRITE(zfsvfs, tag)	\
144
	rms_wunlock(&(zfsvfs)->z_teardown_lock)
144
	rms_wunlock(&(zfsvfs)->z_teardown_lock)
145
145
146
#define	ZFS_TEARDOWN_EXIT(zfsvfs, tag)		\
146
#define	ZFS_TEARDOWN_EXIT(zfsvfs, tag)		\
Lines 173-179 struct zfsvfs { Link Here
173
#define	ZFS_TEARDOWN_ENTER_WRITE(zfsvfs, tag)	\
173
#define	ZFS_TEARDOWN_ENTER_WRITE(zfsvfs, tag)	\
174
	rrm_enter(&(zfsvfs)->z_teardown_lock, RW_WRITER, tag)
174
	rrm_enter(&(zfsvfs)->z_teardown_lock, RW_WRITER, tag)
175
175
176
#define	ZFS_TEARDOWN_EXIT_WRITE(zfsvfs)		\
176
#define	ZFS_TEARDOWN_EXIT_WRITE(zfsvfs, tag)	\
177
	rrm_exit(&(zfsvfs)->z_teardown_lock, tag)
177
	rrm_exit(&(zfsvfs)->z_teardown_lock, tag)
178
178
179
#define	ZFS_TEARDOWN_EXIT(zfsvfs, tag)		\
179
#define	ZFS_TEARDOWN_EXIT(zfsvfs, tag)		\
(-)b/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vfsops.c (-6 / +6 lines)
Lines 1405-1411 zfs_mount(vfs_t *vfsp) Link Here
1405
		ZFS_TEARDOWN_ENTER_WRITE(zfsvfs, FTAG);
1405
		ZFS_TEARDOWN_ENTER_WRITE(zfsvfs, FTAG);
1406
		zfs_unregister_callbacks(zfsvfs);
1406
		zfs_unregister_callbacks(zfsvfs);
1407
		error = zfs_register_callbacks(vfsp);
1407
		error = zfs_register_callbacks(vfsp);
1408
		ZFS_TEARDOWN_EXIT(zfsvfs, FTAG);
1408
		ZFS_TEARDOWN_EXIT_WRITE(zfsvfs, FTAG);
1409
		goto out;
1409
		goto out;
1410
	}
1410
	}
1411
1411
Lines 1587-1593 zfsvfs_teardown(zfsvfs_t *zfsvfs, boolean_t unmounting) Link Here
1587
	 */
1587
	 */
1588
	if (!unmounting && (zfsvfs->z_unmounted || zfsvfs->z_os == NULL)) {
1588
	if (!unmounting && (zfsvfs->z_unmounted || zfsvfs->z_os == NULL)) {
1589
		ZFS_TEARDOWN_INACTIVE_EXIT_WRITE(zfsvfs);
1589
		ZFS_TEARDOWN_INACTIVE_EXIT_WRITE(zfsvfs);
1590
		ZFS_TEARDOWN_EXIT(zfsvfs, FTAG);
1590
		ZFS_TEARDOWN_EXIT_WRITE(zfsvfs, FTAG);
1591
		return (SET_ERROR(EIO));
1591
		return (SET_ERROR(EIO));
1592
	}
1592
	}
1593
1593
Lines 1615-1621 zfsvfs_teardown(zfsvfs_t *zfsvfs, boolean_t unmounting) Link Here
1615
	if (unmounting) {
1615
	if (unmounting) {
1616
		zfsvfs->z_unmounted = B_TRUE;
1616
		zfsvfs->z_unmounted = B_TRUE;
1617
		ZFS_TEARDOWN_INACTIVE_EXIT_WRITE(zfsvfs);
1617
		ZFS_TEARDOWN_INACTIVE_EXIT_WRITE(zfsvfs);
1618
		ZFS_TEARDOWN_EXIT(zfsvfs, FTAG);
1618
		ZFS_TEARDOWN_EXIT_WRITE(zfsvfs, FTAG);
1619
	}
1619
	}
1620
1620
1621
	/*
1621
	/*
Lines 1677-1683 zfs_umount(vfs_t *vfsp, int fflag) Link Here
1677
		 */
1677
		 */
1678
		ZFS_TEARDOWN_ENTER_WRITE(zfsvfs, FTAG);
1678
		ZFS_TEARDOWN_ENTER_WRITE(zfsvfs, FTAG);
1679
		zfsvfs->z_unmounted = B_TRUE;
1679
		zfsvfs->z_unmounted = B_TRUE;
1680
		ZFS_TEARDOWN_EXIT(zfsvfs, FTAG);
1680
		ZFS_TEARDOWN_EXIT_WRITE(zfsvfs, FTAG);
1681
	}
1681
	}
1682
1682
1683
	/*
1683
	/*
Lines 1976-1982 zfs_resume_fs(zfsvfs_t *zfsvfs, dsl_dataset_t *ds) Link Here
1976
bail:
1976
bail:
1977
	/* release the VOPs */
1977
	/* release the VOPs */
1978
	ZFS_TEARDOWN_INACTIVE_EXIT_WRITE(zfsvfs);
1978
	ZFS_TEARDOWN_INACTIVE_EXIT_WRITE(zfsvfs);
1979
	ZFS_TEARDOWN_EXIT(zfsvfs, FTAG);
1979
	ZFS_TEARDOWN_EXIT_WRITE(zfsvfs, FTAG);
1980
1980
1981
	if (err) {
1981
	if (err) {
1982
		/*
1982
		/*
Lines 2109-2115 zfs_end_fs(zfsvfs_t *zfsvfs, dsl_dataset_t *ds) Link Here
2109
2109
2110
	/* release the VOPs */
2110
	/* release the VOPs */
2111
	ZFS_TEARDOWN_INACTIVE_EXIT_WRITE(zfsvfs);
2111
	ZFS_TEARDOWN_INACTIVE_EXIT_WRITE(zfsvfs);
2112
	ZFS_TEARDOWN_EXIT(zfsvfs, FTAG);
2112
	ZFS_TEARDOWN_EXIT_WRITE(zfsvfs, FTAG);
2113
2113
2114
	/*
2114
	/*
2115
	 * Try to force unmount this file system.
2115
	 * Try to force unmount this file system.
(-)b/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vnops_os.c (-3 / +83 lines)
Lines 5174-5179 zfs_freebsd_reclaim(struct vop_reclaim_args *ap) Link Here
5174
	else
5174
	else
5175
		zfs_zinactive(zp);
5175
		zfs_zinactive(zp);
5176
	ZFS_TEARDOWN_INACTIVE_EXIT_READ(zfsvfs);
5176
	ZFS_TEARDOWN_INACTIVE_EXIT_READ(zfsvfs);
5177
	/* XXXMJ */
5178
	ZFS_EXIT(zfsvfs);
5177
5179
5178
	vp->v_data = NULL;
5180
	vp->v_data = NULL;
5179
	return (0);
5181
	return (0);
Lines 6110-6115 zfs_deallocate(struct vop_deallocate_args *ap) Link Here
6110
}
6112
}
6111
#endif
6113
#endif
6112
6114
6115
static int
6116
zfs_freebsd_lock(struct vop_lock1_args *ap)
6117
{
6118
	zfsvfs_t *zfsvfs;
6119
	struct vnode *vp;
6120
	int error, flags, type;
6121
6122
	vp = ap->a_vp;
6123
	flags = ap->a_flags & LK_EATTR_MASK;
6124
	type = ap->a_flags & LK_TYPE_MASK;
6125
	zfsvfs = VTOZ(vp)->z_zfsvfs;
6126
6127
	KASSERT(type != LK_RELEASE && type != LK_DRAIN && type != LK_EXCLOTHER,
6128
	    ("%s: invalid operation type %#x", __func__, type));
6129
6130
	if (type == LK_UPGRADE)
6131
		ZFS_TEARDOWN_EXIT_READ(zfsvfs, NULL);
6132
6133
	error = vop_lock(ap);
6134
	if (error != 0)
6135
		return (error);
6136
6137
	if (!ZFS_TEARDOWN_WRITE_HELD(zfsvfs)) {
6138
		switch (type) {
6139
		case LK_DOWNGRADE:
6140
			break;
6141
		case LK_EXCLUSIVE:
6142
		case LK_SHARED:
6143
		case LK_UPGRADE:
6144
			if ((flags & LK_NOWAIT) == 0) {
6145
				ZFS_TEARDOWN_ENTER_READ(zfsvfs, NULL);
6146
				break;
6147
			}
6148
			/* FALLTHROUGH */
6149
		case LK_TRYUPGRADE:
6150
			if (!ZFS_TEARDOWN_TRY_ENTER_READ(zfsvfs)) {
6151
				/* XXXMJ coupled to vop_unlock impl */
6152
				/* XXXMJ do we need to reacquire interlock? */
6153
				lockmgr_unlock(&vp->v_lock);
6154
				return (EBUSY);
6155
			}
6156
			break;
6157
		}
6158
	}
6159
6160
	return (0);
6161
}
6162
6163
/* XXXMJ can't release teardown lock before vnode lock */
6164
static int
6165
zfs_freebsd_unlock(struct vop_unlock_args *ap)
6166
{
6167
	zfsvfs_t *zfsvfs;
6168
	struct vnode *vp;
6169
	int error;
6170
6171
	vp = ap->a_vp;
6172
	zfsvfs = VTOZ(ap->a_vp)->z_zfsvfs;
6173
	error = vop_unlock(ap);
6174
	if (!ZFS_TEARDOWN_WRITE_HELD(zfsvfs))
6175
		ZFS_TEARDOWN_EXIT_READ(zfsvfs, NULL);
6176
	return (error);
6177
}
6178
6179
static int
6180
zfs_freebsd_islocked(struct vop_islocked_args *ap)
6181
{
6182
	struct vnode *vp;
6183
	int status;
6184
6185
	vp = ap->a_vp;
6186
	status = vop_islocked(ap);
6187
	if (status != 0)
6188
		VNASSERT(ZFS_TEARDOWN_HELD(VTOZ(vp)->z_zfsvfs), vp,
6189
		    ("teardown lock not held"));
6190
	return (status);
6191
}
6192
6113
struct vop_vector zfs_vnodeops;
6193
struct vop_vector zfs_vnodeops;
6114
struct vop_vector zfs_fifoops;
6194
struct vop_vector zfs_fifoops;
6115
struct vop_vector zfs_shareops;
6195
struct vop_vector zfs_shareops;
Lines 6166-6174 struct vop_vector zfs_vnodeops = { Link Here
6166
	.vop_putpages =		zfs_freebsd_putpages,
6246
	.vop_putpages =		zfs_freebsd_putpages,
6167
	.vop_vptocnp =		zfs_vptocnp,
6247
	.vop_vptocnp =		zfs_vptocnp,
6168
#if __FreeBSD_version >= 1300064
6248
#if __FreeBSD_version >= 1300064
6169
	.vop_lock1 =		vop_lock,
6249
	.vop_lock1 =		zfs_freebsd_lock,
6170
	.vop_unlock =		vop_unlock,
6250
	.vop_unlock =		zfs_freebsd_unlock,
6171
	.vop_islocked =		vop_islocked,
6251
	.vop_islocked =		zfs_freebsd_islocked,
6172
#endif
6252
#endif
6173
};
6253
};
6174
VFS_VOP_VECTOR_REGISTER(zfs_vnodeops);
6254
VFS_VOP_VECTOR_REGISTER(zfs_vnodeops);

Return to bug 258208