Received: by 10.213.65.68 with SMTP id h4csp1452342imn; Thu, 29 Mar 2018 05:07:51 -0700 (PDT) X-Google-Smtp-Source: AIpwx4/KClEngGxBtH5VDlSpXc8kb+lmyn0SXv+set5/dz0M1ig5b4uUvv9kKXVW1SK71Az6xOKq X-Received: by 2002:a17:902:24:: with SMTP id 33-v6mr8056018pla.341.1522325271236; Thu, 29 Mar 2018 05:07:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1522325271; cv=none; d=google.com; s=arc-20160816; b=UjhhzjcLsuSAccrJWCcbng8EqQdouumEpEk05vWOCVuASzxK7+uwqyaWr41p5x0btg tnICzaRns/3Sqj6zLV8fhjPM0rQQZe7xiS9mm97paFFxN2V17TjuzJaoQuy/mkyBhZuV +/1p/EwKzZjGEQLuEVah5v8IIunge/4RakC+P0Afcm4PGtG3PG9+LoKcAn4i4bnwOPia 8gYf/2qm1s9vNE+dNmXyL2iaLRiXyjdCy8BHPCg+uJQqKxH8iO1C3pKBd6pdOGrtbxHw QTziZ+6AgmtQZdiVfcCUH5fk0yoru20zbzWr55PEs7D9mGEps49LuwHWNynq6agi0LRn F71Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=Nn2ZFavlj54NUpbxuk9p1njQS6nxkPFhsTU6W5T8hpQ=; b=CiRvH/7FE+yq6EffSmgj9UU4aqZ0XJFuW8YobDBG5N5g0jplyXOamyi0GXBMqsA/bV k90sqrMOIlqB+SAnOT0qVbvzygn4w1Au41dP5bsxDptYVvvUBfzUwg/IouXrjq/wLzyB 6TvUG++cc1p3KKs9f6Lyy/5pXo/jTk7f5Lcj70c8qCqq/THjJlIbu4zEp528hHRo3GP3 G+b/FS4S1qPE+f8VtDnnrikYPLjWoproTc4sX8C8IbgoPxvkgkSnJbydENjX9ITPXbEg R84LUTzZZZGC0mKJRxrR0rhepeYdpxBAzv7mibph3Kh4+yPGyxmE+e/CP0gV9ShDgKXZ lN3Q== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id u7-v6si5617458plr.293.2018.03.29.05.07.37; Thu, 29 Mar 2018 05:07:51 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752942AbeC2MGh (ORCPT + 99 others); Thu, 29 Mar 2018 08:06:37 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:52756 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752732AbeC2MGW (ORCPT ); Thu, 29 Mar 2018 08:06:22 -0400 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B6248406E968; Thu, 29 Mar 2018 12:06:21 +0000 (UTC) Received: from max.home.com (ovpn-117-14.ams2.redhat.com [10.36.117.14]) by smtp.corp.redhat.com (Postfix) with ESMTP id 573D2215CDC5; Thu, 29 Mar 2018 12:06:20 +0000 (UTC) From: Andreas Gruenbacher To: cluster-devel@redhat.com Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, NeilBrown , Thomas Graf , Herbert Xu , Tom Herbert , Andreas Gruenbacher Subject: [PATCH v2 2/2] gfs2: Stop using rhashtable_walk_peek Date: Thu, 29 Mar 2018 14:06:12 +0200 Message-Id: <20180329120612.6104-3-agruenba@redhat.com> In-Reply-To: <20180329120612.6104-1-agruenba@redhat.com> References: <20180329120612.6104-1-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.78 on 10.11.54.6 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.7]); Thu, 29 Mar 2018 12:06:21 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.7]); Thu, 29 Mar 2018 12:06:21 +0000 (UTC) for IP:'10.11.54.6' DOMAIN:'int-mx06.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'agruenba@redhat.com' RCPT:'' Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Function rhashtable_walk_peek is problematic because there is no guarantee that the glock previously returned still exists; when that key is deleted, rhashtable_walk_peek can end up returning a different key, which will cause an inconsistent glock dump. Fix this by keeping track of the current glock in the seq file iterator functions instead. Signed-off-by: Andreas Gruenbacher --- fs/gfs2/glock.c | 47 ++++++++++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c index 82fb5583445c..097bd3c0f270 100644 --- a/fs/gfs2/glock.c +++ b/fs/gfs2/glock.c @@ -1923,28 +1923,37 @@ void gfs2_glock_exit(void) static void gfs2_glock_iter_next(struct gfs2_glock_iter *gi, loff_t n) { - if (n == 0) - gi->gl = rhashtable_walk_peek(&gi->hti); - else { - gi->gl = rhashtable_walk_next(&gi->hti); - n--; + struct gfs2_glock *gl = gi->gl; + + if (gl) { + if (n == 0) + return; + if (!lockref_put_not_zero(&gl->gl_lockref)) + gfs2_glock_queue_put(gl); } for (;;) { - if (IS_ERR_OR_NULL(gi->gl)) { - if (!gi->gl) - return; - if (PTR_ERR(gi->gl) != -EAGAIN) { - gi->gl = NULL; - return; + gl = rhashtable_walk_next(&gi->hti); + if (IS_ERR_OR_NULL(gl)) { + if (gl == ERR_PTR(-EAGAIN)) { + n = 1; + continue; } - n = 0; - } else if (gi->sdp == gi->gl->gl_name.ln_sbd && - !__lockref_is_dead(&gi->gl->gl_lockref)) { - if (!n--) - break; + gl = NULL; + break; + } + if (gl->gl_name.ln_sbd != gi->sdp) + continue; + if (n <= 1) { + if (!lockref_get_not_dead(&gl->gl_lockref)) + continue; + break; + } else { + if (__lockref_is_dead(&gl->gl_lockref)) + continue; + n--; } - gi->gl = rhashtable_walk_next(&gi->hti); } + gi->gl = gl; } static void *gfs2_glock_seq_start(struct seq_file *seq, loff_t *pos) @@ -1988,7 +1997,6 @@ static void gfs2_glock_seq_stop(struct seq_file *seq, void *iter_ptr) { struct gfs2_glock_iter *gi = seq->private; - gi->gl = NULL; rhashtable_walk_stop(&gi->hti); } @@ -2076,7 +2084,8 @@ static int gfs2_glocks_release(struct inode *inode, struct file *file) struct seq_file *seq = file->private_data; struct gfs2_glock_iter *gi = seq->private; - gi->gl = NULL; + if (gi->gl) + gfs2_glock_put(gi->gl); rhashtable_walk_exit(&gi->hti); return seq_release_private(inode, file); } -- 2.14.3