From 5d806c93da17a5d2a33c6a8ce7612064fd67eaf5 Mon Sep 17 00:00:00 2001 From: jharmening Date: Fri, 4 Jun 2021 13:11:08 -0700 Subject: [PATCH] FreeBSD: incorporate changes to the VFS_QUOTACTL(9) KPI VFS_QUOTACTL(9) has been updated to allow each filesystem to indicate whether it has changed the busy state of the mount. The filesystem may still assume that its .vfs_quotactl entrypoint is always called with the mount busied, but only needs to unbusy the mount (and clear *mp_busy) if it does something that actually requires the mount to be unbusied. It no longer needs to blindly copy-paste the UFS protocol for calling vfs_unbusy(9) for the Q_QUOTAOFF and Q_QUOTAON commands. Reviewed-by: Brian Behlendorf Reviewed-by: Ryan Moeller Signed-off-by: Jason Harmening Closes #12052 --- module/os/freebsd/zfs/zfs_vfsops.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/module/os/freebsd/zfs/zfs_vfsops.c b/module/os/freebsd/zfs/zfs_vfsops.c index a537342f9678..4f2d7df87fc0 100644 --- a/module/os/freebsd/zfs/zfs_vfsops.c +++ b/module/os/freebsd/zfs/zfs_vfsops.c @@ -102,7 +102,12 @@ SYSCTL_INT(_vfs_zfs_version, OID_AUTO, zpl, CTLFLAG_RD, &zfs_version_zpl, 0, "ZPL_VERSION"); /* END CSTYLED */ +#if __FreeBSD_version >= 1400018 +static int zfs_quotactl(vfs_t *vfsp, int cmds, uid_t id, void *arg, + bool *mp_busy); +#else static int zfs_quotactl(vfs_t *vfsp, int cmds, uid_t id, void *arg); +#endif static int zfs_mount(vfs_t *vfsp); static int zfs_umount(vfs_t *vfsp, int fflag); static int zfs_root(vfs_t *vfsp, int flags, vnode_t **vpp); @@ -267,7 +272,11 @@ zfs_getquota(zfsvfs_t *zfsvfs, uid_t id, int isgroup, struct dqblk64 *dqp) } static int +#if __FreeBSD_version >= 1400018 +zfs_quotactl(vfs_t *vfsp, int cmds, uid_t id, void *arg, bool *mp_busy) +#else zfs_quotactl(vfs_t *vfsp, int cmds, uid_t id, void *arg) +#endif { zfsvfs_t *zfsvfs = vfsp->vfs_data; struct thread *td; @@ -291,8 +300,10 @@ zfs_quotactl(vfs_t *vfsp, int cmds, uid_t id, void *arg) break; default: error = EINVAL; +#if __FreeBSD_version < 1400018 if (cmd == Q_QUOTAON || cmd == Q_QUOTAOFF) vfs_unbusy(vfsp); +#endif goto done; } } @@ -351,11 +362,15 @@ zfs_quotactl(vfs_t *vfsp, int cmds, uid_t id, void *arg) case Q_QUOTAON: // As far as I can tell, you can't turn quotas on or off on zfs error = 0; +#if __FreeBSD_version < 1400018 vfs_unbusy(vfsp); +#endif break; case Q_QUOTAOFF: error = ENOTSUP; +#if __FreeBSD_version < 1400018 vfs_unbusy(vfsp); +#endif break; case Q_SETQUOTA: error = copyin(arg, &dqblk, sizeof (dqblk));