aboutsummaryrefslogtreecommitdiffstats
path: root/module
diff options
context:
space:
mode:
authorAlejandro Colomar <[email protected]>2022-03-05 01:25:22 +0100
committerGitHub <[email protected]>2022-03-04 16:25:22 -0800
commitdb7f1a91def6bbaf72dd3e9ad31255efb0bf81ab (patch)
tree1817651092cca3f549bf229436993cb10736706d /module
parent06b805067833902613de1871fa01e29fc80c8247 (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.c2
-rw-r--r--module/zfs/arc.c6
-rw-r--r--module/zfs/dbuf.c2
-rw-r--r--module/zfs/dmu_recv.c2
-rw-r--r--module/zfs/dmu_redact.c4
-rw-r--r--module/zfs/dmu_send.c8
-rw-r--r--module/zfs/mmp.c6
-rw-r--r--module/zfs/spa.c2
-rw-r--r--module/zfs/txg.c8
-rw-r--r--module/zfs/vdev_initialize.c2
-rw-r--r--module/zfs/vdev_rebuild.c4
-rw-r--r--module/zfs/vdev_removal.c4
-rw-r--r--module/zfs/vdev_trim.c6
-rw-r--r--module/zfs/zthr.c2
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;