diff options
Diffstat (limited to 'fs/bcachefs/snapshot_format.h')
-rw-r--r-- | fs/bcachefs/snapshot_format.h | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/fs/bcachefs/snapshot_format.h b/fs/bcachefs/snapshot_format.h index 9bccae1f3590..444885106140 100644 --- a/fs/bcachefs/snapshot_format.h +++ b/fs/bcachefs/snapshot_format.h @@ -15,10 +15,35 @@ struct bch_snapshot { bch_le128 btime; }; +/* + * WILL_DELETE: leaf node that's no longer referenced by a subvolume, still has + * keys, will be deleted by delete_dead_snapshots + * + * SUBVOL: true if a subvol points to this snapshot (why do we have this? + * subvols are nonzero) + * + * DELETED: we never delete snapshot keys, we mark them as deleted so that we + * can distinguish between a key for a missing snapshot (and we have no idea + * what happened) and a key for a deleted snapshot (delete_dead_snapshots() missed + * something, key should be deleted) + * + * NO_KEYS: we don't remove interior snapshot nodes from snapshot trees at + * runtime, since we can't do the adjustements for the depth/skiplist field + * atomically - and that breaks e.g. is_ancestor(). Instead, we mark it to be + * deleted at the next remount; this tells us that we don't need to run the full + * delete_dead_snapshots(). + * + * + * XXX - todo item: + * + * We should guard against a bitflip causing us to delete a snapshot incorrectly + * by cross checking with the subvolume btree: delete_dead_snapshots() can take + * out more data than any other codepath if it runs incorrectly + */ LE32_BITMASK(BCH_SNAPSHOT_WILL_DELETE, struct bch_snapshot, flags, 0, 1) -/* True if a subvolume points to this snapshot node: */ LE32_BITMASK(BCH_SNAPSHOT_SUBVOL, struct bch_snapshot, flags, 1, 2) LE32_BITMASK(BCH_SNAPSHOT_DELETED, struct bch_snapshot, flags, 2, 3) +LE32_BITMASK(BCH_SNAPSHOT_NO_KEYS, struct bch_snapshot, flags, 3, 4) /* * Snapshot trees: |