bcachefs: Fix a quota read bug
authorKent Overstreet <kent.overstreet@linux.dev>
Sun, 28 May 2023 00:00:13 +0000 (20:00 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:10:02 +0000 (17:10 -0400)
bch2_fs_quota_read() could see an inode that's been deleted
(KEY_TYPE_inode_generation) - bch2_fs_quota_read_inode() needs to check
for that instead of erroring.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/quota.c

index 310eb9d26571477af0d99ac2ac9b14dc17f61ce8..56ba82cae19d5f0ef76678be8067a61aa246fa1d 100644 (file)
@@ -576,6 +576,13 @@ static int bch2_fs_quota_read_inode(struct btree_trans *trans,
                                        le32_to_cpu(s_t.master_subvol),
                                        k.k->p.offset,
                                }, &u);
+       /*
+        * Inode might be deleted in this snapshot - the easiest way to handle
+        * that is to just skip it here:
+        */
+       if (bch2_err_matches(ret, ENOENT))
+               goto advance;
+
        if (ret)
                return ret;
 
@@ -615,7 +622,7 @@ int bch2_fs_quota_read(struct bch_fs *c)
                        POS_MIN, BTREE_ITER_PREFETCH|BTREE_ITER_ALL_SNAPSHOTS, k,
                bch2_fs_quota_read_inode(&trans, &iter, k));
        if (ret)
-               bch_err(c, "err in quota_read: %s", bch2_err_str(ret));
+               bch_err(c, "%s: err %s", __func__, bch2_err_str(ret));
 
        bch2_trans_exit(&trans);
        return ret;