|
|
@@ -2796,9 +2796,6 @@ out:
|
|
|
btrfs_free_path(path);
|
|
|
|
|
|
mutex_lock(&fs_info->qgroup_rescan_lock);
|
|
|
- if (!btrfs_fs_closing(fs_info))
|
|
|
- fs_info->qgroup_flags &= ~BTRFS_QGROUP_STATUS_FLAG_RESCAN;
|
|
|
-
|
|
|
if (err > 0 &&
|
|
|
fs_info->qgroup_flags & BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT) {
|
|
|
fs_info->qgroup_flags &= ~BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT;
|
|
|
@@ -2814,16 +2811,30 @@ out:
|
|
|
trans = btrfs_start_transaction(fs_info->quota_root, 1);
|
|
|
if (IS_ERR(trans)) {
|
|
|
err = PTR_ERR(trans);
|
|
|
+ trans = NULL;
|
|
|
btrfs_err(fs_info,
|
|
|
"fail to start transaction for status update: %d",
|
|
|
err);
|
|
|
- goto done;
|
|
|
}
|
|
|
- ret = update_qgroup_status_item(trans);
|
|
|
- if (ret < 0) {
|
|
|
- err = ret;
|
|
|
- btrfs_err(fs_info, "fail to update qgroup status: %d", err);
|
|
|
+
|
|
|
+ mutex_lock(&fs_info->qgroup_rescan_lock);
|
|
|
+ if (!btrfs_fs_closing(fs_info))
|
|
|
+ fs_info->qgroup_flags &= ~BTRFS_QGROUP_STATUS_FLAG_RESCAN;
|
|
|
+ if (trans) {
|
|
|
+ ret = update_qgroup_status_item(trans);
|
|
|
+ if (ret < 0) {
|
|
|
+ err = ret;
|
|
|
+ btrfs_err(fs_info, "fail to update qgroup status: %d",
|
|
|
+ err);
|
|
|
+ }
|
|
|
}
|
|
|
+ fs_info->qgroup_rescan_running = false;
|
|
|
+ complete_all(&fs_info->qgroup_rescan_completion);
|
|
|
+ mutex_unlock(&fs_info->qgroup_rescan_lock);
|
|
|
+
|
|
|
+ if (!trans)
|
|
|
+ return;
|
|
|
+
|
|
|
btrfs_end_transaction(trans);
|
|
|
|
|
|
if (btrfs_fs_closing(fs_info)) {
|
|
|
@@ -2834,12 +2845,6 @@ out:
|
|
|
} else {
|
|
|
btrfs_err(fs_info, "qgroup scan failed with %d", err);
|
|
|
}
|
|
|
-
|
|
|
-done:
|
|
|
- mutex_lock(&fs_info->qgroup_rescan_lock);
|
|
|
- fs_info->qgroup_rescan_running = false;
|
|
|
- mutex_unlock(&fs_info->qgroup_rescan_lock);
|
|
|
- complete_all(&fs_info->qgroup_rescan_completion);
|
|
|
}
|
|
|
|
|
|
/*
|