2
2
3
3
#include "bcachefs.h"
4
4
#include "alloc_background.h"
5
+ #include "bkey_buf.h"
5
6
#include "btree_iter.h"
6
7
#include "btree_update.h"
7
8
#include "btree_write_buffer.h"
@@ -118,7 +119,7 @@ int bch2_lru_check_set(struct btree_trans *trans,
118
119
static int bch2_check_lru_key (struct btree_trans * trans ,
119
120
struct btree_iter * lru_iter ,
120
121
struct bkey_s_c lru_k ,
121
- struct bpos * last_flushed_pos )
122
+ struct bkey_buf * last_flushed )
122
123
{
123
124
struct bch_fs * c = trans -> c ;
124
125
struct btree_iter iter ;
@@ -136,7 +137,7 @@ static int bch2_check_lru_key(struct btree_trans *trans,
136
137
trans , lru_entry_to_invalid_bucket ,
137
138
"lru key points to nonexistent device:bucket %llu:%llu" ,
138
139
alloc_pos .inode , alloc_pos .offset ))
139
- return bch2_btree_delete_at (trans , lru_iter , 0 );
140
+ return bch2_btree_bit_mod_buffered (trans , BTREE_ID_lru , lru_iter -> pos , false );
140
141
141
142
k = bch2_bkey_get_iter (trans , & iter , BTREE_ID_alloc , alloc_pos , 0 );
142
143
ret = bkey_err (k );
@@ -156,12 +157,9 @@ static int bch2_check_lru_key(struct btree_trans *trans,
156
157
157
158
if (lru_k .k -> type != KEY_TYPE_set ||
158
159
lru_pos_time (lru_k .k -> p ) != idx ) {
159
- if (!bpos_eq (* last_flushed_pos , lru_k .k -> p )) {
160
- * last_flushed_pos = lru_k .k -> p ;
161
- ret = bch2_btree_write_buffer_flush_sync (trans ) ?:
162
- - BCH_ERR_transaction_restart_write_buffer_flush ;
163
- goto out ;
164
- }
160
+ ret = bch2_btree_write_buffer_maybe_flush (trans , lru_k , last_flushed );
161
+ if (ret )
162
+ goto err ;
165
163
166
164
if (fsck_err (trans , lru_entry_bad ,
167
165
"incorrect lru entry: lru %s time %llu\n"
@@ -171,9 +169,8 @@ static int bch2_check_lru_key(struct btree_trans *trans,
171
169
lru_pos_time (lru_k .k -> p ),
172
170
(bch2_bkey_val_to_text (& buf1 , c , lru_k ), buf1 .buf ),
173
171
(bch2_bkey_val_to_text (& buf2 , c , k ), buf2 .buf )))
174
- ret = bch2_btree_delete_at (trans , lru_iter , 0 );
172
+ ret = bch2_btree_bit_mod_buffered (trans , BTREE_ID_lru , lru_iter -> pos , false );
175
173
}
176
- out :
177
174
err :
178
175
fsck_err :
179
176
bch2_trans_iter_exit (trans , & iter );
@@ -184,12 +181,18 @@ static int bch2_check_lru_key(struct btree_trans *trans,
184
181
185
182
int bch2_check_lrus (struct bch_fs * c )
186
183
{
187
- struct bpos last_flushed_pos = POS_MIN ;
184
+ struct bkey_buf last_flushed ;
185
+
186
+ bch2_bkey_buf_init (& last_flushed );
187
+ bkey_init (& last_flushed .k -> k );
188
+
188
189
int ret = bch2_trans_run (c ,
189
190
for_each_btree_key_commit (trans , iter ,
190
191
BTREE_ID_lru , POS_MIN , BTREE_ITER_prefetch , k ,
191
192
NULL , NULL , BCH_TRANS_COMMIT_no_enospc |BCH_TRANS_COMMIT_lazy_rw ,
192
- bch2_check_lru_key (trans , & iter , k , & last_flushed_pos )));
193
+ bch2_check_lru_key (trans , & iter , k , & last_flushed )));
194
+
195
+ bch2_bkey_buf_exit (& last_flushed , c );
193
196
bch_err_fn (c , ret );
194
197
return ret ;
195
198
0 commit comments