• D
    f2fs: Lower threshold for disable_cp_again · ae4ad7ea
    Daniel Rosenberg 提交于
    The existing threshold for allowable holes at checkpoint=disable time is
    too high. The OVP space contains reserved segments, which are always in
    the form of free segments. These must be subtracted from the OVP value.
    
    The current threshold is meant to be the maximum value of holes of a
    single type we can have and still guarantee that we can fill the disk
    without failing to find space for a block of a given type.
    
    If the disk is full, ignoring current reserved, which only helps us,
    the amount of unused blocks is equal to the OVP area. Of that, there
    are reserved segments, which must be free segments, and the rest of the
    ovp area, which can come from either free segments or holes. The maximum
    possible amount of holes is OVP-reserved.
    
    Now, consider the disk when mounting with checkpoint=disable.
    We must be able to fill all available free space with either data or
    node blocks. When we start with checkpoint=disable, holes are locked to
    their current type. Say we have H of one type of hole, and H+X of the
    other. We can fill H of that space with arbitrary typed blocks via SSR.
    For the remaining H+X blocks, we may not have any of a given block type
    left at all. For instance, if we were to fill the disk entirely with
    blocks of the type with fewer holes, the H+X blocks of the opposite type
    would not be used. If H+X > OVP-reserved, there would be more holes than
    could possibly exist, and we would have failed to find a suitable block
    earlier on, leading to a crash in update_sit_entry.
    
    If H+X <= OVP-reserved, then the holes end up effectively masked by the OVP
    region in this case.
    Signed-off-by: NDaniel Rosenberg <drosen@google.com>
    Reviewed-by: NChao Yu <yuchao0@huawei.com>
    Signed-off-by: NJaegeuk Kim <jaegeuk@kernel.org>
    ae4ad7ea
segment.c 114.6 KB