@@ -252,19 +252,20 @@ int bch2_hash_needs_whiteout(struct btree_trans *trans,
252
252
}
253
253
254
254
static __always_inline
255
- int bch2_hash_set_in_snapshot (struct btree_trans * trans ,
255
+ struct bkey_s_c bch2_hash_set_or_get_in_snapshot (struct btree_trans * trans ,
256
+ struct btree_iter * iter ,
256
257
const struct bch_hash_desc desc ,
257
258
const struct bch_hash_info * info ,
258
259
subvol_inum inum , u32 snapshot ,
259
260
struct bkey_i * insert ,
260
261
enum btree_iter_update_trigger_flags flags )
261
262
{
262
- struct btree_iter iter , slot = { NULL };
263
+ struct btree_iter slot = {};
263
264
struct bkey_s_c k ;
264
265
bool found = false;
265
266
int ret ;
266
267
267
- for_each_btree_key_upto_norestart (trans , iter , desc .btree_id ,
268
+ for_each_btree_key_upto_norestart (trans , * iter , desc .btree_id ,
268
269
SPOS (insert -> k .p .inode ,
269
270
desc .hash_bkey (info , bkey_i_to_s_c (insert )),
270
271
snapshot ),
@@ -279,7 +280,7 @@ int bch2_hash_set_in_snapshot(struct btree_trans *trans,
279
280
}
280
281
281
282
if (!slot .path && !(flags & STR_HASH_must_replace ))
282
- bch2_trans_copy_iter (& slot , & iter );
283
+ bch2_trans_copy_iter (& slot , iter );
283
284
284
285
if (k .k -> type != KEY_TYPE_hash_whiteout )
285
286
goto not_found ;
@@ -289,28 +290,49 @@ int bch2_hash_set_in_snapshot(struct btree_trans *trans,
289
290
ret = - BCH_ERR_ENOSPC_str_hash_create ;
290
291
out :
291
292
bch2_trans_iter_exit (trans , & slot );
292
- bch2_trans_iter_exit (trans , & iter );
293
-
294
- return ret ;
293
+ bch2_trans_iter_exit (trans , iter );
294
+ return ret ? bkey_s_c_err (ret ) : bkey_s_c_null ;
295
295
found :
296
296
found = true;
297
297
not_found :
298
-
299
- if (!found && (flags & STR_HASH_must_replace )) {
298
+ if (found && (flags & STR_HASH_must_create )) {
299
+ bch2_trans_iter_exit (trans , & slot );
300
+ return k ;
301
+ } else if (!found && (flags & STR_HASH_must_replace )) {
300
302
ret = - BCH_ERR_ENOENT_str_hash_set_must_replace ;
301
- } else if (found && (flags & STR_HASH_must_create )) {
302
- ret = - BCH_ERR_EEXIST_str_hash_set ;
303
303
} else {
304
304
if (!found && slot .path )
305
- swap (iter , slot );
305
+ swap (* iter , slot );
306
306
307
- insert -> k .p = iter . pos ;
308
- ret = bch2_trans_update (trans , & iter , insert , flags );
307
+ insert -> k .p = iter -> pos ;
308
+ ret = bch2_trans_update (trans , iter , insert , flags );
309
309
}
310
310
311
311
goto out ;
312
312
}
313
313
314
+ static __always_inline
315
+ int bch2_hash_set_in_snapshot (struct btree_trans * trans ,
316
+ const struct bch_hash_desc desc ,
317
+ const struct bch_hash_info * info ,
318
+ subvol_inum inum , u32 snapshot ,
319
+ struct bkey_i * insert ,
320
+ enum btree_iter_update_trigger_flags flags )
321
+ {
322
+ struct btree_iter iter ;
323
+ struct bkey_s_c k = bch2_hash_set_or_get_in_snapshot (trans , & iter , desc , info , inum ,
324
+ snapshot , insert , flags );
325
+ int ret = bkey_err (k );
326
+ if (ret )
327
+ return ret ;
328
+ if (k .k ) {
329
+ bch2_trans_iter_exit (trans , & iter );
330
+ return - BCH_ERR_EEXIST_str_hash_set ;
331
+ }
332
+
333
+ return 0 ;
334
+ }
335
+
314
336
static __always_inline
315
337
int bch2_hash_set (struct btree_trans * trans ,
316
338
const struct bch_hash_desc desc ,
0 commit comments