13
13
#include "volumes.h"
14
14
#include "print-tree.h"
15
15
16
- static void btrfs_partially_delete_raid_extent (struct btrfs_trans_handle * trans ,
16
+ static int btrfs_partially_delete_raid_extent (struct btrfs_trans_handle * trans ,
17
17
struct btrfs_path * path ,
18
18
const struct btrfs_key * oldkey ,
19
19
u64 newlen , u64 frontpad )
20
20
{
21
- struct btrfs_stripe_extent * extent ;
21
+ struct btrfs_root * stripe_root = trans -> fs_info -> stripe_root ;
22
+ struct btrfs_stripe_extent * extent , * newitem ;
22
23
struct extent_buffer * leaf ;
23
24
int slot ;
24
25
size_t item_size ;
@@ -27,23 +28,38 @@ static void btrfs_partially_delete_raid_extent(struct btrfs_trans_handle *trans,
27
28
.type = BTRFS_RAID_STRIPE_KEY ,
28
29
.offset = newlen ,
29
30
};
31
+ int ret ;
30
32
31
33
ASSERT (oldkey -> type == BTRFS_RAID_STRIPE_KEY );
32
34
33
35
leaf = path -> nodes [0 ];
34
36
slot = path -> slots [0 ];
35
37
item_size = btrfs_item_size (leaf , slot );
38
+
39
+ newitem = kzalloc (item_size , GFP_NOFS );
40
+ if (!newitem )
41
+ return - ENOMEM ;
42
+
36
43
extent = btrfs_item_ptr (leaf , slot , struct btrfs_stripe_extent );
37
44
38
45
for (int i = 0 ; i < btrfs_num_raid_stripes (item_size ); i ++ ) {
39
46
struct btrfs_raid_stride * stride = & extent -> strides [i ];
40
47
u64 phys ;
41
48
42
- phys = btrfs_raid_stride_physical (leaf , stride );
43
- btrfs_set_raid_stride_physical ( leaf , stride , phys + frontpad );
49
+ phys = btrfs_raid_stride_physical (leaf , stride ) + frontpad ;
50
+ btrfs_set_stack_raid_stride_physical ( & newitem -> strides [ i ], phys );
44
51
}
45
52
46
- btrfs_set_item_key_safe (trans , path , & newkey );
53
+ ret = btrfs_del_item (trans , stripe_root , path );
54
+ if (ret )
55
+ goto out ;
56
+
57
+ btrfs_release_path (path );
58
+ ret = btrfs_insert_item (trans , stripe_root , & newkey , newitem , item_size );
59
+
60
+ out :
61
+ kfree (newitem );
62
+ return ret ;
47
63
}
48
64
49
65
int btrfs_delete_raid_extent (struct btrfs_trans_handle * trans , u64 start , u64 length )
0 commit comments