From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S967911AbdEWNtx (ORCPT ); Tue, 23 May 2017 09:49:53 -0400 Received: from ip83.parkeon.com ([213.152.31.83]:33969 "EHLO mta2.parkeon.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S965932AbdEWNtg (ORCPT ); Tue, 23 May 2017 09:49:36 -0400 X-Greylist: delayed 2002 seconds by postgrey-1.27 at vger.kernel.org; Tue, 23 May 2017 09:49:36 EDT Subject: [PATCH] firmware: request_firmware() should propagate -ERESTARTSYS To: Greg Kroah-Hartman , "Luis R. Rodriguez" From: Martin Fuzzey Cc: linux-kernel@vger.kernel.org Date: Tue, 23 May 2017 15:16:07 +0200 Message-ID: <20170523131607.28138.12306.stgit@localhost> User-Agent: StGit/0.16 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When -ERESTARTSYS is returned by wait_* due to a signal this should be returned from request_firmware() so that the syscall may be restarted if necessary. Without this it is not possible to distinguish the case of request_firmware() failing due to a timeout with that due to a signal. In my particular case request_firmware() was being called from a sysfs .store() callback and the writing process was the Android init process which received a SIGCHLD causing request_firmware() to fail. Signed-off-by: Martin Fuzzey --- drivers/base/firmware_class.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/drivers/base/firmware_class.c b/drivers/base/firmware_class.c index b616bf7..13ed62f 100644 --- a/drivers/base/firmware_class.c +++ b/drivers/base/firmware_class.c @@ -1023,9 +1023,10 @@ static int _request_firmware_load(struct firmware_priv *fw_priv, mutex_unlock(&fw_lock); } - if (fw_state_is_aborted(&buf->fw_st)) - retval = -EAGAIN; - else if (buf->is_paged_buf && !buf->data) + if (fw_state_is_aborted(&buf->fw_st)) { + if (retval != -ERESTARTSYS) + retval = -EAGAIN; + } else if (buf->is_paged_buf && !buf->data) retval = -ENOMEM; device_del(f_dev);