lkml.org 
[lkml]   [2020]   [May]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.6 038/106] xfs: acquire superblock freeze protection on eofblocks scans
    Date
    From: Brian Foster <bfoster@redhat.com>

    commit 4b674b9ac852937af1f8c62f730c325fb6eadcdb upstream.

    The filesystem freeze sequence in XFS waits on any background
    eofblocks or cowblocks scans to complete before the filesystem is
    quiesced. At this point, the freezer has already stopped the
    transaction subsystem, however, which means a truncate or cowblock
    cancellation in progress is likely blocked in transaction
    allocation. This results in a deadlock between freeze and the
    associated scanner.

    Fix this problem by holding superblock write protection across calls
    into the block reapers. Since protection for background scans is
    acquired from the workqueue task context, trylock to avoid a similar
    deadlock between freeze and blocking on the write lock.

    Fixes: d6b636ebb1c9f ("xfs: halt auto-reclamation activities while rebuilding rmap")
    Reported-by: Paul Furtado <paulfurtado91@gmail.com>
    Signed-off-by: Brian Foster <bfoster@redhat.com>
    Reviewed-by: Chandan Rajendra <chandanrlinux@gmail.com>
    Reviewed-by: Christoph Hellwig <hch@lst.de>
    Reviewed-by: Allison Collins <allison.henderson@oracle.com>
    Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
    Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    fs/xfs/xfs_icache.c | 10 ++++++++++
    fs/xfs/xfs_ioctl.c | 5 ++++-
    2 files changed, 14 insertions(+), 1 deletion(-)

    --- a/fs/xfs/xfs_icache.c
    +++ b/fs/xfs/xfs_icache.c
    @@ -907,7 +907,12 @@ xfs_eofblocks_worker(
    {
    struct xfs_mount *mp = container_of(to_delayed_work(work),
    struct xfs_mount, m_eofblocks_work);
    +
    + if (!sb_start_write_trylock(mp->m_super))
    + return;
    xfs_icache_free_eofblocks(mp, NULL);
    + sb_end_write(mp->m_super);
    +
    xfs_queue_eofblocks(mp);
    }

    @@ -934,7 +939,12 @@ xfs_cowblocks_worker(
    {
    struct xfs_mount *mp = container_of(to_delayed_work(work),
    struct xfs_mount, m_cowblocks_work);
    +
    + if (!sb_start_write_trylock(mp->m_super))
    + return;
    xfs_icache_free_cowblocks(mp, NULL);
    + sb_end_write(mp->m_super);
    +
    xfs_queue_cowblocks(mp);
    }

    --- a/fs/xfs/xfs_ioctl.c
    +++ b/fs/xfs/xfs_ioctl.c
    @@ -2264,7 +2264,10 @@ xfs_file_ioctl(
    if (error)
    return error;

    - return xfs_icache_free_eofblocks(mp, &keofb);
    + sb_start_write(mp->m_super);
    + error = xfs_icache_free_eofblocks(mp, &keofb);
    + sb_end_write(mp->m_super);
    + return error;
    }

    default:

    \
     
     \ /
      Last update: 2020-05-01 15:49    [W:2.111 / U:0.108 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site