|
@@ -295,19 +295,29 @@ static ssize_t rtas_log_read(struct file * file, char __user * buf,
|
|
|
if (!tmp)
|
|
|
return -ENOMEM;
|
|
|
|
|
|
-
|
|
|
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 && logging_enabled)
|
|
|
- nvram_clear_error_log();
|
|
|
- spin_unlock_irqrestore(&rtasd_log_lock, s);
|
|
|
+ while (rtas_log_size == 0) {
|
|
|
+ if (file->f_flags & O_NONBLOCK) {
|
|
|
+ spin_unlock_irqrestore(&rtasd_log_lock, s);
|
|
|
+ error = -EAGAIN;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
|
|
|
+ if (!logging_enabled) {
|
|
|
+ spin_unlock_irqrestore(&rtasd_log_lock, s);
|
|
|
+ error = -ENODATA;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+ nvram_clear_error_log();
|
|
|
|
|
|
- error = wait_event_interruptible(rtas_log_wait, rtas_log_size);
|
|
|
- if (error)
|
|
|
- goto out;
|
|
|
+ spin_unlock_irqrestore(&rtasd_log_lock, s);
|
|
|
+ error = wait_event_interruptible(rtas_log_wait, rtas_log_size);
|
|
|
+ if (error)
|
|
|
+ goto out;
|
|
|
+ spin_lock_irqsave(&rtasd_log_lock, s);
|
|
|
+ }
|
|
|
|
|
|
- spin_lock_irqsave(&rtasd_log_lock, s);
|
|
|
offset = rtas_error_log_buffer_max * (rtas_log_start & LOG_NUMBER_MASK);
|
|
|
memcpy(tmp, &rtas_log_buf[offset], count);
|
|
|
|