From patchwork Fri Sep 26 08:21:03 2008 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: take in count O_NONBLOCK flag for rtas log From: Vitaly Mayatskikh X-Patchwork-Id: 1630 Message-Id: To: David Howells Cc: linuxppc-dev@ozlabs.org, Vitaly Mayatskikh , Paul Mackerras Date: Fri, 26 Sep 2008 10:21:03 +0200 At Thu, 25 Sep 2008 22:13:05 +0100, David Howells wrote: > > + if (!logging_enabled) { > > + spin_unlock_irqrestore(&rtasd_log_lock, s); > > + error = -ENODATA; > > + goto out; > > + } else > > + nvram_clear_error_log(); > > The 'else' here is unnecessary. It's preceded inside the curlies by a goto. Right... Signed-off-by: Vitaly Mayatskikh --- wbr, Vitaly diff --git a/arch/powerpc/platforms/pseries/rtasd.c b/arch/powerpc/platforms/pseries/rtasd.c index c9ffd8c..4f76e3b 100644 --- a/arch/powerpc/platforms/pseries/rtasd.c +++ b/arch/powerpc/platforms/pseries/rtasd.c @@ -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);