]> git.proxmox.com Git - mirror_zfs.git/commitdiff
zfs_dbgmsg_print: make FreeBSD and Linux consistent
authorRob Norris <rob.norris@klarasystems.com>
Fri, 10 May 2024 03:54:08 +0000 (13:54 +1000)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Tue, 14 May 2024 16:48:56 +0000 (09:48 -0700)
FreeBSD was using fprintf(), which might not be signal-safe. Meanwhile,
Linux's locking did not cover the header output. This two quirks are
unrelated, but both have the same response: be like the other one. So
with this commit, both functions are the same except for the names of
their lock and list variables.

Sponsored-by: Klara, Inc.
Sponsored-by: Wasabi Technology, Inc.
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Rob Norris <rob.norris@klarasystems.com>
Closes #16181

module/os/freebsd/zfs/zfs_debug.c
module/os/linux/zfs/zfs_debug.c

index 78d50c6fd8b7293e32ca64d28e56b1faea6933ae..3e832a9104f282140b1522e4c20f802cb1af4778 100644 (file)
@@ -234,13 +234,29 @@ __dprintf(boolean_t dprint, const char *file, const char *func,
 void
 zfs_dbgmsg_print(const char *tag)
 {
-       zfs_dbgmsg_t *zdm;
+       ssize_t ret __attribute__((unused));
 
-       (void) printf("ZFS_DBGMSG(%s):\n", tag);
        mutex_enter(&zfs_dbgmsgs_lock);
-       for (zdm = list_head(&zfs_dbgmsgs); zdm;
+
+       /*
+        * We use write() in this function instead of printf()
+        * so it is safe to call from a signal handler.
+        */
+       ret = write(STDOUT_FILENO, "ZFS_DBGMSG(", 11);
+       ret = write(STDOUT_FILENO, tag, strlen(tag));
+       ret = write(STDOUT_FILENO, ") START:\n", 9);
+
+       for (zfs_dbgmsg_t zdm = list_head(&zfs_dbgmsgs); zdm != NULL;
            zdm = list_next(&zfs_dbgmsgs, zdm))
-               (void) printf("%s\n", zdm->zdm_msg);
+               ret = write(STDOUT_FILENO, zdm->zdm_msg,
+                   strlen(zdm->zdm_msg));
+               ret = write(STDOUT_FILENO, "\n", 1);
+       }
+
+       ret = write(STDOUT_FILENO, "ZFS_DBGMSG(", 11);
+       ret = write(STDOUT_FILENO, tag, strlen(tag));
+       ret = write(STDOUT_FILENO, ") END\n", 6);
+
        mutex_exit(&zfs_dbgmsgs_lock);
 }
 #endif /* _KERNEL */
index f707959c94451b6d88a955c75b285389c26a30a4..bc5c028dca09ac27409795ca5d4e489532078efa 100644 (file)
@@ -225,6 +225,8 @@ zfs_dbgmsg_print(const char *tag)
 {
        ssize_t ret __attribute__((unused));
 
+       mutex_enter(&zfs_dbgmsgs.pl_lock);
+
        /*
         * We use write() in this function instead of printf()
         * so it is safe to call from a signal handler.
@@ -233,7 +235,6 @@ zfs_dbgmsg_print(const char *tag)
        ret = write(STDOUT_FILENO, tag, strlen(tag));
        ret = write(STDOUT_FILENO, ") START:\n", 9);
 
-       mutex_enter(&zfs_dbgmsgs.pl_lock);
        for (zfs_dbgmsg_t *zdm = list_head(&zfs_dbgmsgs.pl_list); zdm != NULL;
            zdm = list_next(&zfs_dbgmsgs.pl_list, zdm)) {
                ret = write(STDOUT_FILENO, zdm->zdm_msg,