• Goldwyn Rodrigues's avatar
    btrfs: qgroups: Retry after commit on getting EDQUOT · 48a89bc4
    Goldwyn Rodrigues authored
    We are facing the same problem with EDQUOT which was experienced with
    ENOSPC. Not sure if we require a full ticketing system such as ENOSPC, but
    here is a quick fix, which may be too big a hammer.
    
    Quotas are reserved during the start of an operation, incrementing
    qg->reserved. However, it is written to disk in a commit_transaction
    which could take as long as commit_interval. In the meantime there
    could be deletions which are not accounted for because deletions are
    accounted for only while committed (free_refroot). So, when we get
    a EDQUOT flush the data to disk and try again.
    
    This fixes fstests btrfs/139.
    
    Here is a sample script which shows this issue.
    
    DEVICE=/dev/vdb
    MOUNTPOINT=/mnt
    TESTVOL=$MOUNTPOINT/tmp
    QUOTA=5
    PROG=btrfs
    DD_BS="4k"
    DD_COUNT="256"
    RUN_TIMES=5000
    
    mkfs.btrfs -f $DEVICE
    mount -o commit=240 $DEVICE $MOUNTPOINT
    $PROG subvolume create $TESTVOL
    $PROG quota enable $TESTVOL
    $PROG qgroup limit ${QUOTA}G $TESTVOL
    
    typeset -i DD_RUN_GOOD
    typeset -i QUOTA
    
    function _check_cmd() {
            if [[ ${?} > 0 ]]; then
                    echo -n "$(date) E: Running previous command"
                    echo ${*}
                    echo "Without sync"
                    $PROG qgroup show -pcreFf ${TESTVOL}
                    echo "With sync"
                    $PROG qgroup show -pcreFf --sync ${TESTVOL}
                    exit 1
            fi
    }
    
    while true; do
      DD_RUN_GOOD=$RUN_TIMES
    
      while (( ${DD_RUN_GOOD} != 0 )); do
            dd if=/dev/zero of=${TESTVOL}/quotatest${DD_RUN_GOOD} bs=${DD_BS} count=${DD_COUNT}
            _check_cmd "dd if=/dev/zero of=${TESTVOL}/quotatest${DD_RUN_GOOD} bs=${DD_BS} count=${DD_COUNT}"
            DD_RUN_GOOD=(${DD_RUN_GOOD}-1)
      done
    
      $PROG qgroup show -pcref $TESTVOL
      echo "----------- Cleanup ---------- "
      rm $TESTVOL/quotatest*
    
    done
    Signed-off-by: default avatarGoldwyn Rodrigues <rgoldwyn@suse.com>
    Reviewed-by: default avatarQu Wenruo <quwenruo@cn.fujitsu.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    48a89bc4
qgroup.c 74.9 KB