Add fix-stack-dmu_objset_snapshot topic branch
Reduce stack usage by 276 bytes by moving the snaparg struct from the stack to the heap. We have limited stack space we must not waste.
This commit is contained in:
parent
428870ff73
commit
e163b08ba3
|
@ -0,0 +1,7 @@
|
||||||
|
From: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||||
|
Subject: [PATCH] fix stack dmu_objset_snapshot
|
||||||
|
|
||||||
|
Reduce stack usage by 276 bytes by moving the snaparg struct from the
|
||||||
|
stack to the heap. We have limited stack space we must not waste.
|
||||||
|
|
||||||
|
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
|
@ -878,45 +878,49 @@ dmu_objset_snapshot(char *fsname, char *snapname,
|
||||||
nvlist_t *props, boolean_t recursive)
|
nvlist_t *props, boolean_t recursive)
|
||||||
{
|
{
|
||||||
dsl_sync_task_t *dst;
|
dsl_sync_task_t *dst;
|
||||||
struct snaparg sn;
|
struct snaparg *sn;
|
||||||
spa_t *spa;
|
spa_t *spa;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
(void) strcpy(sn.failed, fsname);
|
sn = kmem_alloc(sizeof (struct snaparg), KM_SLEEP);
|
||||||
|
(void) strcpy(sn->failed, fsname);
|
||||||
|
|
||||||
err = spa_open(fsname, &spa, FTAG);
|
err = spa_open(fsname, &spa, FTAG);
|
||||||
if (err)
|
if (err) {
|
||||||
|
kmem_free(sn, sizeof (struct snaparg));
|
||||||
return (err);
|
return (err);
|
||||||
|
}
|
||||||
|
|
||||||
sn.dstg = dsl_sync_task_group_create(spa_get_dsl(spa));
|
sn->dstg = dsl_sync_task_group_create(spa_get_dsl(spa));
|
||||||
sn.snapname = snapname;
|
sn->snapname = snapname;
|
||||||
sn.props = props;
|
sn->props = props;
|
||||||
sn.recursive = recursive;
|
sn->recursive = recursive;
|
||||||
|
|
||||||
if (recursive) {
|
if (recursive) {
|
||||||
err = dmu_objset_find(fsname,
|
err = dmu_objset_find(fsname,
|
||||||
dmu_objset_snapshot_one, &sn, DS_FIND_CHILDREN);
|
dmu_objset_snapshot_one, sn, DS_FIND_CHILDREN);
|
||||||
} else {
|
} else {
|
||||||
err = dmu_objset_snapshot_one(fsname, &sn);
|
err = dmu_objset_snapshot_one(fsname, sn);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (err == 0)
|
if (err == 0)
|
||||||
err = dsl_sync_task_group_wait(sn.dstg);
|
err = dsl_sync_task_group_wait(sn->dstg);
|
||||||
|
|
||||||
for (dst = list_head(&sn.dstg->dstg_tasks); dst;
|
for (dst = list_head(&sn->dstg->dstg_tasks); dst;
|
||||||
dst = list_next(&sn.dstg->dstg_tasks, dst)) {
|
dst = list_next(&sn->dstg->dstg_tasks, dst)) {
|
||||||
objset_t *os = dst->dst_arg1;
|
objset_t *os = dst->dst_arg1;
|
||||||
dsl_dataset_t *ds = os->os_dsl_dataset;
|
dsl_dataset_t *ds = os->os_dsl_dataset;
|
||||||
if (dst->dst_err)
|
if (dst->dst_err)
|
||||||
dsl_dataset_name(ds, sn.failed);
|
dsl_dataset_name(ds, sn->failed);
|
||||||
zil_resume(dmu_objset_zil(os));
|
zil_resume(dmu_objset_zil(os));
|
||||||
dmu_objset_rele(os, &sn);
|
dmu_objset_rele(os, &sn);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (err)
|
if (err)
|
||||||
(void) strcpy(fsname, sn.failed);
|
(void) strcpy(fsname, sn->failed);
|
||||||
dsl_sync_task_group_destroy(sn.dstg);
|
dsl_sync_task_group_destroy(sn->dstg);
|
||||||
spa_close(spa, FTAG);
|
spa_close(spa, FTAG);
|
||||||
|
kmem_free(sn, sizeof (struct snaparg));
|
||||||
return (err);
|
return (err);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue