• C
    xfs: Check for extent overflow when renaming dir entries · 02092a2f
    Chandan Babu R 提交于
    A rename operation is essentially a directory entry remove operation
    from the perspective of parent directory (i.e. src_dp) of rename's
    source. Hence the only place where we check for extent count overflow
    for src_dp is in xfs_bmap_del_extent_real(). xfs_bmap_del_extent_real()
    returns -ENOSPC when it detects a possible extent count overflow and in
    response, the higher layers of directory handling code do the following:
    1. Data/Free blocks: XFS lets these blocks linger until a future remove
       operation removes them.
    2. Dabtree blocks: XFS swaps the blocks with the last block in the Leaf
       space and unmaps the last block.
    
    For target_dp, there are two cases depending on whether the destination
    directory entry exists or not.
    
    When destination directory entry does not exist (i.e. target_ip ==
    NULL), extent count overflow check is performed only when transaction
    has a non-zero sized space reservation associated with it.  With a
    zero-sized space reservation, XFS allows a rename operation to continue
    only when the directory has sufficient free space in its data/leaf/free
    space blocks to hold the new entry.
    
    When destination directory entry exists (i.e. target_ip != NULL), all
    we need to do is change the inode number associated with the already
    existing entry. Hence there is no need to perform an extent count
    overflow check.
    Signed-off-by: NChandan Babu R <chandanrlinux@gmail.com>
    Reviewed-by: NDarrick J. Wong <darrick.wong@oracle.com>
    Signed-off-by: NDarrick J. Wong <darrick.wong@oracle.com>
    02092a2f
xfs_inode.c 102.4 KB