mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	bcachefs: Add an option for fsck error ratelimiting
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com> Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
		
							parent
							
								
									ef496cd268
								
							
						
					
					
						commit
						e2ee3eaab7
					
				
					 3 changed files with 21 additions and 4 deletions
				
			
		| 
						 | 
				
			
			@ -64,7 +64,7 @@ void bch2_io_error(struct bch_dev *ca)
 | 
			
		|||
enum fsck_err_ret bch2_fsck_err(struct bch_fs *c, unsigned flags,
 | 
			
		||||
				const char *fmt, ...)
 | 
			
		||||
{
 | 
			
		||||
	struct fsck_err_state *s;
 | 
			
		||||
	struct fsck_err_state *s = NULL;
 | 
			
		||||
	va_list args;
 | 
			
		||||
	bool fix = false, print = true, suppressing = false;
 | 
			
		||||
	char _buf[sizeof(s->buf)], *buf = _buf;
 | 
			
		||||
| 
						 | 
				
			
			@ -99,8 +99,13 @@ enum fsck_err_ret bch2_fsck_err(struct bch_fs *c, unsigned flags,
 | 
			
		|||
found:
 | 
			
		||||
	list_move(&s->list, &c->fsck_errors);
 | 
			
		||||
	s->nr++;
 | 
			
		||||
	suppressing	= s->nr == FSCK_ERR_RATELIMIT_NR;
 | 
			
		||||
	print		= s->nr <= FSCK_ERR_RATELIMIT_NR;
 | 
			
		||||
	if (c->opts.ratelimit_errors &&
 | 
			
		||||
	    s->nr >= FSCK_ERR_RATELIMIT_NR) {
 | 
			
		||||
		if (s->nr == FSCK_ERR_RATELIMIT_NR)
 | 
			
		||||
			suppressing = true;
 | 
			
		||||
		else
 | 
			
		||||
			print = false;
 | 
			
		||||
	}
 | 
			
		||||
	buf		= s->buf;
 | 
			
		||||
print:
 | 
			
		||||
	va_start(args, fmt);
 | 
			
		||||
| 
						 | 
				
			
			@ -156,7 +161,7 @@ void bch2_flush_fsck_errs(struct bch_fs *c)
 | 
			
		|||
	mutex_lock(&c->fsck_error_lock);
 | 
			
		||||
 | 
			
		||||
	list_for_each_entry_safe(s, n, &c->fsck_errors, list) {
 | 
			
		||||
		if (s->nr > FSCK_ERR_RATELIMIT_NR)
 | 
			
		||||
		if (s->ratelimited)
 | 
			
		||||
			bch_err(c, "Saw %llu errors like:\n    %s", s->nr, s->buf);
 | 
			
		||||
 | 
			
		||||
		list_del(&s->list);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -114,6 +114,7 @@ struct fsck_err_state {
 | 
			
		|||
	struct list_head	list;
 | 
			
		||||
	const char		*fmt;
 | 
			
		||||
	u64			nr;
 | 
			
		||||
	bool			ratelimited;
 | 
			
		||||
	char			buf[512];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -68,6 +68,12 @@ enum opt_type {
 | 
			
		|||
 *  - helptext
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifdef __KERNEL__
 | 
			
		||||
#define RATELIMIT_ERRORS true
 | 
			
		||||
#else
 | 
			
		||||
#define RATELIMIT_ERRORS false
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define BCH_OPTS()							\
 | 
			
		||||
	x(block_size,			u16,				\
 | 
			
		||||
	  OPT_FORMAT,							\
 | 
			
		||||
| 
						 | 
				
			
			@ -227,6 +233,11 @@ enum opt_type {
 | 
			
		|||
	  OPT_BOOL(),							\
 | 
			
		||||
	  NO_SB_OPT,			false,				\
 | 
			
		||||
	  NULL,		"Fix errors during fsck without asking")	\
 | 
			
		||||
	x(ratelimit_errors,		u8,				\
 | 
			
		||||
	  OPT_MOUNT,							\
 | 
			
		||||
	  OPT_BOOL(),							\
 | 
			
		||||
	  NO_SB_OPT,			RATELIMIT_ERRORS,		\
 | 
			
		||||
	  NULL,		"Ratelimit error messages during fsck")		\
 | 
			
		||||
	x(nochanges,			u8,				\
 | 
			
		||||
	  OPT_MOUNT,							\
 | 
			
		||||
	  OPT_BOOL(),							\
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue