lkml.org 
[lkml]   [2021]   [Nov]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 291/355] pnfs/flexfiles: Fix misplaced barrier in nfs4_ff_layout_prepare_ds
    Date
    From: Baptiste Lepers <baptiste.lepers@gmail.com>

    [ Upstream commit a2915fa06227b056a8f9b0d79b61dca08ad5cfc6 ]

    _nfs4_pnfs_v3/v4_ds_connect do
    some work
    smp_wmb
    ds->ds_clp = clp;

    And nfs4_ff_layout_prepare_ds currently does
    smp_rmb
    if(ds->ds_clp)
    ...

    This patch places the smp_rmb after the if. This ensures that following
    reads only happen once nfs4_ff_layout_prepare_ds has checked that data
    has been properly initialized.

    Fixes: d67ae825a59d6 ("pnfs/flexfiles: Add the FlexFile Layout Driver")
    Signed-off-by: Baptiste Lepers <baptiste.lepers@gmail.com>
    Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    fs/nfs/flexfilelayout/flexfilelayoutdev.c | 4 ++--
    fs/nfs/pnfs_nfs.c | 4 ++--
    2 files changed, 4 insertions(+), 4 deletions(-)

    diff --git a/fs/nfs/flexfilelayout/flexfilelayoutdev.c b/fs/nfs/flexfilelayout/flexfilelayoutdev.c
    index 3eda40a320a53..1f12297109b41 100644
    --- a/fs/nfs/flexfilelayout/flexfilelayoutdev.c
    +++ b/fs/nfs/flexfilelayout/flexfilelayoutdev.c
    @@ -378,10 +378,10 @@ nfs4_ff_layout_prepare_ds(struct pnfs_layout_segment *lseg,
    goto noconnect;

    ds = mirror->mirror_ds->ds;
    + if (READ_ONCE(ds->ds_clp))
    + goto out;
    /* matching smp_wmb() in _nfs4_pnfs_v3/4_ds_connect */
    smp_rmb();
    - if (ds->ds_clp)
    - goto out;

    /* FIXME: For now we assume the server sent only one version of NFS
    * to use for the DS.
    diff --git a/fs/nfs/pnfs_nfs.c b/fs/nfs/pnfs_nfs.c
    index 249cf9037dbd7..aff44a7b98f86 100644
    --- a/fs/nfs/pnfs_nfs.c
    +++ b/fs/nfs/pnfs_nfs.c
    @@ -641,7 +641,7 @@ static int _nfs4_pnfs_v3_ds_connect(struct nfs_server *mds_srv,
    }

    smp_wmb();
    - ds->ds_clp = clp;
    + WRITE_ONCE(ds->ds_clp, clp);
    dprintk("%s [new] addr: %s\n", __func__, ds->ds_remotestr);
    out:
    return status;
    @@ -714,7 +714,7 @@ static int _nfs4_pnfs_v4_ds_connect(struct nfs_server *mds_srv,
    }

    smp_wmb();
    - ds->ds_clp = clp;
    + WRITE_ONCE(ds->ds_clp, clp);
    dprintk("%s [new] addr: %s\n", __func__, ds->ds_remotestr);
    out:
    return status;
    --
    2.33.0


    \
     
     \ /
      Last update: 2021-11-15 19:18    [W:4.018 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site