• D
    xfs: fix chown leaking delalloc quota blocks when fssetxattr fails · 1aecf373
    Darrick J. Wong 提交于
    While refactoring the quota code to create a function to allocate inode
    change transactions, I noticed that xfs_qm_vop_chown_reserve does more
    than just make reservations: it also *modifies* the incore counts
    directly to handle the owner id change for the delalloc blocks.
    
    I then observed that the fssetxattr code continues validating input
    arguments after making the quota reservation but before dirtying the
    transaction.  If the routine decides to error out, it fails to undo the
    accounting switch!  This leads to incorrect quota reservation and
    failure down the line.
    
    We can fix this by making the reservation function do only that -- for
    the new dquot, it reserves ondisk and delalloc blocks to the
    transaction, and the old dquot hangs on to its incore reservation for
    now.  Once we actually switch the dquots, we can then update the incore
    reservations because we've dirtied the transaction and it's too late to
    turn back now.
    
    No fixes tag because this has been broken since the start of git.
    Signed-off-by: NDarrick J. Wong <djwong@kernel.org>
    Reviewed-by: NChristoph Hellwig <hch@lst.de>
    Reviewed-by: NBrian Foster <bfoster@redhat.com>
    1aecf373
xfs_qm.c 46.2 KB