@@ -226,7 +226,6 @@ static void __del_qgroup_rb(struct btrfs_fs_info *fs_info,
226
226
{
227
227
struct btrfs_qgroup_list * list ;
228
228
229
- btrfs_sysfs_del_one_qgroup (fs_info , qgroup );
230
229
list_del (& qgroup -> dirty );
231
230
while (!list_empty (& qgroup -> groups )) {
232
231
list = list_first_entry (& qgroup -> groups ,
@@ -243,7 +242,6 @@ static void __del_qgroup_rb(struct btrfs_fs_info *fs_info,
243
242
list_del (& list -> next_member );
244
243
kfree (list );
245
244
}
246
- kfree (qgroup );
247
245
}
248
246
249
247
/* must be called with qgroup_lock held */
@@ -569,6 +567,8 @@ void btrfs_free_qgroup_config(struct btrfs_fs_info *fs_info)
569
567
qgroup = rb_entry (n , struct btrfs_qgroup , node );
570
568
rb_erase (n , & fs_info -> qgroup_tree );
571
569
__del_qgroup_rb (fs_info , qgroup );
570
+ btrfs_sysfs_del_one_qgroup (fs_info , qgroup );
571
+ kfree (qgroup );
572
572
}
573
573
/*
574
574
* We call btrfs_free_qgroup_config() when unmounting
@@ -1578,6 +1578,14 @@ int btrfs_remove_qgroup(struct btrfs_trans_handle *trans, u64 qgroupid)
1578
1578
spin_lock (& fs_info -> qgroup_lock );
1579
1579
del_qgroup_rb (fs_info , qgroupid );
1580
1580
spin_unlock (& fs_info -> qgroup_lock );
1581
+
1582
+ /*
1583
+ * Remove the qgroup from sysfs now without holding the qgroup_lock
1584
+ * spinlock, since the sysfs_remove_group() function needs to take
1585
+ * the mutex kernfs_mutex through kernfs_remove_by_name_ns().
1586
+ */
1587
+ btrfs_sysfs_del_one_qgroup (fs_info , qgroup );
1588
+ kfree (qgroup );
1581
1589
out :
1582
1590
mutex_unlock (& fs_info -> qgroup_ioctl_lock );
1583
1591
return ret ;
0 commit comments