--- //depot/vendor/freebsd/src/sys/kern/kern_fail.c +++ //depot/user/jhb/cleanup/sys/kern/kern_fail.c @@ -130,7 +130,8 @@ if (fp->fp_sleep_fn == NULL) { msleep(fp, &g_fp_mtx, PWAIT, "failpt", timo); } else { - timeout(fp->fp_sleep_fn, fp->fp_sleep_arg, timo); + callout_reset(&fp->fp_timer, timo, fp->fp_sleep_fn, + fp->fp_sleep_arg); *pret = FAIL_POINT_RC_QUEUED; } } @@ -187,6 +188,7 @@ fp->fp_flags |= FAIL_POINT_DYNAMIC_NAME; fp->fp_sleep_fn = NULL; fp->fp_sleep_arg = NULL; + callout_init(&fp->fp_timer, CALLOUT_MPSAFE); } /** @@ -198,6 +200,7 @@ fail_point_destroy(struct fail_point *fp) { + callout_drain(&fp->fp_timer); if ((fp->fp_flags & FAIL_POINT_DYNAMIC_NAME) != 0) { fp_free(__DECONST(void *, fp->fp_name)); fp->fp_name = NULL; --- //depot/vendor/freebsd/src/sys/sys/fail.h +++ //depot/user/jhb/cleanup/sys/sys/fail.h @@ -33,6 +33,7 @@ #define _SYS_FAIL_H_ #include +#include #include #include #include @@ -64,6 +65,7 @@ void (*fp_sleep_fn)(void *); /**< Function to call at end of * sleep for sleep failpoints */ void *fp_sleep_arg; /**< Arg for sleep_fn */ + struct callout fp_timer; }; #define FAIL_POINT_DYNAMIC_NAME 0x01 /**< Must free name on destroy */