lkml.org 
[lkml]   [2023]   [Sep]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 13/21] fs: xfs: Make file data allocations observe the 'forcealign' flag
    Date
    From: "Darrick J. Wong" <djwong@kernel.org>

    The existing extsize hint code already did the work of expanding file
    range mapping requests so that the range is aligned to the hint value.
    Now add the code we need to guarantee that the space allocations are
    also always aligned.

    XXX: still need to check all this with reflink

    Signed-off-by: Darrick J. Wong <djwong@kernel.org>
    Co-developed-by: John Garry <john.g.garry@oracle.com>
    Signed-off-by: John Garry <john.g.garry@oracle.com>
    ---
    fs/xfs/libxfs/xfs_bmap.c | 22 +++++++++++++++++-----
    fs/xfs/xfs_iomap.c | 4 +++-
    2 files changed, 20 insertions(+), 6 deletions(-)

    diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c
    index 328134c22104..6c864dc0a6ff 100644
    --- a/fs/xfs/libxfs/xfs_bmap.c
    +++ b/fs/xfs/libxfs/xfs_bmap.c
    @@ -3328,6 +3328,19 @@ xfs_bmap_compute_alignments(
    align = xfs_get_cowextsz_hint(ap->ip);
    else if (ap->datatype & XFS_ALLOC_USERDATA)
    align = xfs_get_extsz_hint(ap->ip);
    +
    + /*
    + * xfs_get_cowextsz_hint() returns extsz_hint for when forcealign is
    + * set as forcealign and cowextsz_hint are mutually exclusive
    + */
    + if (xfs_inode_forcealign(ap->ip) && align) {
    + args->alignment = align;
    + if (stripe_align % align)
    + stripe_align = align;
    + } else {
    + args->alignment = 1;
    + }
    +
    if (align) {
    if (xfs_bmap_extsize_align(mp, &ap->got, &ap->prev, align, 0,
    ap->eof, 0, ap->conv, &ap->offset,
    @@ -3423,7 +3436,6 @@ xfs_bmap_exact_minlen_extent_alloc(
    args.minlen = args.maxlen = ap->minlen;
    args.total = ap->total;

    - args.alignment = 1;
    args.minalignslop = 0;

    args.minleft = ap->minleft;
    @@ -3469,6 +3481,7 @@ xfs_bmap_btalloc_at_eof(
    {
    struct xfs_mount *mp = args->mp;
    struct xfs_perag *caller_pag = args->pag;
    + int orig_alignment = args->alignment;
    int error;

    /*
    @@ -3543,10 +3556,10 @@ xfs_bmap_btalloc_at_eof(

    /*
    * Allocation failed, so turn return the allocation args to their
    - * original non-aligned state so the caller can proceed on allocation
    - * failure as if this function was never called.
    + * original state so the caller can proceed on allocation failure as
    + * if this function was never called.
    */
    - args->alignment = 1;
    + args->alignment = orig_alignment;
    return 0;
    }

    @@ -3694,7 +3707,6 @@ xfs_bmap_btalloc(
    .wasdel = ap->wasdel,
    .resv = XFS_AG_RESV_NONE,
    .datatype = ap->datatype,
    - .alignment = 1,
    .minalignslop = 0,
    };
    xfs_fileoff_t orig_offset;
    diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c
    index 18c8f168b153..70fe873951f3 100644
    --- a/fs/xfs/xfs_iomap.c
    +++ b/fs/xfs/xfs_iomap.c
    @@ -181,7 +181,9 @@ xfs_eof_alignment(
    * If mounted with the "-o swalloc" option the alignment is
    * increased from the strip unit size to the stripe width.
    */
    - if (mp->m_swidth && xfs_has_swalloc(mp))
    + if (xfs_inode_forcealign(ip))
    + align = xfs_get_extsz_hint(ip);
    + else if (mp->m_swidth && xfs_has_swalloc(mp))
    align = mp->m_swidth;
    else if (mp->m_dalign)
    align = mp->m_dalign;
    --
    2.31.1
    \
     
     \ /
      Last update: 2023-09-29 12:31    [W:4.678 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site