]> granicus.if.org Git - zfs/commitdiff
Add fix-stack-dsl_dir_open_spa topic branch
authorBrian Behlendorf <behlendorf1@llnl.gov>
Wed, 16 Jun 2010 19:39:44 +0000 (12:39 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Wed, 16 Jun 2010 19:39:44 +0000 (12:39 -0700)
Reduce stack usage by 256 bytes by moving buf char array from
the stack to the heap.

.topdeps [new file with mode: 0644]
.topmsg [new file with mode: 0644]
module/zfs/dsl_dir.c

diff --git a/.topdeps b/.topdeps
new file mode 100644 (file)
index 0000000..1f7391f
--- /dev/null
+++ b/.topdeps
@@ -0,0 +1 @@
+master
diff --git a/.topmsg b/.topmsg
new file mode 100644 (file)
index 0000000..07df278
--- /dev/null
+++ b/.topmsg
@@ -0,0 +1,7 @@
+From: Brian Behlendorf <behlendorf1@llnl.gov>
+Subject: [PATCH] fix stack dsl_dir_open_spa
+
+Reduce stack usage by 256 bytes by moving buf char array from
+the stack to the heap.
+
+Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
index 1cd49c8274e8ebcdfb1c6222aa082a075672ccbc..5ed61c5f2a92118610e5064fda115d2743f785b1 100644 (file)
@@ -303,7 +303,7 @@ int
 dsl_dir_open_spa(spa_t *spa, const char *name, void *tag,
     dsl_dir_t **ddp, const char **tailp)
 {
-       char buf[MAXNAMELEN];
+       char *buf;
        const char *next, *nextnext = NULL;
        int err;
        dsl_dir_t *dd;
@@ -313,14 +313,15 @@ dsl_dir_open_spa(spa_t *spa, const char *name, void *tag,
 
        dprintf("%s\n", name);
 
+       buf = kmem_alloc(MAXNAMELEN, KM_SLEEP);
        err = getcomponent(name, buf, &next);
        if (err)
-               return (err);
+               goto error;
        if (spa == NULL) {
                err = spa_open(buf, &spa, FTAG);
                if (err) {
                        dprintf("spa_open(%s) failed\n", buf);
-                       return (err);
+                       goto error;
                }
                openedspa = TRUE;
 
@@ -336,7 +337,7 @@ dsl_dir_open_spa(spa_t *spa, const char *name, void *tag,
                rw_exit(&dp->dp_config_rwlock);
                if (openedspa)
                        spa_close(spa, FTAG);
-               return (err);
+               goto error;
        }
 
        while (next != NULL) {
@@ -372,7 +373,7 @@ dsl_dir_open_spa(spa_t *spa, const char *name, void *tag,
                dsl_dir_close(dd, tag);
                if (openedspa)
                        spa_close(spa, FTAG);
-               return (err);
+               goto error;
        }
 
        /*
@@ -391,6 +392,8 @@ dsl_dir_open_spa(spa_t *spa, const char *name, void *tag,
        if (openedspa)
                spa_close(spa, FTAG);
        *ddp = dd;
+error:
+       kmem_free(buf, MAXNAMELEN);
        return (err);
 }