lkml.org 
[lkml]   [2018]   [May]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.16 196/272] gfs2: Fix fallocate chunk size
    Date
    4.16-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Andreas Gruenbacher <agruenba@redhat.com>

    [ Upstream commit 174d1232ebc84fcde8f5889d1171c9c7e74a10a7 ]

    The chunk size of allocations in __gfs2_fallocate is calculated
    incorrectly. The size can collapse, causing __gfs2_fallocate to
    allocate one block at a time, which is very inefficient. This needs
    fixing in two places:

    In gfs2_quota_lock_check, always set ap->allowed to UINT_MAX to indicate
    that there is no quota limit. This fixes callers that rely on
    ap->allowed to be set even when quotas are off.

    In __gfs2_fallocate, reset max_blks to UINT_MAX in each iteration of the
    loop to make sure that allocation limits from one resource group won't
    spill over into another resource group.

    Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
    Signed-off-by: Bob Peterson <rpeterso@redhat.com>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    fs/gfs2/file.c | 5 +++--
    fs/gfs2/quota.h | 2 ++
    2 files changed, 5 insertions(+), 2 deletions(-)

    --- a/fs/gfs2/file.c
    +++ b/fs/gfs2/file.c
    @@ -809,7 +809,7 @@ static long __gfs2_fallocate(struct file
    struct gfs2_inode *ip = GFS2_I(inode);
    struct gfs2_alloc_parms ap = { .aflags = 0, };
    unsigned int data_blocks = 0, ind_blocks = 0, rblocks;
    - loff_t bytes, max_bytes, max_blks = UINT_MAX;
    + loff_t bytes, max_bytes, max_blks;
    int error;
    const loff_t pos = offset;
    const loff_t count = len;
    @@ -861,7 +861,8 @@ static long __gfs2_fallocate(struct file
    return error;
    /* ap.allowed tells us how many blocks quota will allow
    * us to write. Check if this reduces max_blks */
    - if (ap.allowed && ap.allowed < max_blks)
    + max_blks = UINT_MAX;
    + if (ap.allowed)
    max_blks = ap.allowed;

    error = gfs2_inplace_reserve(ip, &ap);
    --- a/fs/gfs2/quota.h
    +++ b/fs/gfs2/quota.h
    @@ -45,6 +45,8 @@ static inline int gfs2_quota_lock_check(
    {
    struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
    int ret;
    +
    + ap->allowed = UINT_MAX; /* Assume we are permitted a whole lot */
    if (sdp->sd_args.ar_quota == GFS2_QUOTA_OFF)
    return 0;
    ret = gfs2_quota_lock(ip, NO_UID_QUOTA_CHANGE, NO_GID_QUOTA_CHANGE);

    \
     
     \ /
      Last update: 2018-05-28 13:13    [W:4.095 / U:0.136 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site