Merge commit 'refs/top-bases/linux-kernel-module' into linux-kernel-module

This commit is contained in:
Brian Behlendorf 2010-06-16 14:45:02 -07:00
commit 5cac48ae66
4 changed files with 40 additions and 22 deletions

View File

@ -76,6 +76,12 @@ extern "C" {
#include <sys/sysevent/dev.h> #include <sys/sysevent/dev.h>
#include <sys/sunddi.h> #include <sys/sunddi.h>
/*
* Stack
*/
#define noinline __attribute__((noinline))
/* /*
* Debugging * Debugging
*/ */

View File

@ -2096,7 +2096,11 @@ dbuf_check_blkptr(dnode_t *dn, dmu_buf_impl_t *db)
} }
} }
static void /* dbuf_sync_indirect() is called recursively from dbuf_sync_list() so it
* is critical the we not allow the compiler to inline this function in to
* dbuf_sync_list() thereby drastically bloating the stack usage.
*/
noinline static void
dbuf_sync_indirect(dbuf_dirty_record_t *dr, dmu_tx_t *tx) dbuf_sync_indirect(dbuf_dirty_record_t *dr, dmu_tx_t *tx)
{ {
dmu_buf_impl_t *db = dr->dr_dbuf; dmu_buf_impl_t *db = dr->dr_dbuf;
@ -2136,7 +2140,11 @@ dbuf_sync_indirect(dbuf_dirty_record_t *dr, dmu_tx_t *tx)
zio_nowait(zio); zio_nowait(zio);
} }
static void /* dbuf_sync_leaf() is called recursively from dbuf_sync_list() so it is
* critical the we not allow the compiler to inline this function in to
* dbuf_sync_list() thereby drastically bloating the stack usage.
*/
noinline static void
dbuf_sync_leaf(dbuf_dirty_record_t *dr, dmu_tx_t *tx) dbuf_sync_leaf(dbuf_dirty_record_t *dr, dmu_tx_t *tx)
{ {
arc_buf_t **datap = &dr->dt.dl.dr_data; arc_buf_t **datap = &dr->dt.dl.dr_data;

View File

@ -881,45 +881,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);
} }

View File

@ -921,7 +921,7 @@ restore_read(struct restorearg *ra, int len)
return (rv); return (rv);
} }
static void noinline static void
backup_byteswap(dmu_replay_record_t *drr) backup_byteswap(dmu_replay_record_t *drr)
{ {
#define DO64(X) (drr->drr_u.X = BSWAP_64(drr->drr_u.X)) #define DO64(X) (drr->drr_u.X = BSWAP_64(drr->drr_u.X))
@ -1003,7 +1003,7 @@ backup_byteswap(dmu_replay_record_t *drr)
#undef DO32 #undef DO32
} }
static int noinline static int
restore_object(struct restorearg *ra, objset_t *os, struct drr_object *drro) restore_object(struct restorearg *ra, objset_t *os, struct drr_object *drro)
{ {
int err; int err;
@ -1087,7 +1087,7 @@ restore_object(struct restorearg *ra, objset_t *os, struct drr_object *drro)
} }
/* ARGSUSED */ /* ARGSUSED */
static int noinline static int
restore_freeobjects(struct restorearg *ra, objset_t *os, restore_freeobjects(struct restorearg *ra, objset_t *os,
struct drr_freeobjects *drrfo) struct drr_freeobjects *drrfo)
{ {
@ -1111,7 +1111,7 @@ restore_freeobjects(struct restorearg *ra, objset_t *os,
return (0); return (0);
} }
static int noinline static int
restore_write(struct restorearg *ra, objset_t *os, restore_write(struct restorearg *ra, objset_t *os,
struct drr_write *drrw) struct drr_write *drrw)
{ {
@ -1257,7 +1257,7 @@ restore_spill(struct restorearg *ra, objset_t *os, struct drr_spill *drrs)
} }
/* ARGSUSED */ /* ARGSUSED */
static int noinline static int
restore_free(struct restorearg *ra, objset_t *os, restore_free(struct restorearg *ra, objset_t *os,
struct drr_free *drrf) struct drr_free *drrf)
{ {