diff options
author | Alejandro Colomar <[email protected]> | 2022-03-05 01:25:22 +0100 |
---|---|---|
committer | GitHub <[email protected]> | 2022-03-04 16:25:22 -0800 |
commit | db7f1a91def6bbaf72dd3e9ad31255efb0bf81ab (patch) | |
tree | 1817651092cca3f549bf229436993cb10736706d /module | |
parent | 06b805067833902613de1871fa01e29fc80c8247 (diff) |
Use _Noreturn (C11; GNU89) properly
A function that returns with no value is a different thing from a
function that doesn't return at all. Those are two orthogonal
concepts, commonly confused.
pthread_create(3) expects a pointer to a start routine that has a
very precise prototype:
void *(*start_routine)(void *);
However, other thread functions, such as kernel ones, expect:
void (*start_routine)(void *);
Providing a different one is incorrect, and has only been working
because the ABIs happen to produce a compatible function.
We should use '_Noreturn void', since it's the natural type, and
then provide a '_Noreturn void *' wrapper for pthread functions.
For consistency, replace most cases of __NORETURN or
__attribute__((noreturn)) by _Noreturn. _Noreturn is understood
by -std=gnu89, so it should be safe to use everywhere.
Ref: https://github.com/openzfs/zfs/pull/13110#discussion_r808450136
Ref: https://software.codidact.com/posts/285972
Reviewed-by: Brian Behlendorf <[email protected]>
Co-authored-by: Ahelenia ZiemiaĆska <[email protected]>
Signed-off-by: Alejandro Colomar <[email protected]>
Closes #13120
Diffstat (limited to 'module')
-rw-r--r-- | module/lua/ldo.c | 2 | ||||
-rw-r--r-- | module/zfs/arc.c | 6 | ||||
-rw-r--r-- | module/zfs/dbuf.c | 2 | ||||
-rw-r--r-- | module/zfs/dmu_recv.c | 2 | ||||
-rw-r--r-- | module/zfs/dmu_redact.c | 4 | ||||
-rw-r--r-- | module/zfs/dmu_send.c | 8 | ||||
-rw-r--r-- | module/zfs/mmp.c | 6 | ||||
-rw-r--r-- | module/zfs/spa.c | 2 | ||||
-rw-r--r-- | module/zfs/txg.c | 8 | ||||
-rw-r--r-- | module/zfs/vdev_initialize.c | 2 | ||||
-rw-r--r-- | module/zfs/vdev_rebuild.c | 4 | ||||
-rw-r--r-- | module/zfs/vdev_removal.c | 4 | ||||
-rw-r--r-- | module/zfs/vdev_trim.c | 6 | ||||
-rw-r--r-- | module/zfs/zthr.c | 2 |
14 files changed, 29 insertions, 29 deletions
diff --git a/module/lua/ldo.c b/module/lua/ldo.c index 01e5d6fd3..2ee9f665d 100644 --- a/module/lua/ldo.c +++ b/module/lua/ldo.c @@ -91,7 +91,7 @@ static intptr_t stack_remaining(void) { typedef struct _label_t { long long unsigned val[JMP_BUF_CNT]; } label_t; int setjmp(label_t *) __attribute__ ((__nothrow__)); -extern void longjmp(label_t *) __attribute__((__noreturn__)); +extern _Noreturn void longjmp(label_t *); #define LUAI_THROW(L,c) longjmp(&(c)->b) #define LUAI_TRY(L,c,a) if (setjmp(&(c)->b) == 0) { a } diff --git a/module/zfs/arc.c b/module/zfs/arc.c index 7ca37c176..744df2423 100644 --- a/module/zfs/arc.c +++ b/module/zfs/arc.c @@ -928,7 +928,7 @@ static unsigned long l2arc_rebuild_blocks_min_l2size = 1024 * 1024 * 1024; /* L2ARC persistence rebuild control routines. */ void l2arc_rebuild_vdev(vdev_t *vd, boolean_t reopen); -static void l2arc_dev_rebuild_thread(void *arg); +static _Noreturn void l2arc_dev_rebuild_thread(void *arg); static int l2arc_rebuild(l2arc_dev_t *dev); /* L2ARC persistence read I/O routines. */ @@ -9706,7 +9706,7 @@ l2arc_hdr_limit_reached(void) * This thread feeds the L2ARC at regular intervals. This is the beating * heart of the L2ARC. */ -static void +static _Noreturn void l2arc_feed_thread(void *unused) { (void) unused; @@ -10145,7 +10145,7 @@ l2arc_spa_rebuild_start(spa_t *spa) /* * Main entry point for L2ARC rebuilding. */ -static void +static _Noreturn void l2arc_dev_rebuild_thread(void *arg) { l2arc_dev_t *dev = arg; diff --git a/module/zfs/dbuf.c b/module/zfs/dbuf.c index 26f0d72b2..cb2b7e5a1 100644 --- a/module/zfs/dbuf.c +++ b/module/zfs/dbuf.c @@ -778,7 +778,7 @@ dbuf_evict_one(void) * of the dbuf cache is at or below the maximum size. Once the dbuf is aged * out of the cache it is destroyed and becomes eligible for arc eviction. */ -static void +static _Noreturn void dbuf_evict_thread(void *unused) { (void) unused; diff --git a/module/zfs/dmu_recv.c b/module/zfs/dmu_recv.c index b507d37c7..b34c1bc69 100644 --- a/module/zfs/dmu_recv.c +++ b/module/zfs/dmu_recv.c @@ -2802,7 +2802,7 @@ receive_process_record(struct receive_writer_arg *rwa, * dmu_recv_stream's worker thread; pull records off the queue, and then call * receive_process_record When we're done, signal the main thread and exit. */ -static void +static _Noreturn void receive_writer_thread(void *arg) { struct receive_writer_arg *rwa = arg; diff --git a/module/zfs/dmu_redact.c b/module/zfs/dmu_redact.c index 46f498289..ab2b5f23e 100644 --- a/module/zfs/dmu_redact.c +++ b/module/zfs/dmu_redact.c @@ -351,7 +351,7 @@ redact_cb(spa_t *spa, zilog_t *zilog, const blkptr_t *bp, return (0); } -static void +static _Noreturn void redact_traverse_thread(void *arg) { struct redact_thread_arg *rt_arg = arg; @@ -837,7 +837,7 @@ struct redact_merge_thread_arg { int error_code; }; -static void +static _Noreturn void redact_merge_thread(void *arg) { struct redact_merge_thread_arg *rmta = arg; diff --git a/module/zfs/dmu_send.c b/module/zfs/dmu_send.c index b388a3c11..021dffefa 100644 --- a/module/zfs/dmu_send.c +++ b/module/zfs/dmu_send.c @@ -1234,7 +1234,7 @@ redact_list_cb(redact_block_phys_t *rb, void *arg) * error code of the thread in case something goes wrong, and pushes the End of * Stream record when the traverse_dataset call has finished. */ -static void +static _Noreturn void send_traverse_thread(void *arg) { struct send_thread_arg *st_arg = arg; @@ -1324,7 +1324,7 @@ get_next_range(bqueue_t *bq, struct send_range *prev) return (next); } -static void +static _Noreturn void redact_list_thread(void *arg) { struct redact_list_thread_arg *rlt_arg = arg; @@ -1519,7 +1519,7 @@ find_next_range(struct send_range **ranges, bqueue_t **qs, uint64_t *out_mask) * data from the redact_list_thread and use that to determine which blocks * should be redacted. */ -static void +static _Noreturn void send_merge_thread(void *arg) { struct send_merge_thread_arg *smt_arg = arg; @@ -1744,7 +1744,7 @@ enqueue_range(struct send_reader_thread_arg *srta, bqueue_t *q, dnode_t *dn, * some indirect blocks can be discarded because they're not holes. Second, * it issues prefetches for the data we need to send. */ -static void +static _Noreturn void send_reader_thread(void *arg) { struct send_reader_thread_arg *srta = arg; diff --git a/module/zfs/mmp.c b/module/zfs/mmp.c index abdce3a32..f8ba21695 100644 --- a/module/zfs/mmp.c +++ b/module/zfs/mmp.c @@ -187,7 +187,7 @@ uint_t zfs_multihost_import_intervals = MMP_DEFAULT_IMPORT_INTERVALS; uint_t zfs_multihost_fail_intervals = MMP_DEFAULT_FAIL_INTERVALS; static void *const mmp_tag = "mmp_write_uberblock"; -static void mmp_thread(void *arg); +static _Noreturn void mmp_thread(void *arg); void mmp_init(spa_t *spa) @@ -217,7 +217,7 @@ mmp_thread_enter(mmp_thread_t *mmp, callb_cpr_t *cpr) mutex_enter(&mmp->mmp_thread_lock); } -static void +static _Noreturn void mmp_thread_exit(mmp_thread_t *mmp, kthread_t **mpp, callb_cpr_t *cpr) { ASSERT(*mpp != NULL); @@ -537,7 +537,7 @@ mmp_write_uberblock(spa_t *spa) zio_nowait(zio); } -static void +static _Noreturn void mmp_thread(void *arg) { spa_t *spa = (spa_t *)arg; diff --git a/module/zfs/spa.c b/module/zfs/spa.c index 881a7c94e..744bcb434 100644 --- a/module/zfs/spa.c +++ b/module/zfs/spa.c @@ -8139,7 +8139,7 @@ spa_async_autoexpand(spa_t *spa, vdev_t *vd) spa_event_notify(vd->vdev_spa, vd, NULL, ESC_ZFS_VDEV_AUTOEXPAND); } -static void +static _Noreturn void spa_async_thread(void *arg) { spa_t *spa = (spa_t *)arg; diff --git a/module/zfs/txg.c b/module/zfs/txg.c index 9655efdc4..7908183ca 100644 --- a/module/zfs/txg.c +++ b/module/zfs/txg.c @@ -108,8 +108,8 @@ * now transition to the syncing state. */ -static void txg_sync_thread(void *arg); -static void txg_quiesce_thread(void *arg); +static _Noreturn void txg_sync_thread(void *arg); +static _Noreturn void txg_quiesce_thread(void *arg); int zfs_txg_timeout = 5; /* max seconds worth of delta per txg */ @@ -514,7 +514,7 @@ txg_has_quiesced_to_sync(dsl_pool_t *dp) return (tx->tx_quiesced_txg != 0); } -static void +static _Noreturn void txg_sync_thread(void *arg) { dsl_pool_t *dp = arg; @@ -605,7 +605,7 @@ txg_sync_thread(void *arg) } } -static void +static _Noreturn void txg_quiesce_thread(void *arg) { dsl_pool_t *dp = arg; diff --git a/module/zfs/vdev_initialize.c b/module/zfs/vdev_initialize.c index ce1385d5a..6c4528e93 100644 --- a/module/zfs/vdev_initialize.c +++ b/module/zfs/vdev_initialize.c @@ -488,7 +488,7 @@ vdev_initialize_range_add(void *arg, uint64_t start, uint64_t size) vdev_xlate_walk(vd, &logical_rs, vdev_initialize_xlate_range_add, arg); } -static void +static _Noreturn void vdev_initialize_thread(void *arg) { vdev_t *vd = arg; diff --git a/module/zfs/vdev_rebuild.c b/module/zfs/vdev_rebuild.c index a6866a8b2..510463b1f 100644 --- a/module/zfs/vdev_rebuild.c +++ b/module/zfs/vdev_rebuild.c @@ -133,7 +133,7 @@ static int zfs_rebuild_scrub_enabled = 1; /* * For vdev_rebuild_initiate_sync() and vdev_rebuild_reset_sync(). */ -static void vdev_rebuild_thread(void *arg); +static _Noreturn void vdev_rebuild_thread(void *arg); /* * Clear the per-vdev rebuild bytes value for a vdev tree. @@ -736,7 +736,7 @@ vdev_rebuild_load(vdev_t *vd) * Each scan thread is responsible for rebuilding a top-level vdev. The * rebuild progress in tracked on-disk in VDEV_TOP_ZAP_VDEV_REBUILD_PHYS. */ -static void +static _Noreturn void vdev_rebuild_thread(void *arg) { vdev_t *vd = arg; diff --git a/module/zfs/vdev_removal.c b/module/zfs/vdev_removal.c index 64be84edd..6887b2f52 100644 --- a/module/zfs/vdev_removal.c +++ b/module/zfs/vdev_removal.c @@ -140,7 +140,7 @@ int zfs_removal_suspend_progress = 0; #define VDEV_REMOVAL_ZAP_OBJS "lzap" -static void spa_vdev_remove_thread(void *arg); +static _Noreturn void spa_vdev_remove_thread(void *arg); static int spa_vdev_remove_cancel_impl(spa_t *spa); static void @@ -1589,7 +1589,7 @@ spa_remove_max_segment(spa_t *spa) * TXG have completed (see spa_txg_zio) and writes the new mappings to disk * (see vdev_mapping_sync()). */ -static void +static _Noreturn void spa_vdev_remove_thread(void *arg) { spa_t *spa = arg; diff --git a/module/zfs/vdev_trim.c b/module/zfs/vdev_trim.c index 39aee3786..77f27406e 100644 --- a/module/zfs/vdev_trim.c +++ b/module/zfs/vdev_trim.c @@ -834,7 +834,7 @@ vdev_trim_range_add(void *arg, uint64_t start, uint64_t size) * by its ms_allocatable. While a metaslab is undergoing trimming it is * not eligible for new allocations. */ -static void +static _Noreturn void vdev_trim_thread(void *arg) { vdev_t *vd = arg; @@ -1175,7 +1175,7 @@ vdev_trim_range_verify(void *arg, uint64_t start, uint64_t size) * N.B. This behavior is different from a manual TRIM where a thread * is created for each leaf vdev, instead of each top-level vdev. */ -static void +static _Noreturn void vdev_autotrim_thread(void *arg) { vdev_t *vd = arg; @@ -1514,7 +1514,7 @@ vdev_autotrim_restart(spa_t *spa) vdev_autotrim(spa); } -static void +static _Noreturn void vdev_trim_l2arc_thread(void *arg) { vdev_t *vd = arg; diff --git a/module/zfs/zthr.c b/module/zfs/zthr.c index 52ddffae7..2cb600a71 100644 --- a/module/zfs/zthr.c +++ b/module/zfs/zthr.c @@ -231,7 +231,7 @@ struct zthr { const char *zthr_name; }; -static void +static _Noreturn void zthr_procedure(void *arg) { zthr_t *t = arg; |