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); |