From 2115c3051544e04e169c49794a49fc6815aec5ec Mon Sep 17 00:00:00 2001
From: Brian Behlendorf <behlendorf1@llnl.gov>
Date: Wed, 16 Jun 2010 14:23:31 -0700
Subject: [PATCH] Revert fix-stack topic branch

This patch will be broken in to several independent stack reductions
and reapplied as new topic branches.
---
 lib/libzpool/include/sys/zfs_context.h |  6 -----
 module/zfs/dbuf.c                      | 12 ++-------
 module/zfs/dmu_objset.c                | 34 ++++++++++++--------------
 module/zfs/dmu_send.c                  | 10 ++++----
 4 files changed, 22 insertions(+), 40 deletions(-)

diff --git a/lib/libzpool/include/sys/zfs_context.h b/lib/libzpool/include/sys/zfs_context.h
index 8c16ec1ef7..9a6d712e53 100644
--- a/lib/libzpool/include/sys/zfs_context.h
+++ b/lib/libzpool/include/sys/zfs_context.h
@@ -77,12 +77,6 @@ extern "C" {
 #include <sys/sysevent/dev.h>
 #include <sys/sunddi.h>
 
-/*
- * Stack
- */
-
-#define  noinline	__attribute__((noinline))
-
 /*
  * Debugging
  */
diff --git a/module/zfs/dbuf.c b/module/zfs/dbuf.c
index 354114934c..42ae439972 100644
--- a/module/zfs/dbuf.c
+++ b/module/zfs/dbuf.c
@@ -2085,11 +2085,7 @@ dbuf_check_blkptr(dnode_t *dn, dmu_buf_impl_t *db)
 	}
 }
 
-/* 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
+static void
 dbuf_sync_indirect(dbuf_dirty_record_t *dr, dmu_tx_t *tx)
 {
 	dmu_buf_impl_t *db = dr->dr_dbuf;
@@ -2129,11 +2125,7 @@ dbuf_sync_indirect(dbuf_dirty_record_t *dr, dmu_tx_t *tx)
 	zio_nowait(zio);
 }
 
-/* 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
+static void
 dbuf_sync_leaf(dbuf_dirty_record_t *dr, dmu_tx_t *tx)
 {
 	arc_buf_t **datap = &dr->dt.dl.dr_data;
diff --git a/module/zfs/dmu_objset.c b/module/zfs/dmu_objset.c
index 32bb614c81..690e6ecdee 100644
--- a/module/zfs/dmu_objset.c
+++ b/module/zfs/dmu_objset.c
@@ -878,49 +878,45 @@ dmu_objset_snapshot(char *fsname, char *snapname,
     nvlist_t *props, boolean_t recursive)
 {
 	dsl_sync_task_t *dst;
-	struct snaparg *sn;
+	struct snaparg sn;
 	spa_t *spa;
 	int err;
 
-	sn = kmem_alloc(sizeof (struct snaparg), KM_SLEEP);
-	(void) strcpy(sn->failed, fsname);
+	(void) strcpy(sn.failed, fsname);
 
 	err = spa_open(fsname, &spa, FTAG);
-	if (err) {
-		kmem_free(sn, sizeof (struct snaparg));
+	if (err)
 		return (err);
-	}
 
-	sn->dstg = dsl_sync_task_group_create(spa_get_dsl(spa));
-	sn->snapname = snapname;
-	sn->props = props;
-	sn->recursive = recursive;
+	sn.dstg = dsl_sync_task_group_create(spa_get_dsl(spa));
+	sn.snapname = snapname;
+	sn.props = props;
+	sn.recursive = recursive;
 
 	if (recursive) {
 		err = dmu_objset_find(fsname,
-		    dmu_objset_snapshot_one, sn, DS_FIND_CHILDREN);
+		    dmu_objset_snapshot_one, &sn, DS_FIND_CHILDREN);
 	} else {
-		err = dmu_objset_snapshot_one(fsname, sn);
+		err = dmu_objset_snapshot_one(fsname, &sn);
 	}
 
 	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;
-	    dst = list_next(&sn->dstg->dstg_tasks, dst)) {
+	for (dst = list_head(&sn.dstg->dstg_tasks); dst;
+	    dst = list_next(&sn.dstg->dstg_tasks, dst)) {
 		objset_t *os = dst->dst_arg1;
 		dsl_dataset_t *ds = os->os_dsl_dataset;
 		if (dst->dst_err)
-			dsl_dataset_name(ds, sn->failed);
+			dsl_dataset_name(ds, sn.failed);
 		zil_resume(dmu_objset_zil(os));
 		dmu_objset_rele(os, &sn);
 	}
 
 	if (err)
-		(void) strcpy(fsname, sn->failed);
-	dsl_sync_task_group_destroy(sn->dstg);
+		(void) strcpy(fsname, sn.failed);
+	dsl_sync_task_group_destroy(sn.dstg);
 	spa_close(spa, FTAG);
-	kmem_free(sn, sizeof (struct snaparg));
 	return (err);
 }
 
diff --git a/module/zfs/dmu_send.c b/module/zfs/dmu_send.c
index 2f837a1e97..6b00b73b43 100644
--- a/module/zfs/dmu_send.c
+++ b/module/zfs/dmu_send.c
@@ -921,7 +921,7 @@ restore_read(struct restorearg *ra, int len)
 	return (rv);
 }
 
-noinline static void
+static void
 backup_byteswap(dmu_replay_record_t *drr)
 {
 #define	DO64(X) (drr->drr_u.X = BSWAP_64(drr->drr_u.X))
@@ -1001,7 +1001,7 @@ backup_byteswap(dmu_replay_record_t *drr)
 #undef DO32
 }
 
-noinline static int
+static int
 restore_object(struct restorearg *ra, objset_t *os, struct drr_object *drro)
 {
 	int err;
@@ -1085,7 +1085,7 @@ restore_object(struct restorearg *ra, objset_t *os, struct drr_object *drro)
 }
 
 /* ARGSUSED */
-noinline static int
+static int
 restore_freeobjects(struct restorearg *ra, objset_t *os,
     struct drr_freeobjects *drrfo)
 {
@@ -1109,7 +1109,7 @@ restore_freeobjects(struct restorearg *ra, objset_t *os,
 	return (0);
 }
 
-noinline static int
+static int
 restore_write(struct restorearg *ra, objset_t *os,
     struct drr_write *drrw)
 {
@@ -1254,7 +1254,7 @@ restore_spill(struct restorearg *ra, objset_t *os, struct drr_spill *drrs)
 }
 
 /* ARGSUSED */
-noinline static int
+static int
 restore_free(struct restorearg *ra, objset_t *os,
     struct drr_free *drrf)
 {