On Wed, Apr 23, 2025 at 05:45:31PM +0200, Arnaud Lecomte wrote:
> Hey everyone, in fsck.c, we have:
> /*
> * Prefer to delete the first one, since that will be the one at the wrong
> * offset:
> * return value: 0 -> delete k1, 1 -> delete k2
> */
> int bch2_fsck_update_backpointers(struct btree_trans *trans,
> struct snapshots_seen *s,
> const struct bch_hash_desc desc,
> struct bch_hash_info *hash_info,
> struct bkey_i *new)
> {
> if (new->k.type != KEY_TYPE_dirent)
> return 0;
>
> struct bkey_i_dirent *d = bkey_i_to_dirent(new);
> struct inode_walker target = inode_walker_init();
> int ret = 0;
>
> if (d->v.d_type == DT_SUBVOL) {
> BUG();
> } else {
> ret = get_visible_inodes(trans, &target, s,
> le64_to_cpu(d->v.d_inum));
> if (ret)
> goto err;
>
> darray_for_each(target.inodes, i) {
> i->inode.bi_dir_offset = d->k.p.offset;
> ret = __bch2_fsck_write_inode(trans, &i->inode);
> if (ret)
> goto err;
> }
> }
> err:
> inode_walker_exit(&target);
> return ret;
> }
>
> What is the current state for handling subvolumes ? In someone already
> working on or it is something we don't want to implement
> for some reasons ?
This does need to be handled, I haven't started on it yet.
I did just fix another subvolume root backpointers bug, which makes this
one easier - now, only the newest snapshot version of a subvolume root
inode needs to have a backpointer.