diff options
Diffstat (limited to 'fs/bcachefs/recovery_passes.c')
| -rw-r--r-- | fs/bcachefs/recovery_passes.c | 18 | 
1 files changed, 18 insertions, 0 deletions
| diff --git a/fs/bcachefs/recovery_passes.c b/fs/bcachefs/recovery_passes.c index bab586dc395a..fb22cce10f66 100644 --- a/fs/bcachefs/recovery_passes.c +++ b/fs/bcachefs/recovery_passes.c @@ -16,6 +16,7 @@  #include "snapshot.h"  #include "subvolume.h"  #include "super.h" +#include "super-io.h"  const char * const bch2_recovery_passes[] = {  #define x(_fn, ...)	#_fn, @@ -112,6 +113,23 @@ int bch2_run_explicit_recovery_pass(struct bch_fs *c,  	}  } +int bch2_run_explicit_recovery_pass_persistent(struct bch_fs *c, +					       enum bch_recovery_pass pass) +{ +	__le64 s = cpu_to_le64(bch2_recovery_passes_to_stable(BIT_ULL(pass))); + +	mutex_lock(&c->sb_lock); +	struct bch_sb_field_ext *ext = bch2_sb_field_get(c->disk_sb.sb, ext); + +	if (!(ext->recovery_passes_required[0] & s)) { +		ext->recovery_passes_required[0] |= s; +		bch2_write_super(c); +	} +	mutex_unlock(&c->sb_lock); + +	return bch2_run_explicit_recovery_pass(c, pass); +} +  u64 bch2_fsck_recovery_passes(void)  {  	u64 ret = 0; |