Skip to content

Commit d3cc89a

Browse files
mjguziktonyhutter
authored andcommitted
FreeBSD: use vnlru_free_vfsops if available
Fixes issues when zfs is used along with other filesystems. External-issue: https://cgit.freebsd.org/src/commit/?id=e9272225e6bed840b00eef1c817b188c172338ee Reviewed-by: Ryan Moeller <[email protected]> Signed-off-by: Mateusz Guzik <[email protected]> Closes openzfs#11881
1 parent 7c1ed0c commit d3cc89a

File tree

1 file changed

+21
-1
lines changed

1 file changed

+21
-1
lines changed

module/os/freebsd/zfs/arc_os.c

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,11 @@
5151
#include <sys/vm.h>
5252
#include <sys/vmmeter.h>
5353

54+
#if __FreeBSD_version >= 1300139
55+
static struct sx arc_vnlru_lock;
56+
static struct vnode *arc_vnlru_marker;
57+
#endif
58+
5459
extern struct vfsops zfs_vfsops;
5560

5661
uint_t zfs_arc_free_target = 0;
@@ -157,7 +162,13 @@ arc_prune_task(void *arg)
157162

158163
arc_reduce_target_size(ptob(nr_scan));
159164
free(arg, M_TEMP);
165+
#if __FreeBSD_version >= 1300139
166+
sx_xlock(&arc_vnlru_lock);
167+
vnlru_free_vfsops(nr_scan, &zfs_vfsops, arc_vnlru_marker);
168+
sx_xunlock(&arc_vnlru_lock);
169+
#else
160170
vnlru_free(nr_scan, &zfs_vfsops);
171+
#endif
161172
}
162173

163174
/*
@@ -234,12 +245,21 @@ arc_lowmem_init(void)
234245
{
235246
arc_event_lowmem = EVENTHANDLER_REGISTER(vm_lowmem, arc_lowmem, NULL,
236247
EVENTHANDLER_PRI_FIRST);
237-
248+
#if __FreeBSD_version >= 1300139
249+
arc_vnlru_marker = vnlru_alloc_marker();
250+
sx_init(&arc_vnlru_lock, "arc vnlru lock");
251+
#endif
238252
}
239253

240254
void
241255
arc_lowmem_fini(void)
242256
{
243257
if (arc_event_lowmem != NULL)
244258
EVENTHANDLER_DEREGISTER(vm_lowmem, arc_event_lowmem);
259+
#if __FreeBSD_version >= 1300139
260+
if (arc_vnlru_marker != NULL) {
261+
vnlru_free_marker(arc_vnlru_marker);
262+
sx_destroy(&arc_vnlru_lock);
263+
}
264+
#endif
245265
}

0 commit comments

Comments
 (0)