diff --git a/include/fiber.h b/include/fiber.h
index 129b744d55c9dd3a3e9b3097bde3c6c8bfd203f8..0d31a830de9bb9313d1e3426c2e75a73341b7c28 100644
--- a/include/fiber.h
+++ b/include/fiber.h
@@ -42,7 +42,7 @@
 #include "palloc.h"
 #include <rlist.h>
 
-#define FIBER_NAME_MAXLEN 32
+#define FIBER_NAME_MAXLEN PALLOC_POOL_NAME_MAXLEN
 
 #define FIBER_READING_INBOX (1 << 0)
 /** This fiber can be cancelled synchronously. */
@@ -85,8 +85,6 @@ struct fiber {
 	struct rlist link;
 	struct rlist state;
 
-	/* ASCIIZ name of this fiber. */
-	char name[FIBER_NAME_MAXLEN];
 	void (*f) (va_list);
 	va_list f_data;
 	u32 flags;
@@ -101,6 +99,12 @@ struct fiber *fiber_new(const char *name, void (*f) (va_list));
 void fiber_set_name(struct fiber *fiber, const char *name);
 int wait_for_child(pid_t pid);
 
+static inline const char *
+fiber_name(struct fiber *f)
+{
+	return palloc_name(f->gc_pool);
+}
+
 void fiber_yield(void);
 void fiber_yield_to(struct fiber *f);
 
diff --git a/src/fiber.m b/src/fiber.m
index 6ffa7f3831f26c6948e193254922670095d50abe..3a1db8efd82e916542febe1f4dd4e6090d9cc886 100644
--- a/src/fiber.m
+++ b/src/fiber.m
@@ -361,14 +361,14 @@ fiber_loop(void *data __attribute__((unused)))
 		@try {
 			fiber->f(fiber->f_data);
 		} @catch (FiberCancelException *e) {
-			say_info("fiber `%s' has been cancelled", fiber->name);
-			say_info("fiber `%s': exiting", fiber->name);
+			say_info("fiber `%s' has been cancelled", fiber_name(fiber));
+			say_info("fiber `%s': exiting", fiber_name(fiber));
 		} @catch (tnt_Exception *e) {
 			[e log];
 		} @catch (id e) {
 			say_error("fiber `%s': exception `%s'",
-				fiber->name, object_getClassName(e));
-			panic("fiber `%s': exiting", fiber->name);
+				fiber_name(fiber), object_getClassName(e));
+			panic("fiber `%s': exiting", fiber_name(fiber));
 		}
 		fiber_zombificate();
 		fiber_yield();	/* give control back to scheduler */
@@ -385,8 +385,7 @@ void
 fiber_set_name(struct fiber *fiber, const char *name)
 {
 	assert(name != NULL);
-	snprintf(fiber->name, sizeof(fiber->name), "%s", name);
-	palloc_set_name(fiber->gc_pool, fiber->name);
+	palloc_set_name(fiber->gc_pool, name);
 }
 
 /**
@@ -447,7 +446,7 @@ fiber_destroy(struct fiber *f)
 {
 	if (f == fiber) /* do not destroy running fiber */
 		return;
-	if (strcmp(f->name, "sched") == 0)
+	if (strcmp(fiber_name(f), "sched") == 0)
 		return;
 
 	rlist_del(&f->state);
@@ -473,7 +472,7 @@ fiber_info_print(struct tbuf *out, struct fiber *fiber)
 
 	tbuf_printf(out, "  - fid: %4i" CRLF, fiber->fid);
 	tbuf_printf(out, "    csw: %i" CRLF, fiber->csw);
-	tbuf_printf(out, "    name: %s" CRLF, fiber->name);
+	tbuf_printf(out, "    name: %s" CRLF, fiber_name(fiber));
 	tbuf_printf(out, "    stack: %p" CRLF, stack_top);
 #ifdef ENABLE_BACKTRACE
 	tbuf_printf(out, "    backtrace:" CRLF "%s",
diff --git a/src/lua/init.m b/src/lua/init.m
index c234345685d2fbd4f1ad3c79108b114da93e75b3..72841cf45b26969a034fc4cd9f04b544bc73c523 100644
--- a/src/lua/init.m
+++ b/src/lua/init.m
@@ -747,7 +747,7 @@ lbox_fiber_name(struct lua_State *L)
 		fiber_set_name(f, name);
 		return 0;
 	} else {
-		lua_pushstring(L, f->name);
+		lua_pushstring(L, fiber_name(f));
 		return 1;
 	}
 }
diff --git a/src/replica.m b/src/replica.m
index c0f0dce2e2548fa999f27ed387dd283879663eac..be4af6d7df85356f40421784b4662a87ce750c90 100644
--- a/src/replica.m
+++ b/src/replica.m
@@ -106,7 +106,7 @@ pull_from_remote(va_list ap)
 			fiber_setcancellable(true);
 			if (! evio_is_active(&coio)) {
 				if (iobuf == NULL)
-					iobuf = iobuf_new(fiber->name);
+					iobuf = iobuf_new(fiber_name(fiber));
 				remote_connect(&coio, &r->remote->addr,
 					       r->confirmed_lsn + 1, &err);
 				warning_said = false;
diff --git a/src/replication.m b/src/replication.m
index 4792e7c659d75d68979cda3013b0b11708ef338b..bb4419aebd99ec3a223ea8c679be7ab99d301664 100644
--- a/src/replication.m
+++ b/src/replication.m
@@ -296,7 +296,7 @@ replication_send_socket(ev_io *watcher, int events __attribute__((unused)))
 static void
 spawner_init(int sock)
 {
-	char name[sizeof(fiber->name)];
+	char name[FIBER_NAME_MAXLEN];
 	struct sigaction sa;
 
 	snprintf(name, sizeof(name), "spawner%s", custom_proc_title);
diff --git a/src/say.m b/src/say.m
index 6d081873494526fb0c5fadb8eb4123c2872874d0..b0fa1b29860bf5ff4de27657aeddbe7b3dc9ba71 100644
--- a/src/say.m
+++ b/src/say.m
@@ -150,7 +150,7 @@ vsay(int level, const char *filename, int line, const char *error, const char *f
 		      ev_now() - now + tm.tm_sec);
 
 	p += snprintf(buf + p, len - p, " [%i] %i/%s", getpid(),
-		      fiber->fid, fiber->name);
+		      fiber->fid, fiber_name(fiber));
 
 	if (level == S_WARN || level == S_ERROR)
 		p += snprintf(buf + p, len - p, " %s:%i", filename, line);
diff --git a/src/util.m b/src/util.m
index 1f85d44558e14c308dd7ddd2cc60768b508f2890..799d62f5efa187f7aed7f6640e5d7519e4bbcf2f 100644
--- a/src/util.m
+++ b/src/util.m
@@ -276,7 +276,8 @@ print_backtrace()
 	void *stack_top;
 	size_t stack_size;
 
-	if (fiber == NULL || fiber->name == NULL || strcmp(fiber->name, "sched") == 0) {
+	if (fiber == NULL || fiber_name(fiber) == NULL ||
+	    strcmp(fiber_name(fiber), "sched") == 0) {
 		stack_top = frame; /* we don't know where the system stack top is */
 		stack_size = __libc_stack_end - frame;
 	} else {