@@ -409,26 +409,56 @@ static int bch2_subvolumes_reparent(struct btree_trans *trans, u32 subvolid_to_d
409
409
*/
410
410
static int __bch2_subvolume_delete (struct btree_trans * trans , u32 subvolid )
411
411
{
412
- struct btree_iter iter ;
413
- struct bkey_s_c_subvolume subvol ;
414
- u32 snapid ;
415
- int ret = 0 ;
412
+ struct btree_iter subvol_iter = {}, snapshot_iter = {}, snapshot_tree_iter = {};
416
413
417
- subvol = bch2_bkey_get_iter_typed (trans , & iter ,
414
+ struct bkey_s_c_subvolume subvol =
415
+ bch2_bkey_get_iter_typed (trans , & subvol_iter ,
418
416
BTREE_ID_subvolumes , POS (0 , subvolid ),
419
417
BTREE_ITER_cached |BTREE_ITER_intent ,
420
418
subvolume );
421
- ret = bkey_err (subvol );
419
+ int ret = bkey_err (subvol );
422
420
bch2_fs_inconsistent_on (bch2_err_matches (ret , ENOENT ), trans -> c ,
423
421
"missing subvolume %u" , subvolid );
424
422
if (ret )
425
- return ret ;
423
+ goto err ;
426
424
427
- snapid = le32_to_cpu (subvol .v -> snapshot );
425
+ u32 snapid = le32_to_cpu (subvol .v -> snapshot );
426
+
427
+ struct bkey_s_c_snapshot snapshot =
428
+ bch2_bkey_get_iter_typed (trans , & snapshot_iter ,
429
+ BTREE_ID_snapshots , POS (0 , snapid ),
430
+ 0 , snapshot );
431
+ ret = bkey_err (subvol );
432
+ bch2_fs_inconsistent_on (bch2_err_matches (ret , ENOENT ), trans -> c ,
433
+ "missing snapshot %u" , snapid );
434
+ if (ret )
435
+ goto err ;
436
+
437
+ u32 treeid = le32_to_cpu (snapshot .v -> tree );
428
438
429
- ret = bch2_btree_delete_at (trans , & iter , 0 ) ?:
439
+ struct bkey_s_c_snapshot_tree snapshot_tree =
440
+ bch2_bkey_get_iter_typed (trans , & snapshot_tree_iter ,
441
+ BTREE_ID_snapshot_trees , POS (0 , treeid ),
442
+ 0 , snapshot_tree );
443
+
444
+ if (le32_to_cpu (snapshot_tree .v -> master_subvol ) == subvolid ) {
445
+ struct bkey_i_snapshot_tree * snapshot_tree_mut =
446
+ bch2_bkey_make_mut_typed (trans , & snapshot_tree_iter ,
447
+ & snapshot_tree .s_c ,
448
+ 0 , snapshot_tree );
449
+ ret = PTR_ERR_OR_ZERO (snapshot_tree_mut );
450
+ if (ret )
451
+ goto err ;
452
+
453
+ snapshot_tree_mut -> v .master_subvol = 0 ;
454
+ }
455
+
456
+ ret = bch2_btree_delete_at (trans , & subvol_iter , 0 ) ?:
430
457
bch2_snapshot_node_set_deleted (trans , snapid );
431
- bch2_trans_iter_exit (trans , & iter );
458
+ err :
459
+ bch2_trans_iter_exit (trans , & snapshot_tree_iter );
460
+ bch2_trans_iter_exit (trans , & snapshot_iter );
461
+ bch2_trans_iter_exit (trans , & subvol_iter );
432
462
return ret ;
433
463
}
434
464
0 commit comments