From patchwork Mon Feb 1 16:47:05 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andy Whitcroft X-Patchwork-Id: 576623 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from huckleberry.canonical.com (huckleberry.canonical.com [91.189.94.19]) by ozlabs.org (Postfix) with ESMTP id 8C1FD140AD9; Tue, 2 Feb 2016 03:47:28 +1100 (AEDT) Received: from localhost ([127.0.0.1] helo=huckleberry.canonical.com) by huckleberry.canonical.com with esmtp (Exim 4.76) (envelope-from ) id 1aQHdM-0004TC-QY; Mon, 01 Feb 2016 16:47:24 +0000 Received: from mail-wm0-f41.google.com ([74.125.82.41]) by huckleberry.canonical.com with esmtps (TLS1.0:RSA_ARCFOUR_SHA1:16) (Exim 4.76) (envelope-from ) id 1aQHdB-0004Op-3h for kernel-team@lists.ubuntu.com; Mon, 01 Feb 2016 16:47:13 +0000 Received: by mail-wm0-f41.google.com with SMTP id p63so79676550wmp.1 for ; Mon, 01 Feb 2016 08:47:13 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=Q/XxWdwgO5d26zdqkhTewMfVjxhcBdffCJcksfQnpnQ=; b=mH3Ns8JyvIYV52ctgkw1JwCc38KyHpdGsYHXnp7g2T2/lMTOx24ED0a45kwIqPJJrW LqJkFODNfOdEbxg7OxsMMTxdwnxedzFfw8OPXFuDn5ptJvUFkpAn9G9b4YpLSFZ3khBk SCSgpuNCW0ZnPjyCa4DQi3dhWfb6QiI41svlvF1FVXTTfxl7p8TUj3wGBZDS4K65zO6/ KpuBBCnrZx54/IKfqsNiPTXCO1UvGoogE6wUKUpdD/grzM8/+smVtIbXYWX/oQrttGkO G0u98Wima4W0RdeZUfq/GiSdXNur0tvOhYhiHIUldjjlrSkgv/+fg4bUCxqpB2fsRk/i od4A== X-Gm-Message-State: AG10YOQpFZ4VmRIZRHremtET7eo//6RM34tcujzUiYLDQD1vFyAO+hgLwBRjkZCV8BIpvHeX X-Received: by 10.28.87.135 with SMTP id l129mr13341812wmb.9.1454345232740; Mon, 01 Feb 2016 08:47:12 -0800 (PST) Received: from localhost ([2001:470:6973:2:c685:8ff:fe03:779e]) by smtp.gmail.com with ESMTPSA id x186sm12213267wmg.19.2016.02.01.08.47.11 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 01 Feb 2016 08:47:12 -0800 (PST) From: Andy Whitcroft To: kernel-team@lists.ubuntu.com Subject: [wily/master-next 2/2] UBUNTU: SAUCE: ubuntu: aufs: for 4.3, XINO handles EINTR from the dying process Date: Mon, 1 Feb 2016 16:47:05 +0000 Message-Id: <1454345225-1437-5-git-send-email-apw@canonical.com> X-Mailer: git-send-email 2.7.0.rc3 In-Reply-To: <1454345225-1437-1-git-send-email-apw@canonical.com> References: <1454345225-1437-1-git-send-email-apw@canonical.com> Cc: Andy Whitcroft X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.14 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: kernel-team-bounces@lists.ubuntu.com From: "J. R. Okajima" By the commit 296291c 2015-10-23 mm: make sendfile(2) killable new_sync_write() (or ->write()) may return EINTR ealier even if it can succeed the operation. It causes an endless loop in aufs do_xino_fwrite(). Here is a dirty workaround to retry do_xino_fwrite() in another context (workqueue). Reported-by: Akihiro Suda Tested-by: Akihiro Suda See-also: http://www.mail-archive.com/aufs-users@lists.sourceforge.net/msg05231.html Signed-off-by: J. R. Okajima (cherry-picked from 5e439ff30c92143d9a9ee3401a84e34c9852533b aufs4-standalone.git) BugLink: http://bugs.launchpad.net/bugs/1533043 Signed-off-by: Andy Whitcroft --- fs/aufs/xino.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/fs/aufs/xino.c b/fs/aufs/xino.c index 31858c5..2e4a009 100644 --- a/fs/aufs/xino.c +++ b/fs/aufs/xino.c @@ -53,6 +53,9 @@ ssize_t xino_fread(vfs_readf_t func, struct file *file, void *kbuf, size_t size, /* ---------------------------------------------------------------------- */ +static ssize_t xino_fwrite_wkq(vfs_writef_t func, struct file *file, void *buf, + size_t size, loff_t *pos); + static ssize_t do_xino_fwrite(vfs_writef_t func, struct file *file, void *kbuf, size_t size, loff_t *pos) { @@ -62,14 +65,26 @@ static ssize_t do_xino_fwrite(vfs_writef_t func, struct file *file, void *kbuf, void *k; const char __user *u; } buf; + int i; + const int prevent_endless = 10; + i = 0; buf.k = kbuf; oldfs = get_fs(); set_fs(KERNEL_DS); do { - /* todo: signal_pending? */ err = func(file, buf.u, size, pos); - } while (err == -EAGAIN || err == -EINTR); + if (err == -EINTR + && !au_wkq_test() + && fatal_signal_pending(current)) { + set_fs(oldfs); + err = xino_fwrite_wkq(func, file, kbuf, size, pos); + BUG_ON(err == -EINTR); + oldfs = get_fs(); + set_fs(KERNEL_DS); + } + } while (i++ < prevent_endless + && (err == -EAGAIN || err == -EINTR)); set_fs(oldfs); #if 0 /* reserved for future use */