Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

bcachefs: simplify check_dirent_inode_dirent()

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>

+58 -60
+58 -60
fs/bcachefs/fsck.c
··· 1570 1570 u32 target_snapshot) 1571 1571 { 1572 1572 struct bch_fs *c = trans->c; 1573 - struct btree_iter bp_iter = { NULL }; 1574 1573 struct printbuf buf = PRINTBUF; 1575 1574 int ret = 0; 1575 + 1576 + if (inode_points_to_dirent(target, d)) 1577 + return 0; 1576 1578 1577 1579 if (!target->bi_dir && 1578 1580 !target->bi_dir_offset) { 1579 1581 target->bi_dir = d.k->p.inode; 1580 1582 target->bi_dir_offset = d.k->p.offset; 1583 + return __bch2_fsck_write_inode(trans, target, target_snapshot); 1584 + } 1581 1585 1586 + struct btree_iter bp_iter = { NULL }; 1587 + struct bkey_s_c_dirent bp_dirent = dirent_get_by_pos(trans, &bp_iter, 1588 + SPOS(target->bi_dir, target->bi_dir_offset, target_snapshot)); 1589 + ret = bkey_err(bp_dirent); 1590 + if (ret && !bch2_err_matches(ret, ENOENT)) 1591 + goto err; 1592 + 1593 + bool backpointer_exists = !ret; 1594 + ret = 0; 1595 + 1596 + if (fsck_err_on(!backpointer_exists, 1597 + c, inode_wrong_backpointer, 1598 + "inode %llu:%u has wrong backpointer:\n" 1599 + "got %llu:%llu\n" 1600 + "should be %llu:%llu", 1601 + target->bi_inum, target_snapshot, 1602 + target->bi_dir, 1603 + target->bi_dir_offset, 1604 + d.k->p.inode, 1605 + d.k->p.offset)) { 1606 + target->bi_dir = d.k->p.inode; 1607 + target->bi_dir_offset = d.k->p.offset; 1608 + ret = __bch2_fsck_write_inode(trans, target, target_snapshot); 1609 + goto out; 1610 + } 1611 + 1612 + bch2_bkey_val_to_text(&buf, c, d.s_c); 1613 + prt_newline(&buf); 1614 + if (backpointer_exists) 1615 + bch2_bkey_val_to_text(&buf, c, bp_dirent.s_c); 1616 + 1617 + if (fsck_err_on(backpointer_exists && 1618 + (S_ISDIR(target->bi_mode) || 1619 + target->bi_subvol), 1620 + c, inode_dir_multiple_links, 1621 + "%s %llu:%u with multiple links\n%s", 1622 + S_ISDIR(target->bi_mode) ? "directory" : "subvolume", 1623 + target->bi_inum, target_snapshot, buf.buf)) { 1624 + ret = __remove_dirent(trans, d.k->p); 1625 + goto out; 1626 + } 1627 + 1628 + /* 1629 + * hardlinked file with nlink 0: 1630 + * We're just adjusting nlink here so check_nlinks() will pick 1631 + * it up, it ignores inodes with nlink 0 1632 + */ 1633 + if (fsck_err_on(backpointer_exists && !target->bi_nlink, 1634 + c, inode_multiple_links_but_nlink_0, 1635 + "inode %llu:%u type %s has multiple links but i_nlink 0\n%s", 1636 + target->bi_inum, target_snapshot, bch2_d_types[d.v->d_type], buf.buf)) { 1637 + target->bi_nlink++; 1638 + target->bi_flags &= ~BCH_INODE_unlinked; 1582 1639 ret = __bch2_fsck_write_inode(trans, target, target_snapshot); 1583 1640 if (ret) 1584 1641 goto err; 1585 - } 1586 - 1587 - if (!inode_points_to_dirent(target, d)) { 1588 - struct bkey_s_c_dirent bp_dirent = dirent_get_by_pos(trans, &bp_iter, 1589 - SPOS(target->bi_dir, target->bi_dir_offset, target_snapshot)); 1590 - ret = bkey_err(bp_dirent); 1591 - if (ret && !bch2_err_matches(ret, ENOENT)) 1592 - goto err; 1593 - 1594 - bool backpointer_exists = !ret; 1595 - ret = 0; 1596 - 1597 - bch2_bkey_val_to_text(&buf, c, d.s_c); 1598 - prt_newline(&buf); 1599 - if (backpointer_exists) 1600 - bch2_bkey_val_to_text(&buf, c, bp_dirent.s_c); 1601 - 1602 - if (fsck_err_on(S_ISDIR(target->bi_mode) && backpointer_exists, 1603 - c, inode_dir_multiple_links, 1604 - "directory %llu:%u with multiple links\n%s", 1605 - target->bi_inum, target_snapshot, buf.buf)) { 1606 - ret = __remove_dirent(trans, d.k->p); 1607 - goto out; 1608 - } 1609 - 1610 - /* 1611 - * hardlinked file with nlink 0: 1612 - * We're just adjusting nlink here so check_nlinks() will pick 1613 - * it up, it ignores inodes with nlink 0 1614 - */ 1615 - if (fsck_err_on(backpointer_exists && !target->bi_nlink, 1616 - c, inode_multiple_links_but_nlink_0, 1617 - "inode %llu:%u type %s has multiple links but i_nlink 0\n%s", 1618 - target->bi_inum, target_snapshot, bch2_d_types[d.v->d_type], buf.buf)) { 1619 - target->bi_nlink++; 1620 - target->bi_flags &= ~BCH_INODE_unlinked; 1621 - 1622 - ret = __bch2_fsck_write_inode(trans, target, target_snapshot); 1623 - if (ret) 1624 - goto err; 1625 - } 1626 - 1627 - if (fsck_err_on(!backpointer_exists, 1628 - c, inode_wrong_backpointer, 1629 - "inode %llu:%u has wrong backpointer:\n" 1630 - "got %llu:%llu\n" 1631 - "should be %llu:%llu", 1632 - target->bi_inum, target_snapshot, 1633 - target->bi_dir, 1634 - target->bi_dir_offset, 1635 - d.k->p.inode, 1636 - d.k->p.offset)) { 1637 - target->bi_dir = d.k->p.inode; 1638 - target->bi_dir_offset = d.k->p.offset; 1639 - 1640 - ret = __bch2_fsck_write_inode(trans, target, target_snapshot); 1641 - if (ret) 1642 - goto err; 1643 - } 1644 1642 } 1645 1643 out: 1646 1644 err: