lkml.org 
[lkml]   [2020]   [Jun]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH AUTOSEL 5.7 244/274] xfs: force writes to delalloc regions to unwritten
    On Mon, Jun 08, 2020 at 07:05:37PM -0400, Sasha Levin wrote:
    > From: "Darrick J. Wong" <darrick.wong@oracle.com>
    >
    > [ Upstream commit a5949d3faedf492fa7863b914da408047ab46eb0 ]
    >
    > When writing to a delalloc region in the data fork, commit the new
    > allocations (of the da reservation) as unwritten so that the mappings
    > are only marked written once writeback completes successfully. This
    > fixes the problem of stale data exposure if the system goes down during
    > targeted writeback of a specific region of a file, as tested by
    > generic/042.
    >
    > Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
    > Reviewed-by: Christoph Hellwig <hch@lst.de>
    > Reviewed-by: Brian Foster <bfoster@redhat.com>
    > Signed-off-by: Sasha Levin <sashal@kernel.org>

    Err, this doesn't have a Fixes: tag attached to it. Does it pass
    fstests? Because it doesn't look like you've pulled in "xfs: don't fail
    unwritten extent conversion on writeback due to edquot", which is needed
    to avoid regressing fstests...

    ...waitaminute, that whole series lacks Fixes: tags because it wasn't
    considered a good enough candidate for automatic backport.

    Ummm, does the autosel fstests driver turn on quotas? ;)

    --D

    > ---
    > fs/xfs/libxfs/xfs_bmap.c | 29 +++++++++++++++++------------
    > 1 file changed, 17 insertions(+), 12 deletions(-)
    >
    > diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c
    > index fda13cd7add0..f8fe83c9348d 100644
    > --- a/fs/xfs/libxfs/xfs_bmap.c
    > +++ b/fs/xfs/libxfs/xfs_bmap.c
    > @@ -4193,17 +4193,7 @@ xfs_bmapi_allocate(
    > bma->got.br_blockcount = bma->length;
    > bma->got.br_state = XFS_EXT_NORM;
    >
    > - /*
    > - * In the data fork, a wasdelay extent has been initialized, so
    > - * shouldn't be flagged as unwritten.
    > - *
    > - * For the cow fork, however, we convert delalloc reservations
    > - * (extents allocated for speculative preallocation) to
    > - * allocated unwritten extents, and only convert the unwritten
    > - * extents to real extents when we're about to write the data.
    > - */
    > - if ((!bma->wasdel || (bma->flags & XFS_BMAPI_COWFORK)) &&
    > - (bma->flags & XFS_BMAPI_PREALLOC))
    > + if (bma->flags & XFS_BMAPI_PREALLOC)
    > bma->got.br_state = XFS_EXT_UNWRITTEN;
    >
    > if (bma->wasdel)
    > @@ -4611,8 +4601,23 @@ xfs_bmapi_convert_delalloc(
    > bma.offset = bma.got.br_startoff;
    > bma.length = max_t(xfs_filblks_t, bma.got.br_blockcount, MAXEXTLEN);
    > bma.minleft = xfs_bmapi_minleft(tp, ip, whichfork);
    > +
    > + /*
    > + * When we're converting the delalloc reservations backing dirty pages
    > + * in the page cache, we must be careful about how we create the new
    > + * extents:
    > + *
    > + * New CoW fork extents are created unwritten, turned into real extents
    > + * when we're about to write the data to disk, and mapped into the data
    > + * fork after the write finishes. End of story.
    > + *
    > + * New data fork extents must be mapped in as unwritten and converted
    > + * to real extents after the write succeeds to avoid exposing stale
    > + * disk contents if we crash.
    > + */
    > + bma.flags = XFS_BMAPI_PREALLOC;
    > if (whichfork == XFS_COW_FORK)
    > - bma.flags = XFS_BMAPI_COWFORK | XFS_BMAPI_PREALLOC;
    > + bma.flags |= XFS_BMAPI_COWFORK;
    >
    > if (!xfs_iext_peek_prev_extent(ifp, &bma.icur, &bma.prev))
    > bma.prev.br_startoff = NULLFILEOFF;
    > --
    > 2.25.1
    >

    \
     
     \ /
      Last update: 2020-06-09 03:08    [W:4.089 / U:0.424 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site