diff -ruN linux-2.4.19.SuSE.orig/Documentation/s390/s390dbf.txt linux-2.4.19.SuSE/Documentation/s390/s390dbf.txt
--- linux-2.4.19.SuSE.orig/Documentation/s390/s390dbf.txt	2001-10-11 11:04:57.000000000 -0500
+++ linux-2.4.19.SuSE/Documentation/s390/s390dbf.txt	2003-07-24 02:36:43.000000000 -0500
@@ -168,6 +168,20 @@
 
 Return Value:  Address of written debug entry
 
+Description:   writes debug entry with processed string and varargs to 
+               active debug area (if level $<=$ actual debug level). 
+
+---------------------------------------------------------------------------
+debug_entry_t* debug_unsafe_sprintf_event (debug_info_t * id, int level, 
+                                           char* string,...);
+
+Parameter:     id:    handle for debug log 
+               level: debug level
+               string: format string for debug entry 
+               ...: varargs used as in sprintf()
+
+Return Value:  Address of written debug entry
+
 Description:   writes debug entry with format string and varargs (longs) to 
                active debug area (if level $<=$ actual debug level). 
                floats and long long datatypes cannot be used as varargs.
@@ -227,6 +241,21 @@
 
 Return Value:  Address of written debug entry 
 
+Description:   writes debug entry with processed string and varargs to 
+               active debug area (if level $<=$ actual debug level) and
+               switches to next debug area. 
+
+---------------------------------------------------------------------------
+debug_entry_t* debug_unsafe_sprintf_exception (debug_info_t * id, int level,
+                                               char* string,...);
+
+Parameter:     id:    handle for debug log  
+               level: debug level  
+               string: format string for debug entry  
+               ...: varargs used as in sprintf()
+
+Return Value:  Address of written debug entry 
+
 Description:   writes debug entry with format string and varargs (longs) to 
                active debug area (if level $<=$ actual debug level) and
                switches to next debug area. 
diff -ruN linux-2.4.19.SuSE.orig/arch/s390/kernel/debug.c linux-2.4.19.SuSE/arch/s390/kernel/debug.c
--- linux-2.4.19.SuSE.orig/arch/s390/kernel/debug.c	2003-06-05 16:45:29.000000000 -0500
+++ linux-2.4.19.SuSE/arch/s390/kernel/debug.c	2003-07-24 04:09:36.000000000 -0500
@@ -856,6 +856,72 @@
                                    int level,char *string,...)
 {
 	va_list   ap;
+	int alloc_size,len;
+	debug_sprintf_entry *curr_event;
+	debug_entry_t *retval = NULL;
+        char buf[1];
+
+	if((!id) || (level > id->level))
+		return NULL;
+	else {
+                va_start(ap,string);
+                len=vsnprintf(buf,0,string,ap)+1;
+                alloc_size=len+sizeof(debug_sprintf_entry);
+                va_end(ap);
+		curr_event=alloca(alloc_size);
+
+		if(curr_event){
+			va_start(ap,string);
+			vsnprintf((char *)&curr_event->args[0],len,string,ap);
+			va_end(ap);
+			curr_event->string = (char *)-1;
+			retval=debug_common(id,level, curr_event,alloc_size,0);
+		}
+		return retval;
+	}
+}
+
+/*
+ * debug_sprintf_exception:
+ */
+
+debug_entry_t *debug_sprintf_exception(debug_info_t* id,
+                                       int level,char *string,...)
+{
+	va_list   ap;
+	int alloc_size,len;
+	debug_sprintf_entry *curr_event;
+	debug_entry_t *retval = NULL;
+        char buf[1];
+
+	if((!id) || (level > id->level))
+		return NULL;
+	else {
+                va_start(ap,string);
+                len=vsnprintf(buf,0,string,ap)+1;
+                alloc_size=len+sizeof(debug_sprintf_entry);
+                va_end(ap);
+		curr_event=alloca(alloc_size);
+
+		if(curr_event){
+			va_start(ap,string);
+			vsnprintf((char *)&curr_event->args[0],len,string,ap);
+			va_end(ap);
+			curr_event->string = (char *)-1;
+			retval=debug_common(id,level, curr_event,alloc_size,1);
+		}
+		return retval;
+	}
+}
+
+/*
+ * debug_unsafe_sprintf_event:
+ */
+
+debug_entry_t *debug_unsafe_sprintf_event(debug_info_t* id,
+                                          int level,char *string,...)
+{
+	va_list   ap;
 	int numargs,alloc_size,idx;
 	debug_sprintf_entry *curr_event;
 	debug_entry_t *retval = NULL;
@@ -880,11 +946,11 @@
 }
 
 /*
- * debug_sprintf_exception:
+ * debug_unsafe_sprintf_exception:
  */
 
-debug_entry_t *debug_sprintf_exception(debug_info_t* id,
-                                       int level,char *string,...)
+debug_entry_t *debug_unsafe_sprintf_exception(debug_info_t* id,
+                                              int level,char *string,...)
 {
 	va_list   ap;
 	int numargs,alloc_size,idx;
@@ -1230,6 +1296,13 @@
 	int num_longs, num_used_args = 0,i, rc = 0;
 	int index[DEBUG_SPRINTF_MAX_ARGS];
 
+        /* check for preprocessed string */
+	if(curr_event->string == (char *)-1) {
+		strcpy(out_buf, (char *)&curr_event->args[0]);
+		rc = strlen(out_buf);
+		goto out;
+	}
+
 	/* count of longs fit into one entry */
 	num_longs = id->buf_size /  sizeof(long); 
 
@@ -1309,3 +1382,5 @@
 EXPORT_SYMBOL(debug_sprintf_view);
 EXPORT_SYMBOL(debug_sprintf_exception);
 EXPORT_SYMBOL(debug_sprintf_event);
+EXPORT_SYMBOL(debug_unsafe_sprintf_exception);
+EXPORT_SYMBOL(debug_unsafe_sprintf_event);
diff -ruN linux-2.4.19.SuSE.orig/arch/s390x/kernel/debug.c linux-2.4.19.SuSE/arch/s390x/kernel/debug.c
--- linux-2.4.19.SuSE.orig/arch/s390x/kernel/debug.c	2003-06-05 16:45:29.000000000 -0500
+++ linux-2.4.19.SuSE/arch/s390x/kernel/debug.c	2003-07-24 04:08:31.000000000 -0500
@@ -856,6 +856,72 @@
                                    int level,char *string,...)
 {
 	va_list   ap;
+	int alloc_size,len;
+	debug_sprintf_entry *curr_event;
+	debug_entry_t *retval = NULL;
+        char buf[1];
+
+	if((!id) || (level > id->level))
+		return NULL;
+	else {
+                va_start(ap,string);
+                len=vsnprintf(buf,0,string,ap)+1;
+                alloc_size=len+sizeof(debug_sprintf_entry);
+                va_end(ap);
+		curr_event=alloca(alloc_size);
+
+		if(curr_event){
+			va_start(ap,string);
+			vsnprintf((char *)&curr_event->args[0],len,string,ap);
+			va_end(ap);
+			curr_event->string = (char *)-1;
+			retval=debug_common(id,level, curr_event,alloc_size,0);
+		}
+		return retval;
+	}
+}
+
+/*
+ * debug_sprintf_exception:
+ */
+
+debug_entry_t *debug_sprintf_exception(debug_info_t* id,
+                                       int level,char *string,...)
+{
+	va_list   ap;
+	int alloc_size,len;
+	debug_sprintf_entry *curr_event;
+	debug_entry_t *retval = NULL;
+        char buf[1];
+
+	if((!id) || (level > id->level))
+		return NULL;
+	else {
+                va_start(ap,string);
+                len=vsnprintf(buf,0,string,ap)+1;
+                alloc_size=len+sizeof(debug_sprintf_entry);
+                va_end(ap);
+		curr_event=alloca(alloc_size);
+
+		if(curr_event){
+			va_start(ap,string);
+			vsnprintf((char *)&curr_event->args[0],len,string,ap);
+			va_end(ap);
+			curr_event->string = (char *)-1;
+			retval=debug_common(id,level, curr_event,alloc_size,1);
+		}
+		return retval;
+	}
+}
+
+/*
+ * debug_unsafe_sprintf_event:
+ */
+
+debug_entry_t *debug_unsafe_sprintf_event(debug_info_t* id,
+                                          int level,char *string,...)
+{
+	va_list   ap;
 	int numargs,alloc_size,idx;
 	debug_sprintf_entry *curr_event;
 	debug_entry_t *retval = NULL;
@@ -880,11 +946,11 @@
 }
 
 /*
- * debug_sprintf_exception:
+ * debug_unsafe_sprintf_exception:
  */
 
-debug_entry_t *debug_sprintf_exception(debug_info_t* id,
-                                       int level,char *string,...)
+debug_entry_t *debug_unsafe_sprintf_exception(debug_info_t* id,
+                                              int level,char *string,...)
 {
 	va_list   ap;
 	int numargs,alloc_size,idx;
@@ -1230,6 +1296,13 @@
 	int num_longs, num_used_args = 0,i, rc = 0;
 	int index[DEBUG_SPRINTF_MAX_ARGS];
 
+        /* check for preprocessed string */
+	if(curr_event->string == (char *)-1) {
+		strcpy(out_buf, (char *)&curr_event->args[0]);
+		rc = strlen(out_buf);
+		goto out;
+	}
+
 	/* count of longs fit into one entry */
 	num_longs = id->buf_size /  sizeof(long); 
 
@@ -1309,3 +1382,5 @@
 EXPORT_SYMBOL(debug_sprintf_view);
 EXPORT_SYMBOL(debug_sprintf_exception);
 EXPORT_SYMBOL(debug_sprintf_event);
+EXPORT_SYMBOL(debug_unsafe_sprintf_exception);
+EXPORT_SYMBOL(debug_unsafe_sprintf_event);
diff -ruN linux-2.4.19.SuSE.orig/drivers/s390/block/dasd.c linux-2.4.19.SuSE/drivers/s390/block/dasd.c
--- linux-2.4.19.SuSE.orig/drivers/s390/block/dasd.c	2003-06-05 16:45:37.000000000 -0500
+++ linux-2.4.19.SuSE/drivers/s390/block/dasd.c	2003-07-24 02:36:43.000000000 -0500
@@ -3903,7 +3911,7 @@
         device->debug_area = debug_register (device->name, 
                                              0,     /* size of debug area */
                                              2,     /* number of areas */
-                                             8 * sizeof (long));
+                                             128);
 
         debug_register_view (device->debug_area, 
                              &debug_sprintf_view);
@@ -5172,7 +5248,7 @@
 	dasd_debug_area = debug_register (DASD_NAME, 
                                           0,     /* size of debug area */
                                           2,     /* number of areas */
-                                          8 * sizeof (long));
+                                          128);
 
 	debug_register_view (dasd_debug_area, 
                              &debug_sprintf_view);
diff -ruN linux-2.4.19.SuSE.orig/drivers/s390/char/tape.c linux-2.4.19.SuSE/drivers/s390/char/tape.c
--- linux-2.4.19.SuSE.orig/drivers/s390/char/tape.c	2003-06-05 16:45:29.000000000 -0500
+++ linux-2.4.19.SuSE/drivers/s390/char/tape.c	2003-07-24 02:38:14.000000000 -0500
@@ -1842,7 +1842,7 @@
 
 	tape_init_devregs();
 #ifdef TAPE_DEBUG
-        tape_dbf_area = debug_register ( "tape", 1, 2, 3*sizeof(long));
+        tape_dbf_area = debug_register ( "tape", 1, 2, 128);
         debug_register_view(tape_dbf_area,&debug_sprintf_view);
         tape_sprintf_event (tape_dbf_area,3,"begin init: ($Revision: 1.87.2.6 $)\n");
 #endif /* TAPE_DEBUG */
diff -ruN linux-2.4.19.SuSE.orig/drivers/s390/char/tape3480.c linux-2.4.19.SuSE/drivers/s390/char/tape3480.c
--- linux-2.4.19.SuSE.orig/drivers/s390/char/tape3480.c	2003-06-05 16:45:29.000000000 -0500
+++ linux-2.4.19.SuSE/drivers/s390/char/tape3480.c	2003-07-24 02:38:36.000000000 -0500
@@ -92,7 +92,7 @@
 	tape_discipline_t *disc;
 #ifdef TAPE_DEBUG
 #ifdef MODULE
-        tape_dbf_3480 = debug_register("tape3480", 1, 2, 3*sizeof(long));
+        tape_dbf_3480 = debug_register("tape3480", 1, 2, 128);
         debug_register_view(tape_dbf_3480, &debug_sprintf_view);
 #endif /* MODULE */
 #endif /* TAPE_DEBUG */
diff -ruN linux-2.4.19.SuSE.orig/drivers/s390/char/tape3490.c linux-2.4.19.SuSE/drivers/s390/char/tape3490.c
--- linux-2.4.19.SuSE.orig/drivers/s390/char/tape3490.c	2003-06-05 16:45:29.000000000 -0500
+++ linux-2.4.19.SuSE/drivers/s390/char/tape3490.c	2003-07-24 02:38:45.000000000 -0500
@@ -93,7 +93,7 @@
 	tape_discipline_t *disc;
 #ifdef TAPE_DEBUG
 #ifdef MODULE
-        tape_dbf_3490 = debug_register("tape3490", 1, 2, 3*sizeof(long));
+        tape_dbf_3490 = debug_register("tape3490", 1, 2, 128);
         debug_register_view(tape_dbf_3490, &debug_sprintf_view);
 #endif /* MODULE */
 #endif /* TAPE_DEBUG */
diff -ruN linux-2.4.19.SuSE.orig/drivers/s390/net/lcs.c linux-2.4.19.SuSE/drivers/s390/net/lcs.c
--- linux-2.4.19.SuSE.orig/drivers/s390/net/lcs.c	2003-06-05 16:45:26.000000000 -0500
+++ linux-2.4.19.SuSE/drivers/s390/net/lcs.c	2003-07-24 02:36:47.000000000 -0500
@@ -3640,7 +3640,7 @@
 lcs_debug_register(void)
 {
 	if (lcs_id == NULL) {
-		lcs_id = debug_register("lcs", 1, 16, 16 * sizeof (long));
+		lcs_id = debug_register("lcs", 1, 16, 128);
 		debug_register_view(lcs_id, &debug_sprintf_view);
 		debug_set_level(lcs_id, 0);
 	}
diff -ruN linux-2.4.19.SuSE.orig/drivers/s390/s390io.c linux-2.4.19.SuSE/drivers/s390/s390io.c
--- linux-2.4.19.SuSE.orig/drivers/s390/s390io.c	2003-06-05 16:45:36.000000000 -0500
+++ linux-2.4.19.SuSE/drivers/s390/s390io.c	2003-07-24 02:36:48.000000000 -0500
@@ -7855,7 +7855,7 @@
 {
 	int ret = 0;
 
-	cio_debug_msg_id = debug_register ("cio_msg", 4, 4, 16 * sizeof (long));
+	cio_debug_msg_id = debug_register ("cio_msg", 4, 4, 128);
 	if (cio_debug_msg_id != NULL) {
 		debug_register_view (cio_debug_msg_id, &debug_sprintf_view);
 		debug_set_level (cio_debug_msg_id, 6);
@@ -7869,7 +7869,7 @@
 	} else {
 		ret = -1;
 	}
-	cio_debug_crw_id = debug_register ("cio_crw", 2, 4, 16 * sizeof (long));
+	cio_debug_crw_id = debug_register ("cio_crw", 2, 4, 128);
 	if (cio_debug_crw_id != NULL) {
 		debug_register_view (cio_debug_crw_id, &debug_sprintf_view);
 		debug_set_level (cio_debug_crw_id, 6);
diff -ruN linux-2.4.19.SuSE.orig/include/asm-s390/debug.h linux-2.4.19.SuSE/include/asm-s390/debug.h
--- linux-2.4.19.SuSE.orig/include/asm-s390/debug.h	2002-08-02 19:39:45.000000000 -0500
+++ linux-2.4.19.SuSE/include/asm-s390/debug.h	2003-07-24 02:36:48.000000000 -0500
@@ -162,6 +162,9 @@
 extern debug_entry_t *
 debug_sprintf_event(debug_info_t* id,int level,char *string,...);
 
+extern debug_entry_t *
+debug_unsafe_sprintf_event(debug_info_t* id,int level,char *string,...);
+
 
 extern inline debug_entry_t* 
 debug_exception(debug_info_t* id, int level, void* data, int length)
@@ -197,6 +200,9 @@
 extern debug_entry_t *
 debug_sprintf_exception(debug_info_t* id,int level,char *string,...);
 
+extern debug_entry_t *
+debug_unsafe_sprintf_exception(debug_info_t* id,int level,char *string,...);
+
 int debug_register_view(debug_info_t* id, struct debug_view* view);
 int debug_unregister_view(debug_info_t* id, struct debug_view* view);
 
diff -ruN linux-2.4.19.SuSE.orig/include/asm-s390x/debug.h linux-2.4.19.SuSE/include/asm-s390x/debug.h
--- linux-2.4.19.SuSE.orig/include/asm-s390x/debug.h	2002-08-02 19:39:45.000000000 -0500
+++ linux-2.4.19.SuSE/include/asm-s390x/debug.h	2003-07-24 02:36:48.000000000 -0500
@@ -162,6 +162,9 @@
 extern debug_entry_t *
 debug_sprintf_event(debug_info_t* id,int level,char *string,...);
 
+extern debug_entry_t *
+debug_unsafe_sprintf_event(debug_info_t* id,int level,char *string,...);
+
 
 extern inline debug_entry_t* 
 debug_exception(debug_info_t* id, int level, void* data, int length)
@@ -197,6 +200,9 @@
 extern debug_entry_t *
 debug_sprintf_exception(debug_info_t* id,int level,char *string,...);
 
+extern debug_entry_t *
+debug_unsafe_sprintf_exception(debug_info_t* id,int level,char *string,...);
+
 int debug_register_view(debug_info_t* id, struct debug_view* view);
 int debug_unregister_view(debug_info_t* id, struct debug_view* view);
 
