Messages in this thread Patch in this message | | | From | Vitaly Mayatskikh <> | Subject | [PATCH] PowerPC: honor O_NONBLOCK flag for rtas error_log | Date | Fri, 04 Jul 2008 15:06:27 +0200 |
| |
rtas_log_read() currently doesn't count O_NONBLOCK flag. This sample code will block on read:
fd = open ("/proc/ppc64/rtas/error_log", O_RDONLY | O_NONBLOCK); while (1) { err =read (fd, buf, 4096); printf("err = %d, errno = %d (%s)\n", err, errno, strerror(errno)); sleep(1); }
With patched kernel it produces such (correct) output:
err = 2052, errno = 0 (Success) err = -1, errno = 11 (Resource temporarily unavailable) err = -1, errno = 11 (Resource temporarily unavailable) err = -1, errno = 11 (Resource temporarily unavailable) err = -1, errno = 11 (Resource temporarily unavailable)
Signed-off-by: Vitaly Mayatskikh <v.mayatskih@gmail.com>
diff --git a/arch/powerpc/platforms/pseries/rtasd.c b/arch/powerpc/platforms/pseries/rtasd.c index 7d3e2b0..f530f68 100644 --- a/arch/powerpc/platforms/pseries/rtasd.c +++ b/arch/powerpc/platforms/pseries/rtasd.c @@ -291,22 +291,25 @@ static ssize_t rtas_log_read(struct file * file, char __user * buf, if (!access_ok(VERIFY_WRITE, buf, count)) return -EFAULT; - tmp = kmalloc(count, GFP_KERNEL); - 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) + if (rtas_log_size == 0 && logging_enabled) { nvram_clear_error_log(); + if (file->f_flags & O_NONBLOCK) { + spin_unlock_irqrestore(&rtasd_log_lock, s); + return -EAGAIN; + } + } spin_unlock_irqrestore(&rtasd_log_lock, s); - error = wait_event_interruptible(rtas_log_wait, rtas_log_size); if (error) goto out; + tmp = kmalloc(count, GFP_KERNEL); + if (!tmp) + return -ENOMEM; + 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); -- wbr, Vitaly
| |