}
static struct inode_walker_entry *
-lookup_inode_for_snapshot(struct bch_fs *c,
- struct inode_walker *w, u32 snapshot)
+lookup_inode_for_snapshot(struct bch_fs *c, struct inode_walker *w,
+ u32 snapshot, bool is_whiteout)
{
struct inode_walker_entry *i;
found:
BUG_ON(snapshot > i->snapshot);
- if (snapshot != i->snapshot) {
+ if (snapshot != i->snapshot && !is_whiteout) {
struct inode_walker_entry new = *i;
int ret;
}
static struct inode_walker_entry *walk_inode(struct btree_trans *trans,
- struct inode_walker *w, struct bpos pos)
+ struct inode_walker *w, struct bpos pos,
+ bool is_whiteout)
{
if (w->last_pos.inode != pos.inode) {
int ret = get_inodes_all_snapshots(trans, w, pos.inode);
w->last_pos = pos;
- return lookup_inode_for_snapshot(trans->c, w, pos.snapshot);
+ return lookup_inode_for_snapshot(trans->c, w, pos.snapshot, is_whiteout);
}
static int __get_visible_inodes(struct btree_trans *trans,
extent_ends_reset(extent_ends);
}
+ i = walk_inode(trans, inode, equiv, k.k->type == KEY_TYPE_whiteout);
+ ret = PTR_ERR_OR_ZERO(i);
+ if (ret)
+ goto err;
+
ret = check_overlapping_extents(trans, s, extent_ends, k, iter);
if (ret < 0)
goto err;
if (ret)
goto err;
- i = walk_inode(trans, inode, equiv);
- ret = PTR_ERR_OR_ZERO(i);
- if (ret)
- goto err;
-
if (fsck_err_on(!i, c,
"extent in missing inode:\n %s",
(printbuf_reset(&buf),
BUG_ON(!iter->path->should_be_locked);
- i = walk_inode(trans, dir, equiv);
+ i = walk_inode(trans, dir, equiv, k.k->type == KEY_TYPE_whiteout);
ret = PTR_ERR_OR_ZERO(i);
if (ret < 0)
goto err;
if (ret)
return ret;
- i = walk_inode(trans, inode, k.k->p);
+ i = walk_inode(trans, inode, k.k->p, k.k->type == KEY_TYPE_whiteout);
ret = PTR_ERR_OR_ZERO(i);
if (ret)
return ret;