vserver 1.9.5.x5
[linux-2.6.git] / arch / ppc64 / kernel / rtasd.c
index c6370a8..e41a158 100644 (file)
@@ -26,6 +26,7 @@
 #include <asm/prom.h>
 #include <asm/nvram.h>
 #include <asm/atomic.h>
+#include <asm/systemcfg.h>
 
 #if 0
 #define DEBUG(A...)    printk(KERN_ERR A)
@@ -33,7 +34,7 @@
 #define DEBUG(A...)
 #endif
 
-static spinlock_t rtasd_log_lock = SPIN_LOCK_UNLOCKED;
+static DEFINE_SPINLOCK(rtasd_log_lock);
 
 DECLARE_WAIT_QUEUE_HEAD(rtas_log_wait);
 
@@ -48,7 +49,7 @@ static unsigned int rtas_error_log_buffer_max;
 
 static int full_rtas_msgs = 0;
 
-extern volatile int no_more_logging;
+extern int no_logging;
 
 volatile int error_log_cnt = 0;
 
@@ -213,7 +214,7 @@ void pSeries_log_error(char *buf, unsigned int err_type, int fatal)
        }
 
        /* Write error to NVRAM */
-       if (!no_more_logging && !(err_type & ERR_FLAG_BOOT))
+       if (!no_logging && !(err_type & ERR_FLAG_BOOT))
                nvram_write_error_log(buf, len, err_type);
 
        /*
@@ -225,8 +226,8 @@ void pSeries_log_error(char *buf, unsigned int err_type, int fatal)
                printk_log_rtas(buf, len);
 
        /* Check to see if we need to or have stopped logging */
-       if (fatal || no_more_logging) {
-               no_more_logging = 1;
+       if (fatal || no_logging) {
+               no_logging = 1;
                spin_unlock_irqrestore(&rtasd_log_lock, s);
                return;
        }
@@ -275,7 +276,7 @@ static int rtas_log_release(struct inode * inode, struct file * file)
  * know that we can safely clear the events in NVRAM.
  * Next we'll sit and wait for something else to log.
  */
-static ssize_t rtas_log_read(struct file * file, char * buf,
+static ssize_t rtas_log_read(struct file * file, char __user * buf,
                         size_t count, loff_t *ppos)
 {
        int error;
@@ -299,7 +300,7 @@ static ssize_t rtas_log_read(struct file * file, char * buf,
 
        spin_lock_irqsave(&rtasd_log_lock, s);
        /* if it's 0, then we know we got the last one (the one in NVRAM) */
-       if (rtas_log_size == 0 && !no_more_logging)
+       if (rtas_log_size == 0 && !no_logging)
                nvram_clear_error_log();
        spin_unlock_irqrestore(&rtasd_log_lock, s);
 
@@ -417,9 +418,6 @@ static int rtasd(void *unused)
                goto error;
        }
 
-       /* We can use rtas_log_buf now */
-       no_more_logging = 0;
-
        printk(KERN_ERR "RTAS daemon started\n");
 
        DEBUG("will sleep for %d jiffies\n", (HZ*60/rtas_event_scan_rate) / 2);
@@ -428,6 +426,10 @@ static int rtasd(void *unused)
        memset(logdata, 0, rtas_error_log_max);
 
        rc = nvram_read_error_log(logdata, rtas_error_log_max, &err_type);
+
+       /* We can use rtas_log_buf now */
+       no_logging = 0;
+
        if (!rc) {
                if (err_type != ERR_FLAG_ALREADY_LOGGED) {
                        pSeries_log_error(logdata, err_type | ERR_FLAG_BOOT, 0);
@@ -484,8 +486,8 @@ static int __init rtas_init(void)
 
        /* No RTAS, only warn if we are on a pSeries box  */
        if (rtas_token("event-scan") == RTAS_UNKNOWN_SERVICE) {
-               if (systemcfg->platform & PLATFORM_PSERIES);
-                       printk(KERN_ERR "rtasd: no RTAS on system\n");
+               if (systemcfg->platform & PLATFORM_PSERIES)
+                       printk(KERN_ERR "rtasd: no event-scan on system\n");
                return 1;
        }