Skip to content
Permalink
Browse files

Fix strdup conflict on other platforms

In the FreeBSD kernel the strdup signature is:

```
char	*strdup(const char *__restrict, struct malloc_type *);
```

It's unfortunate that the developers have chosen to change
the signature of libc functions - but it's what I have to
deal with.

Signed-off-by: Matt Macy <mmacy@FreeBSD.org>
  • Loading branch information...
mattmacy committed Oct 9, 2019
1 parent 381d91d commit 9dc4ca5ef96b1951dd210e70b4d1c8deb386a185
@@ -2863,7 +2863,7 @@ ztest_spa_upgrade(ztest_ds_t *zd, uint64_t id)
zpool_prop_to_name(ZPOOL_PROP_VERSION)));
spa_close(spa, FTAG);

strfree(name);
kmem_strfree(name);
mutex_exit(&ztest_vdev_lock);
}

@@ -32,8 +32,8 @@
extern int kmem_debugging(void);
extern char *kmem_vasprintf(const char *fmt, va_list ap);
extern char *kmem_asprintf(const char *fmt, ...);
extern char *strdup(const char *str);
extern void strfree(char *str);
extern char *kmem_strdup(const char *str);
extern void kmem_strfree(char *str);

/*
* Memory allocation interfaces
@@ -722,7 +722,8 @@ extern uint32_t zone_get_hostid(void *zonep);

extern char *kmem_vasprintf(const char *fmt, va_list adx);
extern char *kmem_asprintf(const char *fmt, ...);
#define strfree(str) kmem_free((str), strlen(str) + 1)
#define kmem_strfree(str) kmem_free((str), strlen(str) + 1)
#define kmem_strdup(s) strdup(s)

/*
* Hostname information
@@ -261,7 +261,7 @@ crypto_register_provider(crypto_provider_info_t *info,
prov_desc->pd_kstat->ks_update = kcf_prov_kstat_update;
kstat_install(prov_desc->pd_kstat);
}
strfree(ks_name);
kmem_strfree(ks_name);
}

if (prov_desc->pd_prov_type == CRYPTO_HW_PROVIDER)
@@ -120,18 +120,18 @@ __strdup(const char *str, int flags)
}

char *
strdup(const char *str)
kmem_strdup(const char *str)
{
return (__strdup(str, KM_SLEEP));
}
EXPORT_SYMBOL(strdup);
EXPORT_SYMBOL(kmem_strdup);

void
strfree(char *str)
kmem_strfree(char *str)
{
kfree(str);
}
EXPORT_SYMBOL(strfree);
EXPORT_SYMBOL(kmem_strfree);

/*
* General purpose unified implementation of kmem_alloc(). It is an
@@ -631,21 +631,21 @@ kstat_detect_collision(kstat_proc_entry_t *kpep)
parent = kmem_asprintf("%s", kpep->kpe_module);

if ((cp = strrchr(parent, '/')) == NULL) {
strfree(parent);
kmem_strfree(parent);
return (0);
}

cp[0] = '\0';
if ((module = kstat_find_module(parent)) != NULL) {
list_for_each_entry(tmp, &module->ksm_kstat_list, kpe_list) {
if (strncmp(tmp->kpe_name, cp+1, KSTAT_STRLEN) == 0) {
strfree(parent);
kmem_strfree(parent);
return (EEXIST);
}
}
}

strfree(parent);
kmem_strfree(parent);
return (0);
}

@@ -1038,7 +1038,7 @@ taskq_create(const char *name, int nthreads, pri_t pri,
spin_lock_init(&tq->tq_lock);
INIT_LIST_HEAD(&tq->tq_thread_list);
INIT_LIST_HEAD(&tq->tq_active_list);
tq->tq_name = strdup(name);
tq->tq_name = kmem_strdup(name);
tq->tq_nactive = 0;
tq->tq_nthreads = 0;
tq->tq_nspawn = 0;
@@ -1178,7 +1178,7 @@ taskq_destroy(taskq_t *tq)

spin_unlock_irqrestore(&tq->tq_lock, flags);

strfree(tq->tq_name);
kmem_strfree(tq->tq_name);
kmem_free(tq, sizeof (taskq_t));
}
EXPORT_SYMBOL(taskq_destroy);
@@ -138,7 +138,7 @@ spa_read_history_init(spa_t *spa)
spa_read_history_clear,
offsetof(spa_read_history_t, srh_node));

strfree(module);
kmem_strfree(module);
}

static void
@@ -309,7 +309,7 @@ spa_txg_history_init(spa_t *spa)
spa_txg_history_clear,
offsetof(spa_txg_history_t, sth_node));

strfree(module);
kmem_strfree(module);
}

static void
@@ -529,7 +529,7 @@ spa_tx_assign_init(spa_t *spa)
ksp->ks_update = spa_tx_assign_update;
kstat_install(ksp);
}
strfree(name);
kmem_strfree(name);
}

static void
@@ -592,7 +592,7 @@ spa_io_history_init(spa_t *spa)
ksp->ks_update = spa_io_history_update;
kstat_install(ksp);
}
strfree(name);
kmem_strfree(name);
}

static void
@@ -675,7 +675,7 @@ spa_mmp_history_truncate(spa_history_list_t *shl, unsigned int size)
while (shl->size > size) {
smh = list_remove_head(&shl->procfs_list.pl_list);
if (smh->vdev_path)
strfree(smh->vdev_path);
kmem_strfree(smh->vdev_path);
kmem_free(smh, sizeof (spa_mmp_history_t));
shl->size--;
}
@@ -715,7 +715,7 @@ spa_mmp_history_init(spa_t *spa)
spa_mmp_history_clear,
offsetof(spa_mmp_history_t, smh_node));

strfree(module);
kmem_strfree(module);
}

static void
@@ -814,7 +814,7 @@ spa_mmp_history_add(spa_t *spa, uint64_t txg, uint64_t timestamp,
if (vd) {
smh->vdev_guid = vd->vdev_guid;
if (vd->vdev_path)
smh->vdev_path = strdup(vd->vdev_path);
smh->vdev_path = kmem_strdup(vd->vdev_path);
}
smh->vdev_label = label;
smh->mmp_node_id = mmp_node_id;
@@ -876,7 +876,7 @@ spa_state_init(spa_t *spa)
kstat_install(ksp);
}

strfree(name);
kmem_strfree(name);
}

static void
@@ -973,7 +973,7 @@ spa_iostats_init(spa_t *spa)
kstat_install(ksp);
}

strfree(name);
kmem_strfree(name);
}

static void
@@ -220,7 +220,7 @@ vdev_elevator_switch(vdev_t *v, char *elevator)

argv[2] = kmem_asprintf(SET_SCHEDULER_CMD, device, elevator);
error = call_usermodehelper(argv[0], argv, envp, UMH_NO_WAIT);
strfree(argv[2]);
kmem_strfree(argv[2]);
#endif /* HAVE_ELEVATOR_CHANGE */
if (error) {
zfs_dbgmsg("Unable to set \"%s\" scheduler for %s (%s): %d",
@@ -137,8 +137,8 @@ zfsctl_snapshot_alloc(char *full_name, char *full_path, spa_t *spa,

se = kmem_zalloc(sizeof (zfs_snapentry_t), KM_SLEEP);

se->se_name = strdup(full_name);
se->se_path = strdup(full_path);
se->se_name = kmem_strdup(full_name);
se->se_path = kmem_strdup(full_path);
se->se_spa = spa;
se->se_objsetid = objsetid;
se->se_root_dentry = root_dentry;
@@ -157,8 +157,8 @@ static void
zfsctl_snapshot_free(zfs_snapentry_t *se)
{
zfs_refcount_destroy(&se->se_refcount);
strfree(se->se_name);
strfree(se->se_path);
kmem_strfree(se->se_name);
kmem_strfree(se->se_path);

kmem_free(se, sizeof (zfs_snapentry_t));
}
@@ -311,8 +311,8 @@ zfsctl_snapshot_rename(char *old_snapname, char *new_snapname)
return (SET_ERROR(ENOENT));

zfsctl_snapshot_remove(se);
strfree(se->se_name);
se->se_name = strdup(new_snapname);
kmem_strfree(se->se_name);
se->se_name = kmem_strdup(new_snapname);
zfsctl_snapshot_add(se);
zfsctl_snapshot_rele(se);

@@ -111,7 +111,7 @@ zfsvfs_vfs_free(vfs_t *vfsp)
{
if (vfsp != NULL) {
if (vfsp->vfs_mntpoint != NULL)
strfree(vfsp->vfs_mntpoint);
kmem_strfree(vfsp->vfs_mntpoint);

kmem_free(vfsp, sizeof (vfs_t));
}
@@ -222,7 +222,7 @@ zfsvfs_parse_options(char *mntopts, vfs_t **vfsp)
char *tmp_mntopts, *p, *t;
int token;

tmp_mntopts = t = strdup(mntopts);
tmp_mntopts = t = kmem_strdup(mntopts);
if (tmp_mntopts == NULL)
return (SET_ERROR(ENOMEM));

@@ -234,13 +234,13 @@ zfsvfs_parse_options(char *mntopts, vfs_t **vfsp)
token = match_token(p, zpl_tokens, args);
error = zfsvfs_parse_option(p, token, args, tmp_vfsp);
if (error) {
strfree(tmp_mntopts);
kmem_strfree(tmp_mntopts);
zfsvfs_vfs_free(tmp_vfsp);
return (error);
}
}

strfree(tmp_mntopts);
kmem_strfree(tmp_mntopts);
}

*vfsp = tmp_vfsp;
@@ -707,7 +707,7 @@ __zpl_xattr_user_get(struct inode *ip, const char *name,

xattr_name = kmem_asprintf("%s%s", XATTR_USER_PREFIX, name);
error = zpl_xattr_get(ip, xattr_name, value, size);
strfree(xattr_name);
kmem_strfree(xattr_name);

return (error);
}
@@ -729,7 +729,7 @@ __zpl_xattr_user_set(struct inode *ip, const char *name,

xattr_name = kmem_asprintf("%s%s", XATTR_USER_PREFIX, name);
error = zpl_xattr_set(ip, xattr_name, value, size, flags);
strfree(xattr_name);
kmem_strfree(xattr_name);

return (error);
}
@@ -776,7 +776,7 @@ __zpl_xattr_trusted_get(struct inode *ip, const char *name,
#endif
xattr_name = kmem_asprintf("%s%s", XATTR_TRUSTED_PREFIX, name);
error = zpl_xattr_get(ip, xattr_name, value, size);
strfree(xattr_name);
kmem_strfree(xattr_name);

return (error);
}
@@ -798,7 +798,7 @@ __zpl_xattr_trusted_set(struct inode *ip, const char *name,
#endif
xattr_name = kmem_asprintf("%s%s", XATTR_TRUSTED_PREFIX, name);
error = zpl_xattr_set(ip, xattr_name, value, size, flags);
strfree(xattr_name);
kmem_strfree(xattr_name);

return (error);
}
@@ -845,7 +845,7 @@ __zpl_xattr_security_get(struct inode *ip, const char *name,
#endif
xattr_name = kmem_asprintf("%s%s", XATTR_SECURITY_PREFIX, name);
error = zpl_xattr_get(ip, xattr_name, value, size);
strfree(xattr_name);
kmem_strfree(xattr_name);

return (error);
}
@@ -864,7 +864,7 @@ __zpl_xattr_security_set(struct inode *ip, const char *name,
#endif
xattr_name = kmem_asprintf("%s%s", XATTR_SECURITY_PREFIX, name);
error = zpl_xattr_set(ip, xattr_name, value, size, flags);
strfree(xattr_name);
kmem_strfree(xattr_name);

return (error);
}
@@ -1404,7 +1404,7 @@ dmu_objset_snapshot_one(const char *fsname, const char *snapname)
nvlist_t *snaps = fnvlist_alloc();

fnvlist_add_boolean(snaps, longsnap);
strfree(longsnap);
kmem_strfree(longsnap);
err = dsl_dataset_snapshot(snaps, NULL, NULL);
fnvlist_free(snaps);
return (err);
@@ -2795,7 +2795,7 @@ dmu_objset_find_impl(spa_t *spa, const char *name,
err = dmu_objset_find_impl(spa, child,
func, arg, flags);
dsl_pool_config_enter(dp, FTAG);
strfree(child);
kmem_strfree(child);
if (err != 0)
break;
}
@@ -2833,7 +2833,7 @@ dmu_objset_find_impl(spa_t *spa, const char *name,
dsl_pool_config_exit(dp, FTAG);
err = func(child, arg);
dsl_pool_config_enter(dp, FTAG);
strfree(child);
kmem_strfree(child);
if (err != 0)
break;
}
@@ -2435,7 +2435,7 @@ get_receive_resume_stats_impl(dsl_dataset_t *ds)
kmem_free(compressed, packed_size);
return (propval);
}
return (strdup(""));
return (kmem_strdup(""));
}

/*
@@ -2458,7 +2458,7 @@ get_child_receive_stats(dsl_dataset_t *ds)
dsl_dataset_rele(recv_ds, FTAG);
return (propval);
}
return (strdup(""));
return (kmem_strdup(""));
}

static void
@@ -2474,9 +2474,9 @@ get_receive_resume_stats(dsl_dataset_t *ds, nvlist_t *nv)
dsl_prop_nvlist_add_string(nv,
ZFS_PROP_RECEIVE_RESUME_TOKEN, childval);
}
strfree(childval);
kmem_strfree(childval);
}
strfree(propval);
kmem_strfree(propval);
}

uint64_t
@@ -1200,7 +1200,7 @@ dsl_pool_user_hold_rele_impl(dsl_pool_t *dp, uint64_t dsobj,
error = zap_add(mos, zapobj, name, 8, 1, &now, tx);
else
error = zap_remove(mos, zapobj, name, tx);
strfree(name);
kmem_strfree(name);

return (error);
}

0 comments on commit 9dc4ca5

Please sign in to comment.
You can’t perform that action at this time.