Commit 05450c48 authored by Kent Overstreet's avatar Kent Overstreet
Browse files

bcachefs: Kill ERO in __bch2_i_sectors_acct()

We won't be root causing this in the immediate future, and it's fairly
innocuous - so just log it in the superblock.

https://github.com/koverstreet/bcachefs/issues/869



Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent 5e63d579
Loading
Loading
Loading
Loading
+19 −4
Original line number Diff line number Diff line
@@ -144,10 +144,25 @@ int __must_check bch2_write_inode_size(struct bch_fs *c,
void __bch2_i_sectors_acct(struct bch_fs *c, struct bch_inode_info *inode,
			   struct quota_res *quota_res, s64 sectors)
{
	bch2_fs_inconsistent_on((s64) inode->v.i_blocks + sectors < 0, c,
				"inode %lu i_blocks underflow: %llu + %lli < 0 (ondisk %lli)",
	if (unlikely((s64) inode->v.i_blocks + sectors < 0)) {
		struct printbuf buf = PRINTBUF;
		bch2_log_msg_start(c, &buf);
		prt_printf(&buf, "inode %lu i_blocks underflow: %llu + %lli < 0 (ondisk %lli)",
			   inode->v.i_ino, (u64) inode->v.i_blocks, sectors,
			   inode->ei_inode.bi_sectors);

		bool repeat = false, print = false, suppress = false;
		bch2_count_fsck_err(c, vfs_inode_i_blocks_underflow, buf.buf, &repeat, &print, &suppress);
		if (print)
			bch2_print_str(c, buf.buf);
		printbuf_exit(&buf);

		if (sectors < 0)
			sectors = -inode->v.i_blocks;
		else
			sectors = 0;
	}

	inode->v.i_blocks += sectors;

#ifdef CONFIG_BCACHEFS_QUOTA
+4 −1
Original line number Diff line number Diff line
@@ -236,6 +236,7 @@ enum bch_fsck_flags {
	x(inode_has_child_snapshots_wrong,			287,	0)		\
	x(inode_unreachable,					210,	FSCK_AUTOFIX)	\
	x(inode_journal_seq_in_future,				299,	FSCK_AUTOFIX)	\
	x(vfs_inode_i_blocks_underflow,				311,	FSCK_AUTOFIX)	\
	x(deleted_inode_but_clean,				211,	FSCK_AUTOFIX)	\
	x(deleted_inode_missing,				212,	FSCK_AUTOFIX)	\
	x(deleted_inode_is_dir,					213,	FSCK_AUTOFIX)	\
@@ -317,7 +318,9 @@ enum bch_fsck_flags {
	x(directory_size_mismatch,				303,	FSCK_AUTOFIX)	\
	x(dirent_cf_name_too_big,				304,	0)		\
	x(dirent_stray_data_after_cf_name,			305,	0)		\
	x(MAX,							308,	0)
	x(rebalance_work_incorrectly_set,			309,	FSCK_AUTOFIX)	\
	x(rebalance_work_incorrectly_unset,			310,	FSCK_AUTOFIX)	\
	x(MAX,							312,	0)

enum bch_sb_error_id {
#define x(t, n, ...) BCH_FSCK_ERR_##t = n,