Lines 6110-6115
zfs_deallocate(struct vop_deallocate_args *ap)
Link Here
|
6110 |
} |
6110 |
} |
6111 |
#endif |
6111 |
#endif |
6112 |
|
6112 |
|
|
|
6113 |
static int |
6114 |
zfs_freebsd_lock(struct vop_lock1_args *ap) |
6115 |
{ |
6116 |
zfsvfs_t *zfsvfs; |
6117 |
struct vnode *vp; |
6118 |
int error, flags, type; |
6119 |
|
6120 |
vp = ap->a_vp; |
6121 |
flags = ap->a_flags & LK_EATTR_MASK; |
6122 |
type = ap->a_flags & LK_TYPE_MASK; |
6123 |
zfsvfs = VTOZ(vp)->z_zfsvfs; |
6124 |
|
6125 |
KASSERT(type != LK_RELEASE && type != LK_DRAIN && type != LK_EXCLOTHER, |
6126 |
("%s: invalid operation type %#x", __func__, type)); |
6127 |
|
6128 |
if (type == LK_UPGRADE) |
6129 |
ZFS_TEARDOWN_EXIT_READ(zfsvfs, NULL); |
6130 |
|
6131 |
error = vop_lock(ap); |
6132 |
if (error != 0) |
6133 |
return (error); |
6134 |
|
6135 |
if (!ZFS_TEARDOWN_WRITE_HELD(zfsvfs)) { |
6136 |
switch (type) { |
6137 |
case LK_DOWNGRADE: |
6138 |
break; |
6139 |
case LK_EXCLUSIVE: |
6140 |
case LK_SHARED: |
6141 |
case LK_UPGRADE: |
6142 |
if ((flags & LK_NOWAIT) == 0) { |
6143 |
ZFS_TEARDOWN_ENTER_READ(zfsvfs, NULL); |
6144 |
break; |
6145 |
} |
6146 |
/* FALLTHROUGH */ |
6147 |
case LK_TRYUPGRADE: |
6148 |
if (!ZFS_TEARDOWN_TRY_ENTER_READ(zfsvfs)) { |
6149 |
/* XXXMJ coupled to vop_unlock impl */ |
6150 |
lockmgr_unlock(&vp->v_lock); |
6151 |
return (EBUSY); |
6152 |
} |
6153 |
break; |
6154 |
} |
6155 |
} |
6156 |
|
6157 |
return (0); |
6158 |
} |
6159 |
|
6160 |
/* XXXMJ can't release teardown lock before vnode lock */ |
6161 |
static int |
6162 |
zfs_freebsd_unlock(struct vop_unlock_args *ap) |
6163 |
{ |
6164 |
zfsvfs_t *zfsvfs; |
6165 |
struct vnode *vp; |
6166 |
int error; |
6167 |
|
6168 |
vp = ap->a_vp; |
6169 |
zfsvfs = VTOZ(ap->a_vp)->z_zfsvfs; |
6170 |
error = vop_unlock(ap); |
6171 |
if (!ZFS_TEARDOWN_WRITE_HELD(zfsvfs)) |
6172 |
ZFS_TEARDOWN_EXIT_READ(zfsvfs, NULL); |
6173 |
return (error); |
6174 |
} |
6175 |
|
6176 |
static int |
6177 |
zfs_freebsd_islocked(struct vop_islocked_args *ap) |
6178 |
{ |
6179 |
struct vnode *vp; |
6180 |
int status; |
6181 |
|
6182 |
vp = ap->a_vp; |
6183 |
status = vop_islocked(ap); |
6184 |
if (status != 0) |
6185 |
VNASSERT(ZFS_TEARDOWN_HELD(VTOZ(vp)->z_zfsvfs), vp, |
6186 |
("teardown lock not held")); |
6187 |
return (status); |
6188 |
} |
6189 |
|
6113 |
struct vop_vector zfs_vnodeops; |
6190 |
struct vop_vector zfs_vnodeops; |
6114 |
struct vop_vector zfs_fifoops; |
6191 |
struct vop_vector zfs_fifoops; |
6115 |
struct vop_vector zfs_shareops; |
6192 |
struct vop_vector zfs_shareops; |
Lines 6166-6174
struct vop_vector zfs_vnodeops = {
Link Here
|
6166 |
.vop_putpages = zfs_freebsd_putpages, |
6243 |
.vop_putpages = zfs_freebsd_putpages, |
6167 |
.vop_vptocnp = zfs_vptocnp, |
6244 |
.vop_vptocnp = zfs_vptocnp, |
6168 |
#if __FreeBSD_version >= 1300064 |
6245 |
#if __FreeBSD_version >= 1300064 |
6169 |
.vop_lock1 = vop_lock, |
6246 |
.vop_lock1 = zfs_freebsd_lock, |
6170 |
.vop_unlock = vop_unlock, |
6247 |
.vop_unlock = zfs_freebsd_unlock, |
6171 |
.vop_islocked = vop_islocked, |
6248 |
.vop_islocked = zfs_freebsd_islocked, |
6172 |
#endif |
6249 |
#endif |
6173 |
}; |
6250 |
}; |
6174 |
VFS_VOP_VECTOR_REGISTER(zfs_vnodeops); |
6251 |
VFS_VOP_VECTOR_REGISTER(zfs_vnodeops); |