--- arch/ppc64/kernel/rtas.c.orig-pre-lockfix 2004-06-29 17:02:12.000000000 -0500 +++ arch/ppc64/kernel/rtas.c 2004-06-30 12:26:51.000000000 -0500 @@ -131,12 +131,20 @@ log_rtas_error(void) { unsigned long s; int rc; + char * buff_copy = NULL; spin_lock_irqsave(&rtas.lock, s); rc = __log_rtas_error(); + if (rc == 0) { + buff_copy = kmalloc (RTAS_ERROR_LOG_MAX, GFP_ATOMIC); + memcpy (buff_copy, rtas_err_buf, RTAS_ERROR_LOG_MAX); + } spin_unlock_irqrestore(&rtas.lock, s); - if (rc == 0) - log_error(rtas_err_buf, ERR_TYPE_RTAS_LOG, 0); + + if (buff_copy) { + log_error(buff_copy, ERR_TYPE_RTAS_LOG, 0); + kfree (buff_copy); + } } int @@ -147,6 +155,7 @@ rtas_call(int token, int nargs, int nret int i, logit = 0; unsigned long s; struct rtas_args *rtas_args; + char * buff_copy = NULL; int ret; PPCDBG(PPCDBG_RTAS, "Entering rtas_call\n"); @@ -193,12 +202,18 @@ rtas_call(int token, int nargs, int nret outputs[i] = rtas_args->rets[i+1]; ret = (int)((nret > 0) ? rtas_args->rets[0] : 0); + if (logit) { + buff_copy = kmalloc (RTAS_ERROR_LOG_MAX, GFP_ATOMIC); + memcpy (buff_copy, rtas_err_buf, RTAS_ERROR_LOG_MAX); + } + /* Gotta do something different here, use global lock for now... */ spin_unlock_irqrestore(&rtas.lock, s); - if (logit) - log_error(rtas_err_buf, ERR_TYPE_RTAS_LOG, 0); - + if (buff_copy) { + log_error(buff_copy, ERR_TYPE_RTAS_LOG, 0); + kfree (buff_copy); + } return ret; }