• Kent Overstreet's avatar
    bcachefs: bch2_propagate_key_to_snapshot_leaves() · a111901f
    Kent Overstreet authored
    If fsck finds a key that needs work done, the primary example being an
    unlinked inode that needs to be deleted, and the key is in an internal
    snapshot node, we have a bit of a conundrum.
    
    The conundrum is that internal snapshot nodes are shared, and we in
    general do updates in internal snapshot nodes because there may be
    overwrites in some snapshots and not others, and this may affect other
    keys referenced by this key (i.e. extents).
    
    For example, we might be seeing an unlinked inode in an internal
    snapshot node, but then in one child snapshot the inode might have been
    reattached and might not be unlinked. Deleting the inode in the internal
    snapshot node would be wrong, because then we'll delete all the extents
    that the child snapshot references.
    
    But if an unlinked inode does not have any overwrites in child
    snapshots, we're fine: the inode is overwrritten in all child snapshots,
    so we can do the deletion at the point of comonality in the snapshot
    tree, i.e. the node where we found it.
    
    This patch adds a new helper, bch2_propagate_key_to_snapshot_leaves(),
    to handle the case where we need a to update a key that does have
    overwrites in child snapshots: we copy the key to leaf snapshot nodes,
    and then rewind fsck and process the needed updates there.
    
    With this, fsck can now always correctly handle unlinked inodes found in
    internal snapshot nodes.
    Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
    a111901f
snapshot.h 6.5 KB