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,24 +28,39 @@ 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 (newlen > 0 );
32
34
ASSERT (oldkey -> type == BTRFS_RAID_STRIPE_KEY );
33
35
34
36
leaf = path -> nodes [0 ];
35
37
slot = path -> slots [0 ];
36
38
item_size = btrfs_item_size (leaf , slot );
39
+
40
+ newitem = kzalloc (item_size , GFP_NOFS );
41
+ if (!newitem )
42
+ return - ENOMEM ;
43
+
37
44
extent = btrfs_item_ptr (leaf , slot , struct btrfs_stripe_extent );
38
45
39
46
for (int i = 0 ; i < btrfs_num_raid_stripes (item_size ); i ++ ) {
40
47
struct btrfs_raid_stride * stride = & extent -> strides [i ];
41
48
u64 phys ;
42
49
43
- phys = btrfs_raid_stride_physical (leaf , stride );
44
- btrfs_set_raid_stride_physical ( leaf , stride , phys + frontpad );
50
+ phys = btrfs_raid_stride_physical (leaf , stride ) + frontpad ;
51
+ btrfs_set_stack_raid_stride_physical ( & newitem -> strides [ i ], phys );
45
52
}
46
53
47
- btrfs_set_item_key_safe (trans , path , & newkey );
54
+ ret = btrfs_del_item (trans , stripe_root , path );
55
+ if (ret )
56
+ goto out ;
57
+
58
+ btrfs_release_path (path );
59
+ ret = btrfs_insert_item (trans , stripe_root , & newkey , newitem , item_size );
60
+
61
+ out :
62
+ kfree (newitem );
63
+ return ret ;
48
64
}
49
65
50
66
int btrfs_delete_raid_extent (struct btrfs_trans_handle * trans , u64 start , u64 length )
0 commit comments