From patchwork Thu Sep 25 18:38:32 2008 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vitaly Mayatskih X-Patchwork-Id: 1567 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from ozlabs.org (localhost [127.0.0.1]) by ozlabs.org (Postfix) with ESMTP id E24CFDE4D1 for ; Fri, 26 Sep 2008 04:38:50 +1000 (EST) X-Original-To: linuxppc-dev@ozlabs.org Delivered-To: linuxppc-dev@ozlabs.org Received: from qw-out-2122.google.com (qw-out-2122.google.com [74.125.92.25]) by ozlabs.org (Postfix) with ESMTP id 103EEDDF72 for ; Fri, 26 Sep 2008 04:38:36 +1000 (EST) Received: by qw-out-2122.google.com with SMTP id 9so85075qwb.15 for ; Thu, 25 Sep 2008 11:38:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:date:message-id:from:to:cc :subject:user-agent:mime-version:content-type; bh=xkh01W1DuFY0S7xCVgWCKXdDqgZ2JddfxOdIUmJqkas=; b=r7NSr5lyK+MysNPIpvhNHpFr651K9gQhE43Rs0HD9dfEFhBhOjFlg0TVgH5BLruKdI KxCarIxSKzQTVMAbsDtY9Eu0bEG734mkD7X08HUGi39V4UGCPaq2/WplhMqJAUcJ7HPh agh/2Q1fLvV+k7rpThgY+5kUvWt+Lesb6uOY0= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=date:message-id:from:to:cc:subject:user-agent:mime-version :content-type; b=QVn4KH0Gf5TE2ZnVSsIV4oxNHQlf6j8BLw0tP19dGM8GYiAfYeQx1ouUg086LBcbQ3 5euY/GF9KK3Xj7jUtfgO8+0CvlqQ3RWFY7v8cpDiY/rnBcvVjnfr90bp24raOq9Ivtth /lFzmvaeZwK/r+jBqDXDkIAL14YJYiq4CBtIs= Received: by 10.214.147.9 with SMTP id u9mr126291qad.79.1222367915817; Thu, 25 Sep 2008 11:38:35 -0700 (PDT) Received: from gravicappa.englab.brq.redhat.com ( [78.45.38.95]) by mx.google.com with ESMTPS id 4sm655213qwe.3.2008.09.25.11.38.34 (version=TLSv1/SSLv3 cipher=RC4-MD5); Thu, 25 Sep 2008 11:38:35 -0700 (PDT) Date: Thu, 25 Sep 2008 20:38:32 +0200 Message-ID: From: Vitaly Mayatskikh To: linuxppc-dev@ozlabs.org Subject: take in count O_NONBLOCK flag for rtas log User-Agent: Wanderlust/2.15.6 (Almost Unreal) Emacs/23.0 Mule/6.0 (HANACHIRUSATO) MIME-Version: 1.0 (generated by SEMI 1.14.6 - "Maruoka") Cc: Paul Mackerras X-BeenThere: linuxppc-dev@ozlabs.org X-Mailman-Version: 2.1.11 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@ozlabs.org Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@ozlabs.org rtas_log_read() doesn't check file flags for O_NONBLOCK and blocks non-blocking reader of /proc/ppc64/rtas/error_log if there's no data available. This patch fixes the problem. 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; + } else + 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);