From fc285caa841dffa12aa739d7b81a16b51c94f761 Mon Sep 17 00:00:00 2001 From: Rob Norris Date: Thu, 26 Mar 2026 14:19:05 +1100 Subject: [PATCH] linux/vfsops: remove zfs_mnt_t, pass directly A cleanup of opportunity. Since we already are modifying the contents of zfs_mnt_t, we've broken any API guarantee, so we might as well go the rest of the way and get rid of it, and just pass the osname and/or the vfs_t directly. It seems like zfs_mnt_t was never really needed anyway; it was added in 1c2555ef92 (March 2017) to minimise the difference to illumos, but zfs_vfsops was made platform-specific anyway in 7b4e27232d. We also remove setting SB_RDONLY on the caller's flags when failing a read-write remount on a read-only snapshot or pool. Since 0f608aa6ca the caller's flags have been a pointer back to fc->sb_flags, which are discarded without further ceremony when the operation fails, so the change is unnecessary and we can simplify the call further. Sponsored-by: TrueNAS Reviewed-by: Brian Behlendorf Signed-off-by: Rob Norris Closes #18377 --- include/os/linux/zfs/sys/zfs_vfsops_os.h | 10 +++------- module/os/linux/zfs/zfs_vfsops.c | 17 +++++------------ module/os/linux/zfs/zpl_super.c | 11 +++-------- 3 files changed, 11 insertions(+), 27 deletions(-) diff --git a/include/os/linux/zfs/sys/zfs_vfsops_os.h b/include/os/linux/zfs/sys/zfs_vfsops_os.h index d045fbf04..123ea71b4 100644 --- a/include/os/linux/zfs/sys/zfs_vfsops_os.h +++ b/include/os/linux/zfs/sys/zfs_vfsops_os.h @@ -74,11 +74,6 @@ typedef struct vfs { kmutex_t vfs_mntpt_lock; } vfs_t; -typedef struct zfs_mnt { - const char *mnt_osname; /* Objset name */ - vfs_t *mnt_opts; /* Parsed options */ -} zfs_mnt_t; - struct zfsvfs { vfs_t *z_vfs; /* generic fs struct */ struct super_block *z_sb; /* generic super_block */ @@ -250,10 +245,11 @@ 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 int zfs_domount(struct super_block *sb, const char *osname, + vfs_t *mntopts, int silent); extern void zfs_preumount(struct super_block *sb); extern int zfs_umount(struct super_block *sb); -extern int zfs_remount(struct super_block *sb, int *flags, zfs_mnt_t *zm); +extern int zfs_remount(struct super_block *sb, vfs_t *mntopts, int flags); extern int zfs_statvfs(struct inode *ip, struct kstatfs *statp); extern int zfs_vget(struct super_block *sb, struct inode **ipp, fid_t *fidp); extern int zfs_prune(struct super_block *sb, unsigned long nr_to_scan, diff --git a/module/os/linux/zfs/zfs_vfsops.c b/module/os/linux/zfs/zfs_vfsops.c index a5563eee1..a3a7b5f5a 100644 --- a/module/os/linux/zfs/zfs_vfsops.c +++ b/module/os/linux/zfs/zfs_vfsops.c @@ -1316,20 +1316,16 @@ zfsvfs_teardown(zfsvfs_t *zfsvfs, boolean_t unmounting) static atomic_long_t zfs_bdi_seq = ATOMIC_LONG_INIT(0); int -zfs_domount(struct super_block *sb, zfs_mnt_t *zm, int silent) +zfs_domount(struct super_block *sb, const char *osname, + vfs_t *vfs, int silent) { - const char *osname = zm->mnt_osname; struct inode *root_inode = NULL; uint64_t recordsize; int error = 0; zfsvfs_t *zfsvfs = NULL; - vfs_t *vfs = zm->mnt_opts; int canwrite; int dataset_visible_zone; - ASSERT(zm); - ASSERT(osname); - dataset_visible_zone = zone_dataset_visible(osname, &canwrite); /* @@ -1533,19 +1529,16 @@ zfs_umount(struct super_block *sb) } int -zfs_remount(struct super_block *sb, int *flags, zfs_mnt_t *zm) +zfs_remount(struct super_block *sb, vfs_t *vfsp, int flags) { zfsvfs_t *zfsvfs = sb->s_fs_info; - vfs_t *vfsp = zm->mnt_opts; boolean_t issnap = dmu_objset_is_snapshot(zfsvfs->z_os); if ((issnap || !spa_writeable(dmu_objset_spa(zfsvfs->z_os))) && - !(*flags & SB_RDONLY)) { - *flags |= SB_RDONLY; + !(flags & SB_RDONLY)) return (EROFS); - } - if (!zfs_is_readonly(zfsvfs) && (*flags & SB_RDONLY)) + if (!zfs_is_readonly(zfsvfs) && (flags & SB_RDONLY)) txg_wait_synced(dmu_objset_pool(zfsvfs->z_os), 0); zfs_unregister_callbacks(zfsvfs); diff --git a/module/os/linux/zfs/zpl_super.c b/module/os/linux/zfs/zpl_super.c index 6303d1bdd..2cd0f17c8 100644 --- a/module/os/linux/zfs/zpl_super.c +++ b/module/os/linux/zfs/zpl_super.c @@ -880,13 +880,9 @@ zpl_get_tree(struct fs_context *fc) vfs->vfs_do_readonly = B_TRUE; } - zfs_mnt_t zm = { - .mnt_osname = fc->source, - .mnt_opts = vfs, - }; - fstrans_cookie_t cookie = spl_fstrans_mark(); - err = zfs_domount(sb, &zm, fc->sb_flags & SB_SILENT ? 1 : 0); + err = zfs_domount(sb, fc->source, vfs, + fc->sb_flags & SB_SILENT ? 1 : 0); spl_fstrans_unmark(cookie); if (err) { @@ -921,12 +917,11 @@ zpl_get_tree(struct fs_context *fc) static int zpl_reconfigure(struct fs_context *fc) { - zfs_mnt_t zm = { .mnt_osname = NULL, .mnt_opts = fc->fs_private }; fstrans_cookie_t cookie; int error; cookie = spl_fstrans_mark(); - error = -zfs_remount(fc->root->d_sb, &fc->sb_flags, &zm); + error = -zfs_remount(fc->root->d_sb, fc->fs_private, fc->sb_flags); spl_fstrans_unmark(cookie); ASSERT3S(error, <=, 0);