Skip to content

Commit

Permalink
zfs_dbgmsg_print: make FreeBSD and Linux consistent
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Rob Norris <[email protected]>
Closes #16181
  • Loading branch information
robn authored and behlendorf committed May 14, 2024
1 parent 1ea8c59 commit fa99d9c
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 5 deletions.
24 changes: 20 additions & 4 deletions module/os/freebsd/zfs/zfs_debug.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down
3 changes: 2 additions & 1 deletion module/os/linux/zfs/zfs_debug.c
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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,
Expand Down

0 comments on commit fa99d9c

Please sign in to comment.