From patchwork Thu Feb 27 21:11:10 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Simmons X-Patchwork-Id: 11410253 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 1B10B92A for ; Thu, 27 Feb 2020 21:33:40 +0000 (UTC) Received: from pdx1-mailman02.dreamhost.com (pdx1-mailman02.dreamhost.com [64.90.62.194]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 0237E24677 for ; Thu, 27 Feb 2020 21:33:40 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 0237E24677 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=infradead.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lustre-devel-bounces@lists.lustre.org Received: from pdx1-mailman02.dreamhost.com (localhost [IPv6:::1]) by pdx1-mailman02.dreamhost.com (Postfix) with ESMTP id 6197C349D5D; Thu, 27 Feb 2020 13:28:31 -0800 (PST) X-Original-To: lustre-devel@lists.lustre.org Delivered-To: lustre-devel-lustre.org@pdx1-mailman02.dreamhost.com Received: from smtp3.ccs.ornl.gov (smtp3.ccs.ornl.gov [160.91.203.39]) by pdx1-mailman02.dreamhost.com (Postfix) with ESMTP id D8B4A21FBD9 for ; Thu, 27 Feb 2020 13:19:19 -0800 (PST) Received: from star.ccs.ornl.gov (star.ccs.ornl.gov [160.91.202.134]) by smtp3.ccs.ornl.gov (Postfix) with ESMTP id A99E42AD5; Thu, 27 Feb 2020 16:18:15 -0500 (EST) Received: by star.ccs.ornl.gov (Postfix, from userid 2004) id A7FA846C; Thu, 27 Feb 2020 16:18:15 -0500 (EST) From: James Simmons To: Andreas Dilger , Oleg Drokin , NeilBrown Date: Thu, 27 Feb 2020 16:11:10 -0500 Message-Id: <1582838290-17243-203-git-send-email-jsimmons@infradead.org> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1582838290-17243-1-git-send-email-jsimmons@infradead.org> References: <1582838290-17243-1-git-send-email-jsimmons@infradead.org> Subject: [lustre-devel] [PATCH 202/622] lustre: clio: fix incorrect invariant in cl_io_iter_fini() X-BeenThere: lustre-devel@lists.lustre.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: "For discussing Lustre software development." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: James Simmons , Lustre Development List MIME-Version: 1.0 Errors-To: lustre-devel-bounces@lists.lustre.org Sender: "lustre-devel" It was discovered during PFL testing that if LINVRNT() is enabled that cl_io_iter_fini() will crash with the following backtrace: kernel: LustreError: 16009:0:(cl_io.c:439:cl_io_iter_fini()) ASSERTION( io->ci_state == CIS_UNLOCKED ) failed kernel: cl_io_iter_fini+0x10c/0x110 [obdclass] kernel: cl_io_loop+0x46/0x220 [obdclass] kernel: cl_setattr_ost+0x1ed/0x2a0 [lustre] kernel: ll_setattr_raw+0x7b0/0x9a0 [lustre] kernel: notify_change+0x1dc/0x430 kernel: do_truncate+0x72/0xc0 kernel: do_sys_ftruncate+0xf5/0x160 This is due to the incorrect assumption that the ci_state will always be CIS_UNLOCKED, but by looking at the behavior of cl_io_loop() it can be seen that is not the case with PFL. We do want to make sure the IO state is not in the middle of some other action (up to CIS_IT_STARTED or CIS_IO_FINISHED or later) when cl_io_iter_fini() is called. WC-bug-id: https://jira.whamcloud.com/browse/LU-11828 Lustre-commit: 8160b9bdf16c ("LU-11828 clio: fix incorrect invariant in cl_io_iter_fini()") Signed-off-by: James Simmons Reviewed-on: https://review.whamcloud.com/33915 Reviewed-by: Andreas Dilger Reviewed-by: Bobi Jam Reviewed-by: Jinshan Xiong Reviewed-by: Oleg Drokin Signed-off-by: James Simmons --- fs/lustre/obdclass/cl_io.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fs/lustre/obdclass/cl_io.c b/fs/lustre/obdclass/cl_io.c index a98be15..4278bc0 100644 --- a/fs/lustre/obdclass/cl_io.c +++ b/fs/lustre/obdclass/cl_io.c @@ -412,7 +412,8 @@ void cl_io_iter_fini(const struct lu_env *env, struct cl_io *io) const struct cl_io_slice *scan; LINVRNT(cl_io_is_loopable(io)); - LINVRNT(io->ci_state < CIS_LOCKED || io->ci_state > CIS_IO_FINISHED); + LINVRNT(io->ci_state <= CIS_IT_STARTED || + io->ci_state > CIS_IO_FINISHED); LINVRNT(cl_io_invariant(io)); list_for_each_entry_reverse(scan, &io->ci_layers, cis_linkage) {