From 7843c42b273dbdfd8e0911e0556c424d60908cdf Mon Sep 17 00:00:00 2001 From: Rob Norris Date: Thu, 26 Mar 2026 11:05:59 +1100 Subject: [PATCH] linux/vfsops: add vfs_t allocator, make public In a few commits, we're going to need to allocate and free vfs_t from zpl_super.c as well, so lets keep them uniform. Sponsored-by: TrueNAS Reviewed-by: Brian Behlendorf Signed-off-by: Rob Norris Closes #18377 --- include/os/linux/zfs/sys/zfs_vfsops_os.h | 4 ++++ module/os/linux/zfs/zfs_vfsops.c | 14 +++++++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/include/os/linux/zfs/sys/zfs_vfsops_os.h b/include/os/linux/zfs/sys/zfs_vfsops_os.h index ab46d5f8c..90fd0fb3c 100644 --- a/include/os/linux/zfs/sys/zfs_vfsops_os.h +++ b/include/os/linux/zfs/sys/zfs_vfsops_os.h @@ -22,6 +22,7 @@ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2013, 2018 by Delphix. All rights reserved. + * Copyright (c) 2026, TrueNAS. */ #ifndef _SYS_FS_ZFS_VFSOPS_H @@ -245,6 +246,9 @@ extern int zfsvfs_create_impl(zfsvfs_t **zfvp, zfsvfs_t *zfsvfs, objset_t *os); extern void zfsvfs_free(zfsvfs_t *zfsvfs); extern int zfs_check_global_label(const char *dsname, const char *hexsl); +extern vfs_t *zfsvfs_vfs_alloc(void); +extern void zfsvfs_vfs_free(vfs_t *vfsp); + extern boolean_t zfs_is_readonly(zfsvfs_t *zfsvfs); extern int zfs_domount(struct super_block *sb, zfs_mnt_t *zm, int silent); extern void zfs_preumount(struct super_block *sb); diff --git a/module/os/linux/zfs/zfs_vfsops.c b/module/os/linux/zfs/zfs_vfsops.c index 8a7d14ab6..b38a9fac5 100644 --- a/module/os/linux/zfs/zfs_vfsops.c +++ b/module/os/linux/zfs/zfs_vfsops.c @@ -22,6 +22,7 @@ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2012, 2018 by Delphix. All rights reserved. + * Copyright (c) 2026, TrueNAS. */ /* Portions Copyright 2010 Robert Milkowski */ @@ -110,7 +111,15 @@ static const match_table_t zpl_tokens = { { TOKEN_LAST, NULL }, }; -static void +vfs_t * +zfsvfs_vfs_alloc(void) +{ + vfs_t *vfsp = kmem_zalloc(sizeof (vfs_t), KM_SLEEP); + mutex_init(&vfsp->vfs_mntpt_lock, NULL, MUTEX_DEFAULT, NULL); + return (vfsp); +} + +void zfsvfs_vfs_free(vfs_t *vfsp) { if (vfsp != NULL) { @@ -220,8 +229,7 @@ zfsvfs_parse_options(char *mntopts, vfs_t **vfsp) vfs_t *tmp_vfsp; int error; - tmp_vfsp = kmem_zalloc(sizeof (vfs_t), KM_SLEEP); - mutex_init(&tmp_vfsp->vfs_mntpt_lock, NULL, MUTEX_DEFAULT, NULL); + tmp_vfsp = zfsvfs_vfs_alloc(); if (mntopts != NULL) { substring_t args[MAX_OPT_ARGS];