Author: mjg
Date: Wed Nov  4 21:19:54 2020
New Revision: 367345
URL: https://svnweb.freebsd.org/changeset/base/367345

Log:
  zfs: macroify teardown handling

Modified:
  head/sys/contrib/openzfs/include/os/freebsd/zfs/sys/zfs_vfsops_os.h
  head/sys/contrib/openzfs/include/os/freebsd/zfs/sys/zfs_znode_impl.h
  head/sys/contrib/openzfs/include/os/linux/zfs/sys/zfs_znode_impl.h
  head/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_dir.c
  head/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vfsops.c
  head/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vnops.c
  head/sys/contrib/openzfs/module/os/linux/zfs/zfs_vfsops.c
  head/sys/contrib/openzfs/module/zfs/zfs_ioctl.c

Modified: head/sys/contrib/openzfs/include/os/freebsd/zfs/sys/zfs_vfsops_os.h
==============================================================================
--- head/sys/contrib/openzfs/include/os/freebsd/zfs/sys/zfs_vfsops_os.h Wed Nov 
 4 21:19:25 2020        (r367344)
+++ head/sys/contrib/openzfs/include/os/freebsd/zfs/sys/zfs_vfsops_os.h Wed Nov 
 4 21:19:54 2020        (r367345)
@@ -46,10 +46,12 @@
 extern "C" {
 #endif
 
+#define        zfs_teardown_lock_t             rrmlock_t
+
 #ifdef TEARDOWN_INACTIVE_RMS
-typedef struct rmslock zfs_teardown_lock_t;
+typedef struct rmslock zfs_teardown_inactive_lock_t;
 #else
-#define        zfs_teardown_lock_t krwlock_t
+#define        zfs_teardown_inactive_lock_t krwlock_t
 #endif
 
 typedef struct zfsvfs zfsvfs_t;
@@ -80,8 +82,8 @@ struct zfsvfs {
        int             z_norm;         /* normalization flags */
        boolean_t       z_atime;        /* enable atimes mount option */
        boolean_t       z_unmounted;    /* unmounted */
-       rrmlock_t       z_teardown_lock;
-       zfs_teardown_lock_t z_teardown_inactive_lock;
+       zfs_teardown_lock_t z_teardown_lock;
+       zfs_teardown_inactive_lock_t z_teardown_inactive_lock;
        list_t          z_all_znodes;   /* all vnodes in the fs */
        uint64_t        z_nr_znodes;    /* number of znodes in the fs */
        kmutex_t        z_znodes_lock;  /* lock for z_all_znodes */
@@ -111,6 +113,39 @@ struct zfsvfs {
        kmutex_t        z_hold_mtx[ZFS_OBJ_MTX_SZ];     /* znode hold locks */
        struct task     z_unlinked_drain_task;
 };
+
+#define        ZFS_TEARDOWN_INIT(zfsvfs)               \
+       rrm_init(&(zfsvfs)->z_teardown_lock, B_FALSE)
+
+#define        ZFS_TEARDOWN_DESTROY(zfsvfs)            \
+       rrm_destroy(&(zfsvfs)->z_teardown_lock)
+
+#define        ZFS_TEARDOWN_TRY_ENTER_READ(zfsvfs)     \
+       rw_tryenter(&(zfsvfs)->z_teardown_lock, RW_READER)
+
+#define        ZFS_TEARDOWN_ENTER_READ(zfsvfs, tag)    \
+       rrm_enter_read(&(zfsvfs)->z_teardown_lock, tag);
+
+#define        ZFS_TEARDOWN_EXIT_READ(zfsvfs, tag)     \
+       rrm_exit(&(zfsvfs)->z_teardown_lock, tag)
+
+#define        ZFS_TEARDOWN_ENTER_WRITE(zfsvfs, tag)   \
+       rrm_enter(&(zfsvfs)->z_teardown_lock, RW_WRITER, tag)
+
+#define        ZFS_TEARDOWN_EXIT_WRITE(zfsvfs)         \
+       rrm_exit(&(zfsvfs)->z_teardown_lock, tag)
+
+#define        ZFS_TEARDOWN_EXIT(zfsvfs, tag)          \
+       rrm_exit(&(zfsvfs)->z_teardown_lock, tag)
+
+#define        ZFS_TEARDOWN_READ_HELD(zfsvfs)          \
+       RRM_READ_HELD(&(zfsvfs)->z_teardown_lock)
+
+#define        ZFS_TEARDOWN_WRITE_HELD(zfsvfs)         \
+       RRM_WRITE_HELD(&(zfsvfs)->z_teardown_lock)
+
+#define        ZFS_TEARDOWN_HELD(zfsvfs)               \
+       RRM_LOCK_HELD(&(zfsvfs)->z_teardown_lock)
 
 #ifdef TEARDOWN_INACTIVE_RMS
 #define        ZFS_TEARDOWN_INACTIVE_INIT(zfsvfs)              \

Modified: head/sys/contrib/openzfs/include/os/freebsd/zfs/sys/zfs_znode_impl.h
==============================================================================
--- head/sys/contrib/openzfs/include/os/freebsd/zfs/sys/zfs_znode_impl.h        
Wed Nov  4 21:19:25 2020        (r367344)
+++ head/sys/contrib/openzfs/include/os/freebsd/zfs/sys/zfs_znode_impl.h        
Wed Nov  4 21:19:54 2020        (r367345)
@@ -118,15 +118,15 @@ extern minor_t zfsdev_minor_alloc(void);
 /* Called on entry to each ZFS vnode and vfs operation  */
 #define        ZFS_ENTER(zfsvfs) \
        { \
-               rrm_enter_read(&(zfsvfs)->z_teardown_lock, FTAG); \
+               ZFS_TEARDOWN_ENTER_READ((zfsvfs), FTAG); \
                if (__predict_false((zfsvfs)->z_unmounted)) { \
-                       ZFS_EXIT(zfsvfs); \
+                       ZFS_TEARDOWN_EXIT_READ(zfsvfs, FTAG); \
                        return (EIO); \
                } \
        }
 
 /* Must be called before exiting the vop */
-#define        ZFS_EXIT(zfsvfs) rrm_exit(&(zfsvfs)->z_teardown_lock, FTAG)
+#define        ZFS_EXIT(zfsvfs) ZFS_TEARDOWN_EXIT_READ(zfsvfs, FTAG)
 
 /* Verifies the znode is valid */
 #define        ZFS_VERIFY_ZP(zp) \

Modified: head/sys/contrib/openzfs/include/os/linux/zfs/sys/zfs_znode_impl.h
==============================================================================
--- head/sys/contrib/openzfs/include/os/linux/zfs/sys/zfs_znode_impl.h  Wed Nov 
 4 21:19:25 2020        (r367344)
+++ head/sys/contrib/openzfs/include/os/linux/zfs/sys/zfs_znode_impl.h  Wed Nov 
 4 21:19:54 2020        (r367345)
@@ -75,9 +75,9 @@ extern "C" {
 /* Called on entry to each ZFS inode and vfs operation. */
 #define        ZFS_ENTER_ERROR(zfsvfs, error)                          \
 do {                                                           \
-       rrm_enter_read(&(zfsvfs)->z_teardown_lock, FTAG);       \
+       ZFS_TEARDOWN_ENTER_READ(zfsvfs, FTAG);                  \
        if (unlikely((zfsvfs)->z_unmounted)) {                  \
-               ZFS_EXIT(zfsvfs);                               \
+               ZFS_EXIT_READ(zfsvfs, FTAG);                    \
                return (error);                                 \
        }                                                       \
 } while (0)
@@ -88,7 +88,7 @@ do {                                                          
\
 #define        ZFS_EXIT(zfsvfs)                                        \
 do {                                                           \
        zfs_exit_fs(zfsvfs);                                    \
-       rrm_exit(&(zfsvfs)->z_teardown_lock, FTAG);             \
+       ZFS_EXIT_READ(zfsvfs, FTAG);                            \
 } while (0)
 #define        ZPL_EXIT(zfsvfs)        ZFS_EXIT(zfsvfs)
 

Modified: head/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_dir.c
==============================================================================
--- head/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_dir.c    Wed Nov  4 
21:19:25 2020        (r367344)
+++ head/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_dir.c    Wed Nov  4 
21:19:54 2020        (r367345)
@@ -209,7 +209,7 @@ zfs_dd_lookup(znode_t *dzp, znode_t **zpp)
 #ifdef ZFS_DEBUG
        if (zfsvfs->z_replay == B_FALSE)
                ASSERT_VOP_LOCKED(ZTOV(dzp), __func__);
-       ASSERT(RRM_READ_HELD(&zfsvfs->z_teardown_lock));
+       ASSERT(ZFS_TEARDOWN_READ_HELD(zfsvfs));
 #endif
        if (dzp->z_unlinked)
                return (ENOENT);
@@ -234,7 +234,7 @@ zfs_dirlook(znode_t *dzp, const char *name, znode_t **
 #ifdef ZFS_DEBUG
        if (zfsvfs->z_replay == B_FALSE)
                ASSERT_VOP_LOCKED(ZTOV(dzp), __func__);
-       ASSERT(RRM_READ_HELD(&zfsvfs->z_teardown_lock));
+       ASSERT(ZFS_TEARDOWN_READ_HELD(zfsvfs));
 #endif
        if (dzp->z_unlinked)
                return (SET_ERROR(ENOENT));

Modified: head/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vfsops.c
==============================================================================
--- head/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vfsops.c Wed Nov  4 
21:19:25 2020        (r367344)
+++ head/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vfsops.c Wed Nov  4 
21:19:54 2020        (r367345)
@@ -985,11 +985,7 @@ zfsvfs_create_impl(zfsvfs_t **zfvp, zfsvfs_t *zfsvfs, 
            offsetof(znode_t, z_link_node));
        TASK_INIT(&zfsvfs->z_unlinked_drain_task, 0,
            zfsvfs_task_unlinked_drain, zfsvfs);
-#ifdef DIAGNOSTIC
-       rrm_init(&zfsvfs->z_teardown_lock, B_TRUE);
-#else
-       rrm_init(&zfsvfs->z_teardown_lock, B_FALSE);
-#endif
+       ZFS_TEARDOWN_INIT(zfsvfs);
        ZFS_TEARDOWN_INACTIVE_INIT(zfsvfs);
        rw_init(&zfsvfs->z_fuid_lock, NULL, RW_DEFAULT, NULL);
        for (int i = 0; i != ZFS_OBJ_MTX_SZ; i++)
@@ -1129,7 +1125,7 @@ zfsvfs_free(zfsvfs_t *zfsvfs)
        mutex_destroy(&zfsvfs->z_lock);
        ASSERT(zfsvfs->z_nr_znodes == 0);
        list_destroy(&zfsvfs->z_all_znodes);
-       rrm_destroy(&zfsvfs->z_teardown_lock);
+       ZFS_TEARDOWN_DESTROY(zfsvfs);
        ZFS_TEARDOWN_INACTIVE_DESTROY(zfsvfs);
        rw_destroy(&zfsvfs->z_fuid_lock);
        for (i = 0; i != ZFS_OBJ_MTX_SZ; i++)
@@ -1381,10 +1377,10 @@ zfs_mount(vfs_t *vfsp)
                 * manipulations between entry to zfs_suspend_fs() and return
                 * from zfs_resume_fs().
                 */
-               rrm_enter(&zfsvfs->z_teardown_lock, RW_WRITER, FTAG);
+               ZFS_TEARDOWN_ENTER_WRITE(zfsvfs, FTAG);
                zfs_unregister_callbacks(zfsvfs);
                error = zfs_register_callbacks(vfsp);
-               rrm_exit(&zfsvfs->z_teardown_lock, FTAG);
+               ZFS_TEARDOWN_EXIT(zfsvfs, FTAG);
                goto out;
        }
 
@@ -1530,7 +1526,7 @@ zfsvfs_teardown(zfsvfs_t *zfsvfs, boolean_t unmounting
                                break;
                }
        }
-       rrm_enter(&zfsvfs->z_teardown_lock, RW_WRITER, FTAG);
+       ZFS_TEARDOWN_ENTER_WRITE(zfsvfs, FTAG);
 
        if (!unmounting) {
                /*
@@ -1566,7 +1562,7 @@ zfsvfs_teardown(zfsvfs_t *zfsvfs, boolean_t unmounting
         */
        if (!unmounting && (zfsvfs->z_unmounted || zfsvfs->z_os == NULL)) {
                ZFS_TEARDOWN_INACTIVE_EXIT_WRITE(zfsvfs);
-               rrm_exit(&zfsvfs->z_teardown_lock, FTAG);
+               ZFS_TEARDOWN_EXIT(zfsvfs, FTAG);
                return (SET_ERROR(EIO));
        }
 
@@ -1594,7 +1590,7 @@ zfsvfs_teardown(zfsvfs_t *zfsvfs, boolean_t unmounting
        if (unmounting) {
                zfsvfs->z_unmounted = B_TRUE;
                ZFS_TEARDOWN_INACTIVE_EXIT_WRITE(zfsvfs);
-               rrm_exit(&zfsvfs->z_teardown_lock, FTAG);
+               ZFS_TEARDOWN_EXIT(zfsvfs, FTAG);
        }
 
        /*
@@ -1654,9 +1650,9 @@ zfs_umount(vfs_t *vfsp, int fflag)
                 * vflush(FORCECLOSE). This way we ensure no future vnops
                 * will be called and risk operating on DOOMED vnodes.
                 */
-               rrm_enter(&zfsvfs->z_teardown_lock, RW_WRITER, FTAG);
+               ZFS_TEARDOWN_ENTER_WRITE(zfsvfs, FTAG);
                zfsvfs->z_unmounted = B_TRUE;
-               rrm_exit(&zfsvfs->z_teardown_lock, FTAG);
+               ZFS_TEARDOWN_EXIT(zfsvfs, FTAG);
        }
 
        /*
@@ -1912,7 +1908,7 @@ zfs_resume_fs(zfsvfs_t *zfsvfs, dsl_dataset_t *ds)
        int err;
        znode_t *zp;
 
-       ASSERT(RRM_WRITE_HELD(&zfsvfs->z_teardown_lock));
+       ASSERT(ZFS_TEARDOWN_WRITE_HELD(zfsvfs));
        ASSERT(ZFS_TEARDOWN_INACTIVE_WRITE_HELD(zfsvfs));
 
        /*
@@ -1952,7 +1948,7 @@ zfs_resume_fs(zfsvfs_t *zfsvfs, dsl_dataset_t *ds)
 bail:
        /* release the VOPs */
        ZFS_TEARDOWN_INACTIVE_EXIT_WRITE(zfsvfs);
-       rrm_exit(&zfsvfs->z_teardown_lock, FTAG);
+       ZFS_TEARDOWN_EXIT(zfsvfs, FTAG);
 
        if (err) {
                /*
@@ -2067,7 +2063,7 @@ zfs_busy(void)
 int
 zfs_end_fs(zfsvfs_t *zfsvfs, dsl_dataset_t *ds)
 {
-       ASSERT(RRM_WRITE_HELD(&zfsvfs->z_teardown_lock));
+       ASSERT(ZFS_TEARDOWN_WRITE_HELD(zfsvfs));
        ASSERT(ZFS_TEARDOWN_INACTIVE_WRITE_HELD(zfsvfs));
 
        /*
@@ -2085,7 +2081,7 @@ zfs_end_fs(zfsvfs_t *zfsvfs, dsl_dataset_t *ds)
 
        /* release the VOPs */
        ZFS_TEARDOWN_INACTIVE_EXIT_WRITE(zfsvfs);
-       rrm_exit(&zfsvfs->z_teardown_lock, FTAG);
+       ZFS_TEARDOWN_EXIT(zfsvfs, FTAG);
 
        /*
         * Try to force unmount this file system.

Modified: head/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vnops.c
==============================================================================
--- head/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vnops.c  Wed Nov  4 
21:19:25 2020        (r367344)
+++ head/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vnops.c  Wed Nov  4 
21:19:54 2020        (r367345)
@@ -1453,7 +1453,7 @@ zfs_lookup_lock(vnode_t *dvp, vnode_t *vp, const char 
                ASSERT_VOP_LOCKED(dvp, __func__);
 #ifdef DIAGNOSTIC
        if ((zdp->z_pflags & ZFS_XATTR) == 0)
-               VERIFY(!RRM_LOCK_HELD(&zfsvfs->z_teardown_lock));
+               VERIFY(!ZFS_TEARDOWN_HELD(zfsvfs));
 #endif
 
        if (name[0] == 0 || (name[0] == '.' && name[1] == 0)) {
@@ -6550,7 +6550,7 @@ zfs_lock(struct vop_lock1_args *ap)
                zp = vp->v_data;
                if (vp->v_mount != NULL && !VN_IS_DOOMED(vp) &&
                    zp != NULL && (zp->z_pflags & ZFS_XATTR) == 0)
-                       VERIFY(!RRM_LOCK_HELD(&zp->z_zfsvfs->z_teardown_lock));
+                       VERIFY(!ZFS_TEARDOWN_HELD(zp->z_zfsvfs));
        }
        return (err);
 }

Modified: head/sys/contrib/openzfs/module/os/linux/zfs/zfs_vfsops.c
==============================================================================
--- head/sys/contrib/openzfs/module/os/linux/zfs/zfs_vfsops.c   Wed Nov  4 
21:19:25 2020        (r367344)
+++ head/sys/contrib/openzfs/module/os/linux/zfs/zfs_vfsops.c   Wed Nov  4 
21:19:54 2020        (r367345)
@@ -815,7 +815,7 @@ zfsvfs_create_impl(zfsvfs_t **zfvp, zfsvfs_t *zfsvfs, 
        mutex_init(&zfsvfs->z_lock, NULL, MUTEX_DEFAULT, NULL);
        list_create(&zfsvfs->z_all_znodes, sizeof (znode_t),
            offsetof(znode_t, z_link_node));
-       rrm_init(&zfsvfs->z_teardown_lock, B_FALSE);
+       ZFS_TEARDOWN_INIT(zfsvfs);
        rw_init(&zfsvfs->z_teardown_inactive_lock, NULL, RW_DEFAULT, NULL);
        rw_init(&zfsvfs->z_fuid_lock, NULL, RW_DEFAULT, NULL);
 
@@ -951,7 +951,7 @@ zfsvfs_free(zfsvfs_t *zfsvfs)
        mutex_destroy(&zfsvfs->z_znodes_lock);
        mutex_destroy(&zfsvfs->z_lock);
        list_destroy(&zfsvfs->z_all_znodes);
-       rrm_destroy(&zfsvfs->z_teardown_lock);
+       ZFS_TEARDOWN_DESTROY(zfsvfs);
        rw_destroy(&zfsvfs->z_teardown_inactive_lock);
        rw_destroy(&zfsvfs->z_fuid_lock);
        for (i = 0; i != size; i++) {
@@ -1336,7 +1336,7 @@ zfsvfs_teardown(zfsvfs_t *zfsvfs, boolean_t unmounting
                }
        }
 
-       rrm_enter(&zfsvfs->z_teardown_lock, RW_WRITER, FTAG);
+       ZFS_TEARDOWN_ENTER_WRITE(zfsvfs, FTAG);
 
        if (!unmounting) {
                /*
@@ -1367,7 +1367,7 @@ zfsvfs_teardown(zfsvfs_t *zfsvfs, boolean_t unmounting
         */
        if (!unmounting && (zfsvfs->z_unmounted || zfsvfs->z_os == NULL)) {
                rw_exit(&zfsvfs->z_teardown_inactive_lock);
-               rrm_exit(&zfsvfs->z_teardown_lock, FTAG);
+               ZFS_TEARDOWN_EXIT(zfsvfs, FTAG);
                return (SET_ERROR(EIO));
        }
 
@@ -1404,7 +1404,7 @@ zfsvfs_teardown(zfsvfs_t *zfsvfs, boolean_t unmounting
        if (unmounting) {
                zfsvfs->z_unmounted = B_TRUE;
                rw_exit(&zfsvfs->z_teardown_inactive_lock);
-               rrm_exit(&zfsvfs->z_teardown_lock, FTAG);
+               ZFS_TEARDOWN_EXIT(zfsvfs, FTAG);
        }
 
        /*
@@ -1810,7 +1810,7 @@ zfs_resume_fs(zfsvfs_t *zfsvfs, dsl_dataset_t *ds)
        int err, err2;
        znode_t *zp;
 
-       ASSERT(RRM_WRITE_HELD(&zfsvfs->z_teardown_lock));
+       ASSERT(ZFS_TEARDOWN_WRITE_HELD(zfsvfs));
        ASSERT(RW_WRITE_HELD(&zfsvfs->z_teardown_inactive_lock));
 
        /*
@@ -1886,7 +1886,7 @@ bail:
 
        /* release the VFS ops */
        rw_exit(&zfsvfs->z_teardown_inactive_lock);
-       rrm_exit(&zfsvfs->z_teardown_lock, FTAG);
+       ZFS_TEARDOWN_EXIT(zfsvfs, FTAG);
 
        if (err != 0) {
                /*
@@ -1905,7 +1905,7 @@ bail:
 int
 zfs_end_fs(zfsvfs_t *zfsvfs, dsl_dataset_t *ds)
 {
-       ASSERT(RRM_WRITE_HELD(&zfsvfs->z_teardown_lock));
+       ASSERT(ZFS_TEARDOWN_WRITE_HELD(zfsvfs));
        ASSERT(RW_WRITE_HELD(&zfsvfs->z_teardown_inactive_lock));
 
        /*
@@ -1923,7 +1923,7 @@ zfs_end_fs(zfsvfs_t *zfsvfs, dsl_dataset_t *ds)
 
        /* release the VOPs */
        rw_exit(&zfsvfs->z_teardown_inactive_lock);
-       rrm_exit(&zfsvfs->z_teardown_lock, FTAG);
+       ZFS_TEARDOWN_EXIT(zfsvfs, FTAG);
 
        /*
         * Try to force unmount this file system.

Modified: head/sys/contrib/openzfs/module/zfs/zfs_ioctl.c
==============================================================================
--- head/sys/contrib/openzfs/module/zfs/zfs_ioctl.c     Wed Nov  4 21:19:25 
2020        (r367344)
+++ head/sys/contrib/openzfs/module/zfs/zfs_ioctl.c     Wed Nov  4 21:19:54 
2020        (r367345)
@@ -1407,15 +1407,17 @@ zfsvfs_hold(const char *name, void *tag, zfsvfs_t **zf
        if (getzfsvfs(name, zfvp) != 0)
                error = zfsvfs_create(name, B_FALSE, zfvp);
        if (error == 0) {
-               rrm_enter(&(*zfvp)->z_teardown_lock, (writer) ? RW_WRITER :
-                   RW_READER, tag);
+               if (writer)
+                       ZFS_TEARDOWN_ENTER_WRITE(*zfvp, tag);
+               else
+                       ZFS_TEARDOWN_ENTER_READ(*zfvp, tag);
                if ((*zfvp)->z_unmounted) {
                        /*
                         * XXX we could probably try again, since the unmounting
                         * thread should be just about to disassociate the
                         * objset from the zfsvfs.
                         */
-                       rrm_exit(&(*zfvp)->z_teardown_lock, tag);
+                       ZFS_TEARDOWN_EXIT(*zfvp, tag);
                        return (SET_ERROR(EBUSY));
                }
        }
@@ -1425,7 +1427,7 @@ zfsvfs_hold(const char *name, void *tag, zfsvfs_t **zf
 static void
 zfsvfs_rele(zfsvfs_t *zfsvfs, void *tag)
 {
-       rrm_exit(&zfsvfs->z_teardown_lock, tag);
+       ZFS_TEARDOWN_EXIT(zfsvfs, tag);
 
        if (zfs_vfs_held(zfsvfs)) {
                zfs_vfs_rele(zfsvfs);
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to