Reduce stack using in ZVOL

The dmu_object_info_t structures which are roughly 60 bytes
have been moved from the stack to the heap.  Every little
bit helps and there's absolutely no reason these temporary
working variables need to be on the stack.
This commit is contained in:
Brian Behlendorf 2010-07-30 10:01:24 -07:00
parent 88b37fbe57
commit 7195d18e6a
1 changed files with 25 additions and 15 deletions

View File

@ -183,7 +183,7 @@ int
zvol_get_stats(objset_t *os, nvlist_t *nv)
{
int error;
dmu_object_info_t doi;
dmu_object_info_t *doi;
uint64_t val;
error = zap_lookup(os, ZVOL_ZAP_OBJ, "size", 8, 1, &val);
@ -191,14 +191,16 @@ zvol_get_stats(objset_t *os, nvlist_t *nv)
return (error);
dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_VOLSIZE, val);
error = dmu_object_info(os, ZVOL_OBJ, &doi);
doi = kmem_alloc(sizeof(dmu_object_info_t), KM_SLEEP);
error = dmu_object_info(os, ZVOL_OBJ, doi);
if (error == 0) {
dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_VOLBLOCKSIZE,
doi.doi_data_block_size);
doi->doi_data_block_size);
}
kmem_free(doi, sizeof(dmu_object_info_t));
return (error);
}
@ -274,7 +276,7 @@ int
zvol_set_volsize(const char *name, uint64_t volsize)
{
zvol_state_t *zv;
dmu_object_info_t doi;
dmu_object_info_t *doi;
objset_t *os = NULL;
uint64_t readonly;
int error;
@ -287,26 +289,30 @@ zvol_set_volsize(const char *name, uint64_t volsize)
goto out;
}
doi = kmem_alloc(sizeof(dmu_object_info_t), KM_SLEEP);
error = dmu_objset_hold(name, FTAG, &os);
if (error)
goto out;
goto out_doi;
if ((error = dmu_object_info(os, ZVOL_OBJ, &doi)) != 0 ||
(error = zvol_check_volsize(volsize,doi.doi_data_block_size)) != 0)
goto out;
if ((error = dmu_object_info(os, ZVOL_OBJ, doi)) != 0 ||
(error = zvol_check_volsize(volsize,doi->doi_data_block_size)) != 0)
goto out_doi;
VERIFY(dsl_prop_get_integer(name, "readonly", &readonly, NULL) == 0);
if (readonly) {
error = EROFS;
goto out;
goto out_doi;
}
if (get_disk_ro(zv->zv_disk) || (zv->zv_flags & ZVOL_RDONLY)) {
error = EROFS;
goto out;
goto out_doi;
}
error = zvol_update_volsize(zv, volsize);
out_doi:
kmem_free(doi, sizeof(dmu_object_info_t));
out:
if (os)
dmu_objset_rele(os, FTAG);
@ -1076,7 +1082,7 @@ __zvol_create_minor(const char *name)
{
zvol_state_t *zv;
objset_t *os;
dmu_object_info_t doi;
dmu_object_info_t *doi;
unsigned minor = 0;
int error = 0;
@ -1088,11 +1094,13 @@ __zvol_create_minor(const char *name)
goto out;
}
doi = kmem_alloc(sizeof(dmu_object_info_t), KM_SLEEP);
error = dmu_objset_own(name, DMU_OST_ZVOL, B_TRUE, zvol_tag, &os);
if (error)
goto out;
goto out_doi;
error = dmu_object_info(os, ZVOL_OBJ, &doi);
error = dmu_object_info(os, ZVOL_OBJ, doi);
if (error)
goto out_dmu_objset_disown;
@ -1109,7 +1117,7 @@ __zvol_create_minor(const char *name)
if (dmu_objset_is_snapshot(os))
zv->zv_flags |= ZVOL_RDONLY;
zv->zv_volblocksize = doi.doi_data_block_size;
zv->zv_volblocksize = doi->doi_data_block_size;
if (zil_replay_disable)
zil_destroy(dmu_objset_zil(os), B_FALSE);
@ -1122,6 +1130,8 @@ __zvol_create_minor(const char *name)
out_dmu_objset_disown:
dmu_objset_disown(os, zvol_tag);
out_doi:
kmem_free(doi, sizeof(dmu_object_info_t));
out:
return (error);
}