Powered by Linux
Re: [bug report] bcachefs: missing error checks for bio_alloc_bioset() — Semantic Matching Tool

Re: [bug report] bcachefs: missing error checks for bio_alloc_bioset()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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




[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux