mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 10:37:35 +03:00
A few fixes of callback typecasting (for the upcoming ClangCFI)
* zio: avoid callback typecasting * zil: avoid zil_itxg_clean() callback typecasting * zpl: decouple zpl_readpage() into two separate callbacks * nvpair: explicitly declare callbacks for xdr_array() * linux/zfs_nvops: don't use external iput() as a callback * zcp_synctask: don't use fnvlist_free() as a callback * zvol: don't use ops->zv_free() as a callback for taskq_dispatch() Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Mark Maybee <mark.maybee@delphix.com> Signed-off-by: Alexander Lobakin <alobakin@pm.me> Closes #12260
This commit is contained in:
@@ -54,6 +54,12 @@ typedef struct zcp_synctask_info {
|
||||
int blocks_modified;
|
||||
} zcp_synctask_info_t;
|
||||
|
||||
static void
|
||||
zcp_synctask_cleanup(void *arg)
|
||||
{
|
||||
fnvlist_free(arg);
|
||||
}
|
||||
|
||||
/*
|
||||
* Generic synctask interface for channel program syncfuncs.
|
||||
*
|
||||
@@ -275,7 +281,7 @@ zcp_synctask_snapshot(lua_State *state, boolean_t sync, nvlist_t *err_details)
|
||||
fnvlist_add_boolean(ddsa.ddsa_snaps, dsname);
|
||||
|
||||
zcp_cleanup_handler_t *zch = zcp_register_cleanup(state,
|
||||
(zcp_cleanup_t *)&fnvlist_free, ddsa.ddsa_snaps);
|
||||
zcp_synctask_cleanup, ddsa.ddsa_snaps);
|
||||
|
||||
err = zcp_sync_task(state, dsl_dataset_snapshot_check,
|
||||
dsl_dataset_snapshot_sync, &ddsa, sync, dsname);
|
||||
@@ -363,7 +369,7 @@ zcp_synctask_inherit_prop(lua_State *state, boolean_t sync,
|
||||
fnvlist_add_boolean(dpsa->dpsa_props, prop);
|
||||
|
||||
zcp_cleanup_handler_t *zch = zcp_register_cleanup(state,
|
||||
(zcp_cleanup_t *)&fnvlist_free, dpsa->dpsa_props);
|
||||
zcp_synctask_cleanup, dpsa->dpsa_props);
|
||||
|
||||
err = zcp_sync_task(state, zcp_synctask_inherit_prop_check,
|
||||
zcp_synctask_inherit_prop_sync, &zipa, sync, dsname);
|
||||
@@ -402,7 +408,7 @@ zcp_synctask_bookmark(lua_State *state, boolean_t sync, nvlist_t *err_details)
|
||||
fnvlist_add_string(bmarks, new, source);
|
||||
|
||||
zcp_cleanup_handler_t *zch = zcp_register_cleanup(state,
|
||||
(zcp_cleanup_t *)&fnvlist_free, bmarks);
|
||||
zcp_synctask_cleanup, bmarks);
|
||||
|
||||
dsl_bookmark_create_arg_t dbca = {
|
||||
.dbca_bmarks = bmarks,
|
||||
@@ -467,8 +473,7 @@ zcp_synctask_wrapper(lua_State *state)
|
||||
* Make sure err_details is properly freed, even if a fatal error is
|
||||
* thrown during the synctask.
|
||||
*/
|
||||
zch = zcp_register_cleanup(state,
|
||||
(zcp_cleanup_t *)&fnvlist_free, err_details);
|
||||
zch = zcp_register_cleanup(state, zcp_synctask_cleanup, err_details);
|
||||
|
||||
zcp_synctask_info_t *info = lua_touserdata(state, lua_upvalueindex(1));
|
||||
boolean_t sync = lua_toboolean(state, lua_upvalueindex(2));
|
||||
|
||||
+3
-2
@@ -1822,12 +1822,13 @@ zil_itx_destroy(itx_t *itx)
|
||||
* so no locks are needed.
|
||||
*/
|
||||
static void
|
||||
zil_itxg_clean(itxs_t *itxs)
|
||||
zil_itxg_clean(void *arg)
|
||||
{
|
||||
itx_t *itx;
|
||||
list_t *list;
|
||||
avl_tree_t *t;
|
||||
void *cookie;
|
||||
itxs_t *itxs = arg;
|
||||
itx_async_node_t *ian;
|
||||
|
||||
list = &itxs->i_sync_list;
|
||||
@@ -2047,7 +2048,7 @@ zil_clean(zilog_t *zilog, uint64_t synced_txg)
|
||||
ASSERT3P(zilog->zl_dmu_pool, !=, NULL);
|
||||
ASSERT3P(zilog->zl_dmu_pool->dp_zil_clean_taskq, !=, NULL);
|
||||
taskqid_t id = taskq_dispatch(zilog->zl_dmu_pool->dp_zil_clean_taskq,
|
||||
(void (*)(void *))zil_itxg_clean, clean_me, TQ_NOSLEEP);
|
||||
zil_itxg_clean, clean_me, TQ_NOSLEEP);
|
||||
if (id == TASKQID_INVALID)
|
||||
zil_itxg_clean(clean_me);
|
||||
}
|
||||
|
||||
+9
-9
@@ -1891,8 +1891,8 @@ zio_taskq_dispatch(zio_t *zio, zio_taskq_type_t q, boolean_t cutinline)
|
||||
* to dispatch the zio to another taskq at the same time.
|
||||
*/
|
||||
ASSERT(taskq_empty_ent(&zio->io_tqent));
|
||||
spa_taskq_dispatch_ent(spa, t, q, (task_func_t *)zio_execute, zio,
|
||||
flags, &zio->io_tqent);
|
||||
spa_taskq_dispatch_ent(spa, t, q, zio_execute, zio, flags,
|
||||
&zio->io_tqent);
|
||||
}
|
||||
|
||||
static boolean_t
|
||||
@@ -1923,7 +1923,7 @@ zio_issue_async(zio_t *zio)
|
||||
}
|
||||
|
||||
void
|
||||
zio_interrupt(zio_t *zio)
|
||||
zio_interrupt(void *zio)
|
||||
{
|
||||
zio_taskq_dispatch(zio, ZIO_TASKQ_INTERRUPT, B_FALSE);
|
||||
}
|
||||
@@ -1981,8 +1981,8 @@ zio_delay_interrupt(zio_t *zio)
|
||||
* OpenZFS's timeout_generic().
|
||||
*/
|
||||
tid = taskq_dispatch_delay(system_taskq,
|
||||
(task_func_t *)zio_interrupt,
|
||||
zio, TQ_NOSLEEP, expire_at_tick);
|
||||
zio_interrupt, zio, TQ_NOSLEEP,
|
||||
expire_at_tick);
|
||||
if (tid == TASKQID_INVALID) {
|
||||
/*
|
||||
* Couldn't allocate a task. Just
|
||||
@@ -2103,7 +2103,7 @@ static zio_pipe_stage_t *zio_pipeline[];
|
||||
* it is externally visible.
|
||||
*/
|
||||
void
|
||||
zio_execute(zio_t *zio)
|
||||
zio_execute(void *zio)
|
||||
{
|
||||
fstrans_cookie_t cookie;
|
||||
|
||||
@@ -2292,8 +2292,9 @@ zio_nowait(zio_t *zio)
|
||||
*/
|
||||
|
||||
static void
|
||||
zio_reexecute(zio_t *pio)
|
||||
zio_reexecute(void *arg)
|
||||
{
|
||||
zio_t *pio = arg;
|
||||
zio_t *cio, *cio_next;
|
||||
|
||||
ASSERT(pio->io_child_type == ZIO_CHILD_LOGICAL);
|
||||
@@ -4788,8 +4789,7 @@ zio_done(zio_t *zio)
|
||||
ASSERT(taskq_empty_ent(&zio->io_tqent));
|
||||
spa_taskq_dispatch_ent(zio->io_spa,
|
||||
ZIO_TYPE_CLAIM, ZIO_TASKQ_ISSUE,
|
||||
(task_func_t *)zio_reexecute, zio, 0,
|
||||
&zio->io_tqent);
|
||||
zio_reexecute, zio, 0, &zio->io_tqent);
|
||||
}
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
+8
-2
@@ -1195,6 +1195,12 @@ zvol_create_minor(const char *name)
|
||||
* Remove minors for specified dataset including children and snapshots.
|
||||
*/
|
||||
|
||||
static void
|
||||
zvol_free_task(void *arg)
|
||||
{
|
||||
ops->zv_free(arg);
|
||||
}
|
||||
|
||||
void
|
||||
zvol_remove_minors_impl(const char *name)
|
||||
{
|
||||
@@ -1243,8 +1249,8 @@ zvol_remove_minors_impl(const char *name)
|
||||
mutex_exit(&zv->zv_state_lock);
|
||||
|
||||
/* Try parallel zv_free, if failed do it in place */
|
||||
t = taskq_dispatch(system_taskq,
|
||||
(task_func_t *)ops->zv_free, zv, TQ_SLEEP);
|
||||
t = taskq_dispatch(system_taskq, zvol_free_task, zv,
|
||||
TQ_SLEEP);
|
||||
if (t == TASKQID_INVALID)
|
||||
list_insert_head(&free_list, zv);
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user