@@ -434,13 +434,6 @@ int bch2_check_btree_backpointers(struct bch_fs *c)
434434 return ret ;
435435}
436436
437- static inline bool bkey_and_val_eq (struct bkey_s_c l , struct bkey_s_c r )
438- {
439- return bpos_eq (l .k -> p , r .k -> p ) &&
440- bkey_bytes (l .k ) == bkey_bytes (r .k ) &&
441- !memcmp (l .v , r .v , bkey_val_bytes (l .k ));
442- }
443-
444437struct extents_to_bp_state {
445438 struct bpos bucket_start ;
446439 struct bpos bucket_end ;
@@ -536,11 +529,8 @@ static int check_bp_exists(struct btree_trans *trans,
536529 struct btree_iter other_extent_iter = {};
537530 struct printbuf buf = PRINTBUF ;
538531 struct bkey_s_c bp_k ;
539- struct bkey_buf tmp ;
540532 int ret = 0 ;
541533
542- bch2_bkey_buf_init (& tmp );
543-
544534 struct bch_dev * ca = bch2_dev_bucket_tryget (c , bucket );
545535 if (!ca ) {
546536 prt_str (& buf , "extent for nonexistent device:bucket " );
@@ -565,22 +555,9 @@ static int check_bp_exists(struct btree_trans *trans,
565555
566556 if (bp_k .k -> type != KEY_TYPE_backpointer ||
567557 memcmp (bkey_s_c_to_backpointer (bp_k ).v , & bp , sizeof (bp ))) {
568- bch2_bkey_buf_reassemble (& tmp , c , orig_k );
569-
570- if (!bkey_and_val_eq (orig_k , bkey_i_to_s_c (s -> last_flushed .k ))) {
571- if (bp .level ) {
572- bch2_trans_unlock (trans );
573- bch2_btree_interior_updates_flush (c );
574- }
575-
576- ret = bch2_btree_write_buffer_flush_sync (trans );
577- if (ret )
578- goto err ;
579-
580- bch2_bkey_buf_copy (& s -> last_flushed , c , tmp .k );
581- ret = - BCH_ERR_transaction_restart_write_buffer_flush ;
582- goto out ;
583- }
558+ ret = bch2_btree_write_buffer_maybe_flush (trans , orig_k , & s -> last_flushed );
559+ if (ret )
560+ goto err ;
584561
585562 goto check_existing_bp ;
586563 }
@@ -589,7 +566,6 @@ static int check_bp_exists(struct btree_trans *trans,
589566fsck_err :
590567 bch2_trans_iter_exit (trans , & other_extent_iter );
591568 bch2_trans_iter_exit (trans , & bp_iter );
592- bch2_bkey_buf_exit (& tmp , c );
593569 bch2_dev_put (ca );
594570 printbuf_exit (& buf );
595571 return ret ;
@@ -905,7 +881,7 @@ static int check_one_backpointer(struct btree_trans *trans,
905881 struct bbpos start ,
906882 struct bbpos end ,
907883 struct bkey_s_c_backpointer bp ,
908- struct bpos * last_flushed_pos )
884+ struct bkey_buf * last_flushed )
909885{
910886 struct bch_fs * c = trans -> c ;
911887 struct btree_iter iter ;
@@ -925,20 +901,18 @@ static int check_one_backpointer(struct btree_trans *trans,
925901 if (ret )
926902 return ret ;
927903
928- if (!k .k && !bpos_eq (* last_flushed_pos , bp .k -> p )) {
929- * last_flushed_pos = bp .k -> p ;
930- ret = bch2_btree_write_buffer_flush_sync (trans ) ?:
931- - BCH_ERR_transaction_restart_write_buffer_flush ;
932- goto out ;
933- }
904+ if (!k .k ) {
905+ ret = bch2_btree_write_buffer_maybe_flush (trans , bp .s_c , last_flushed );
906+ if (ret )
907+ goto out ;
934908
935- if (fsck_err_on (! k . k , c ,
936- backpointer_to_missing_ptr ,
937- "backpointer for missing %s\n %s " ,
938- bp . v -> level ? "btree node" : "extent" ,
939- ( bch2_bkey_val_to_text ( & buf , c , bp .s_c ), buf . buf ))) {
940- ret = bch2_btree_delete_at_buffered ( trans , BTREE_ID_backpointers , bp . k -> p ) ;
941- goto out ;
909+ if (fsck_err ( c , backpointer_to_missing_ptr ,
910+ "backpointer for missing %s\n %s" ,
911+ bp . v -> level ? "btree node" : "extent " ,
912+ ( bch2_bkey_val_to_text ( & buf , c , bp . s_c ), buf . buf ))) {
913+ ret = bch2_btree_delete_at_buffered ( trans , BTREE_ID_backpointers , bp .k -> p );
914+ goto out ;
915+ }
942916 }
943917out :
944918fsck_err :
@@ -951,14 +925,20 @@ static int bch2_check_backpointers_to_extents_pass(struct btree_trans *trans,
951925 struct bbpos start ,
952926 struct bbpos end )
953927{
954- struct bpos last_flushed_pos = SPOS_MAX ;
928+ struct bkey_buf last_flushed ;
955929
956- return for_each_btree_key_commit (trans , iter , BTREE_ID_backpointers ,
930+ bch2_bkey_buf_init (& last_flushed );
931+ bkey_init (& last_flushed .k -> k );
932+
933+ int ret = for_each_btree_key_commit (trans , iter , BTREE_ID_backpointers ,
957934 POS_MIN , BTREE_ITER_prefetch , k ,
958935 NULL , NULL , BCH_TRANS_COMMIT_no_enospc ,
959936 check_one_backpointer (trans , start , end ,
960937 bkey_s_c_to_backpointer (k ),
961- & last_flushed_pos ));
938+ & last_flushed ));
939+
940+ bch2_bkey_buf_exit (& last_flushed , trans -> c );
941+ return ret ;
962942}
963943
964944int bch2_check_backpointers_to_extents (struct bch_fs * c )
0 commit comments