Received: by 2002:a05:6a11:4021:0:0:0:0 with SMTP id ky33csp1221263pxb; Thu, 16 Sep 2021 02:33:26 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzs79O5EfXwG2e3Qy2kogbE/gTwoLrnVdxyXvDNbLXv8kihHIOiUtsNKUD/sEHR7hCLBdfk X-Received: by 2002:a17:906:1299:: with SMTP id k25mr5177719ejb.139.1631784805776; Thu, 16 Sep 2021 02:33:25 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1631784805; cv=none; d=google.com; s=arc-20160816; b=wT6wYedSNTAAkfMcmv1PvBXw2Yp5MaGL68UYECSkutlmb9A1IBfNJFdytuEvm/pCkn FiglZGEnR1Etftn5K0TKL64hxeyMWxHmRLMLuA1wIz//YgCNoFfEDU6Wib7tSi3EkYaN lsGpXrNDuDesbi+CYnmzsbl7e1D5/VgWqXy/wyiAcP07LvoWwKA6K5e9A3DPz7rzO888 dIGuwmN9knzmymAi376+P0Sy9qeEi9uj0Xx0krPmekdX/JOegScMd0pSCxrd1AhEeRp2 OPMAuNsWnWQK+pqA50eG4jrWw/Z4f+FGaTGDg7nV+0NczJyJlnvzJt5jLetxdOwe8F2E s0Kg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:cc:to:subject :message-id:date:from:reply-to:in-reply-to:references:mime-version :dkim-signature; bh=A2Iia96pxfixNeVHvIK/3gOcz3FNSlkYOFHSjf8UkDs=; b=IqI4B++7uR7QdIjfLsGZvuTOjCjX9RMpLlHU290jUn5LR7mxay3FVX9/nCFJY6glEf awEXxV58hMvxV9GbMBq7UC+pj0DXcjj8+AGXFluO47Tp/Fo658NF4N2DiMXTi/sPVyxP niRyHpmv+pFyPI0QrBVBUM2Nq+SdpT93oGAY4Mzzbr2Z1hnAG4Ua7DUE9WdZg7ZAyV4I 1G30MOIDUb73JqIq8gL9DL6gIn/EIz5JSiUIJxTtS+o9fIDkH9oslFuCtdN559qW9dX4 cbbRUx4RpCaEMqjvW38US4fXgzzvh+Faf9JrW98ABu7K6E5HAugKADl+1YPilABBjDck KuRg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b="Z/0MiOhF"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id ci18si2922728ejc.564.2021.09.16.02.33.02; Thu, 16 Sep 2021 02:33:25 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b="Z/0MiOhF"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235725AbhIPJch (ORCPT + 99 others); Thu, 16 Sep 2021 05:32:37 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35122 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235321AbhIPJch (ORCPT ); Thu, 16 Sep 2021 05:32:37 -0400 Received: from mail-qk1-x736.google.com (mail-qk1-x736.google.com [IPv6:2607:f8b0:4864:20::736]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E80C0C061574; Thu, 16 Sep 2021 02:31:16 -0700 (PDT) Received: by mail-qk1-x736.google.com with SMTP id ay33so6617051qkb.10; Thu, 16 Sep 2021 02:31:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:references:in-reply-to:reply-to:from:date:message-id :subject:to:cc:content-transfer-encoding; bh=A2Iia96pxfixNeVHvIK/3gOcz3FNSlkYOFHSjf8UkDs=; b=Z/0MiOhFfYt3ctm+hYPOgoqkeqpc4XfpyHWwVbd74eONJWlNMsho7KwrMoMTt3jmNc IHGITiqb+NJVoe+CSKNWczkOZDn/Zeu06X8K+3z/zy+6az59g+6vzCmShp051vzddETE SHhCq3ic8q3VPnIrdPGqpQwUXQjnwD0KlCSGP9dy+jSJ4g2uGY2JJojE41TXz+99bJau +a1O+gFpE2brtPe39Bvpi0LMUf+djwNgNg28/PyBBOXftD1nkgp2yUAwfslEkO9xLBIi JsO2mtUyIjZiGZMf1xv/FcsOj94vHhMUiihKeUIKBa7GwFUt1PenY2fogiXF2bXeAYew DHDA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:reply-to :from:date:message-id:subject:to:cc:content-transfer-encoding; bh=A2Iia96pxfixNeVHvIK/3gOcz3FNSlkYOFHSjf8UkDs=; b=J0Wu2fHpzw32hMWtvIB+yA6g2ndQ/2MjBMtY+8om3JxWQmvjH2iRtSVZZUkpw4Juwp Qiq+XlUlBFxJlKKDOYPaZMchILya7GeWpTBkOnzjatk1dhLo7RRrduYc8+nTfA4ZnJhA LMrN3blFhKUr+6mWe/hn4FD+GaPKtmm7diqTIAPMA8+Eoa8TQioNnjJtlUpumC4zC/ag uLxzU1nTsLPk3V0/OXMYxmCKUDs2HtIMdCydLA/JKtvVn/hyAQsGBrNmOCURDGHfh+TY hISMpCLJc05CuCmNGtlzgQO/5QTN4HyYDWFTOAs1u3WqMwTFfnSSdMTFw+D+zcFVpYwx lFtQ== X-Gm-Message-State: AOAM5316ea3UVjZhUeyyttmUuGIx8zC/l4IdXFsyDL/ptcXGNqAQqbGY nX5JM359OugpGA4jFawrbPHaaMZt5rq37DcdtKc= X-Received: by 2002:a05:620a:5a7:: with SMTP id q7mr4114196qkq.163.1631784676081; Thu, 16 Sep 2021 02:31:16 -0700 (PDT) MIME-Version: 1.0 References: <20210906012559.8605-1-baptiste.lepers@gmail.com> In-Reply-To: <20210906012559.8605-1-baptiste.lepers@gmail.com> Reply-To: fdmanana@gmail.com From: Filipe Manana Date: Thu, 16 Sep 2021 10:30:40 +0100 Message-ID: Subject: Re: [PATCH] btrfs: transaction: Fix misplaced barrier in btrfs_record_root_in_trans To: Baptiste Lepers Cc: "Paul E . McKenney" , Chris Mason , Josef Bacik , David Sterba , linux-btrfs , Linux Kernel Mailing List Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, Sep 6, 2021 at 2:38 AM Baptiste Lepers wrote: > > Per comment, record_root_in_trans orders the writes of the root->state > and root->last_trans: > set_bit(BTRFS_ROOT_IN_TRANS_SETUP, &root->state); > smp_wmb(); > root->last_trans =3D trans->transid; > > But the barrier that enforces the order on the read side is misplaced: > smp_rmb(); <-- misplaced > if (root->last_trans =3D=3D trans->transid && > <-- missing barrier here --> > !test_bit(BTRFS_ROOT_IN_TRANS_SETUP, &root->state)) > > This patches fixes the ordering and wraps the racy accesses with > READ_ONCE and WRITE_ONCE calls to avoid load/store tearing. > > Fixes: 7585717f304f5 ("Btrfs: fix relocation races") > Signed-off-by: Baptiste Lepers > --- > fs/btrfs/transaction.c | 7 ++++--- > 1 file changed, 4 insertions(+), 3 deletions(-) > > diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c > index 14b9fdc8aaa9..a609222e6704 100644 > --- a/fs/btrfs/transaction.c > +++ b/fs/btrfs/transaction.c > @@ -437,7 +437,7 @@ static int record_root_in_trans(struct btrfs_trans_ha= ndle *trans, > (unsigned long)root->root_key.objectid= , > BTRFS_ROOT_TRANS_TAG); > spin_unlock(&fs_info->fs_roots_radix_lock); > - root->last_trans =3D trans->transid; > + WRITE_ONCE(root->last_trans, trans->transid); > > /* this is pretty tricky. We don't want to > * take the relocation lock in btrfs_record_root_in_trans > @@ -489,7 +489,7 @@ int btrfs_record_root_in_trans(struct btrfs_trans_han= dle *trans, > struct btrfs_root *root) > { > struct btrfs_fs_info *fs_info =3D root->fs_info; > - int ret; > + int ret, last_trans; last_trans should be u64, as root->last_trans is a u64. Other than that it looks good to me. Thanks. > > if (!test_bit(BTRFS_ROOT_SHAREABLE, &root->state)) > return 0; > @@ -498,8 +498,9 @@ int btrfs_record_root_in_trans(struct btrfs_trans_han= dle *trans, > * see record_root_in_trans for comments about IN_TRANS_SETUP usa= ge > * and barriers > */ > + last_trans =3D READ_ONCE(root->last_trans); > smp_rmb(); > - if (root->last_trans =3D=3D trans->transid && > + if (last_trans =3D=3D trans->transid && > !test_bit(BTRFS_ROOT_IN_TRANS_SETUP, &root->state)) > return 0; > > -- > 2.17.1 > --=20 Filipe David Manana, =E2=80=9CWhether you think you can, or you think you can't =E2=80=94 you're= right.=E2=80=9D