• Eric Sandeen's avatar
    xfs: always return -ENOSPC on project quota reservation failure · dcf1ccc9
    Eric Sandeen authored
    XFS project quota treats project hierarchies as "mini filesysems" and
    so rather than -EDQUOT, the intent is to return -ENOSPC when a quota
    reservation fails, but this behavior is not consistent.
    
    The only place we make a decision between -EDQUOT and -ENOSPC
    returns based on quota type is in xfs_trans_dqresv().
    
    This behavior is currently controlled by whether or not the
    XFS_QMOPT_ENOSPC flag gets passed into the quota reservation.  However,
    its use is not consistent; paths such as xfs_create() and xfs_symlink()
    don't set the flag, so a reservation failure will return -EDQUOT for
    project quota reservation failures rather than -ENOSPC for these sorts
    of operations, even for project quota:
    
    # mkdir mnt/project
    # xfs_quota -x -c "project -s -p mnt/project 42" mnt
    # xfs_quota -x -c 'limit -p isoft=2 ihard=3 42' mnt
    # touch mnt/project/file{1,2,3}
    touch: cannot touch ‘mnt/project/file3’: Disk quota exceeded
    
    We can make this consistent by not requiring the flag to be set at the
    top of the callchain; instead we can simply test whether we are
    reserving a project quota with XFS_QM_ISPDQ in xfs_trans_dqresv and if
    so, return -ENOSPC for that failure.  This removes the need for the
    XFS_QMOPT_ENOSPC altogether and simplifies the code a fair bit.
    Signed-off-by: default avatarEric Sandeen <sandeen@redhat.com>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    Reviewed-by: default avatarBrian Foster <bfoster@redhat.com>
    Reviewed-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    dcf1ccc9
xfs_trans_dquot.c 21.1 KB