On Tue, Feb 20, 2024 at 04:26:38PM -0500, Kent Overstreet wrote:
> On Tue, Feb 20, 2024 at 02:39:35PM +0300, Dan Carpenter wrote:
> > So right now I only have two bcache warnings. The missing error code
> > warning isn't published unfortunately... I don't think I'm going to
> > have a lot of time to dedicate to this stuff in the up coming months
> > honestly.
>
> Why not just put this stuff up in a dashboard? Make it easy for people
> to see the full results for their code, without nagging them with a
> separate email for every warning?
>
Honestly, it would require quite a bit of work to do that and someone
would need to step up to fund Linaro for a project like that. If
someone else feels like doing that, I'm happy to help them but right now
I have a bunch of other things on my plate.
> > fs/bcachefs/journal.c:575 __journal_res_get() error: uninitialized symbol
> > 'can_discard'.
>
> your error message seems wrong to me. If it was an uninitialized
> _symbol_, i.e. that symbol didn't exist, then the code wouldn't build.
> Instead you seem to be warning about a possibly uninitialized variable.
>
> Yet a cursory inspection reveals the variable is initialized in every
> path before it's used, and gcc gets it right.
>
Hm. You're right. I'll look into this.
> > fs/bcachefs/alloc_background.c:1751 bch2_discard_one_bucket() warn: missing
> > error code here? 'discard_in_flight_add()' failed. 'ret' = '0'
>
> No idea what smatch is complaining about here, we're returning either
> -EEXIST the error code of darray_push().
I don't understand. I don't see an -EEXIST or a darray_push()... :/
fs/bcachefs/alloc_background.c
1670 static int bch2_discard_one_bucket(struct btree_trans *trans,
1671 struct btree_iter *need_discard_iter,
1672 struct bpos *discard_pos_done,
1673 struct discard_buckets_state *s)
1674 {
1675 struct bch_fs *c = trans->c;
1676 struct bpos pos = need_discard_iter->pos;
1677 struct btree_iter iter = { NULL };
1678 struct bkey_s_c k;
1679 struct bch_dev *ca;
1680 struct bkey_i_alloc_v4 *a;
1681 struct printbuf buf = PRINTBUF;
1682 bool discard_locked = false;
1683 int ret = 0;
1684
1685 ca = bch_dev_bkey_exists(c, pos.inode);
1686
1687 if (!percpu_ref_tryget(&ca->io_ref)) {
1688 bch2_btree_iter_set_pos(need_discard_iter,
POS(pos.inode + 1, 0));
1689 return 0;
1690 }
1691
1692 discard_buckets_next_dev(c, s, ca);
1693
1694 if (bch2_bucket_is_open_safe(c, pos.inode, pos.offset)) {
1695 s->open++;
1696 goto out;
1697 }
1698
1699 if
(bch2_bucket_needs_journal_commit(&c->buckets_waiting_for_journal,
1700 c->journal.flushed_seq_ondisk,
1701 pos.inode, pos.offset)) {
1702 s->need_journal_commit++;
1703 s->need_journal_commit_this_dev++;
1704 goto out;
1705 }
1706
1707 k = bch2_bkey_get_iter(trans, &iter, BTREE_ID_alloc,
1708 need_discard_iter->pos,
1709 BTREE_ITER_CACHED);
1710 ret = bkey_err(k);
1711 if (ret)
1712 goto out;
1713
1714 a = bch2_alloc_to_v4_mut(trans, k);
1715 ret = PTR_ERR_OR_ZERO(a);
1716 if (ret)
1717 goto out;
ret is zero
1718
1719 if (BCH_ALLOC_V4_NEED_INC_GEN(&a->v)) {
1720 a->v.gen++;
1721 SET_BCH_ALLOC_V4_NEED_INC_GEN(&a->v, false);
1722 goto write;
1723 }
1724
1725 if (a->v.journal_seq > c->journal.flushed_seq_ondisk) {
1726 if (c->curr_recovery_pass >
BCH_RECOVERY_PASS_check_alloc_info) {
1727 bch2_trans_inconsistent(trans,
1728 "clearing need_discard but journal_seq
%llu > flushed_seq %llu\n"
1729 "%s",
1730 a->v.journal_seq,
1731 c->journal.flushed_seq_ondisk,
1732 (bch2_bkey_val_to_text(&buf, c, k),
buf.buf));
1733 ret = -EIO;
1734 }
1735 goto out;
1736 }
1737
1738 if (a->v.data_type != BCH_DATA_need_discard) {
1739 if (c->curr_recovery_pass >
BCH_RECOVERY_PASS_check_alloc_info) {
1740 bch2_trans_inconsistent(trans,
1741 "bucket incorrectly set in need_discard
btree\n"
1742 "%s",
1743 (bch2_bkey_val_to_text(&buf, c, k),
buf.buf));
1744 ret = -EIO;
1745 }
1746
1747 goto out;
1748 }
1749
1750 if (discard_in_flight_add(c, SPOS(iter.pos.inode,
iter.pos.offset, true)))
1751 goto out;
We this goto out.
1752
1753 discard_locked = true;
1754
1755 if (!bkey_eq(*discard_pos_done, iter.pos) &&
1756 ca->mi.discard && !c->opts.nochanges) {
1757 /*
1758 * This works without any other locks because this is
the only
1759 * thread that removes items from the need_discard tree
1760 */
1761 bch2_trans_unlock_long(trans);
1762 blkdev_issue_discard(ca->disk_sb.bdev,
1763 k.k->p.offset * ca->mi.bucket_size,
1764 ca->mi.bucket_size,
1765 GFP_KERNEL);
1766 *discard_pos_done = iter.pos;
1767
1768 ret = bch2_trans_relock_notrace(trans);
1769 if (ret)
1770 goto out;
1771 }
1772
1773 SET_BCH_ALLOC_V4_NEED_DISCARD(&a->v, false);
1774 a->v.data_type = alloc_data_type(a->v, a->v.data_type);
1775 write:
1776 ret = bch2_trans_update(trans, &iter, &a->k_i, 0) ?:
1777 bch2_trans_commit(trans, NULL, NULL,
1778 BCH_WATERMARK_btree|
1779 BCH_TRANS_COMMIT_no_enospc);
1780 if (ret)
1781 goto out;
1782
1783 count_event(c, bucket_discard);
1784 s->discarded++;
1785 out:
1786 if (discard_locked)
1787 discard_in_flight_remove(c, iter.pos);
1788 s->seen++;
1789 bch2_trans_iter_exit(trans, &iter);
1790 percpu_ref_put(&ca->io_ref);
1791 printbuf_exit(&buf);
1792 return ret;
It returns ret.
1793 }
regards,
dan carpenter