Re: [PATCH v2] btrfs: do not infinite loop in data reclaim if we aborted
From: Johannes Thumshirn <hidden>
Date: 2021-05-19 16:11:30
On 19/05/2021 17:45, Josef Bacik wrote:
quoted hunk ↗ jump to hunk
diff --git a/fs/btrfs/space-info.c b/fs/btrfs/space-info.c index 42d0fa2092d4..0d36d684d552 100644 --- a/fs/btrfs/space-info.c +++ b/fs/btrfs/space-info.c@@ -941,6 +941,8 @@ static bool maybe_fail_all_tickets(struct btrfs_fs_info *fs_info, struct reserve_ticket *ticket; u64 tickets_id = space_info->tickets_id; u64 first_ticket_bytes = 0; + bool aborted = test_bit(BTRFS_FS_STATE_TRANS_ABORTED, + &fs_info->fs_state);
can't this be const bool aborted = ...?
quoted hunk ↗ jump to hunk
@@ -1253,6 +1259,15 @@ static void btrfs_async_reclaim_data_space(struct work_struct *work)> spin_unlock(&space_info->lock); return; }
Although this pattern is only twice in btrfs_async_reclaim_data_space() const bool aborted = test_bit(BTRFS_FS_STATE_TRANS_ABORTED, &fs_info->fs_state); here as well?
+
+ /* Something happened, fail everything and bail. */
+ if (test_bit(BTRFS_FS_STATE_TRANS_ABORTED,
+ &fs_info->fs_state)) {
+ maybe_fail_all_tickets(fs_info, space_info);
+ space_info->flush = 0;
+ spin_unlock(&space_info->lock);
+ return;
+ }maybe_fail_all_tickets() space_info->flush = 0 spin_unlock() return is introduced twice in btrfs_async_reclaim_data_space, can you add a goto label to consolidate?
quoted hunk ↗ jump to hunk
last_tickets_id = space_info->tickets_id; spin_unlock(&space_info->lock); }@@ -1283,6 +1298,16 @@ static void btrfs_async_reclaim_data_space(struct work_struct *work) } else { flush_state = 0; } + + /* Something happened, fail everything and bail. */ + if (test_bit(BTRFS_FS_STATE_TRANS_ABORTED, + &fs_info->fs_state)) { + maybe_fail_all_tickets(fs_info, space_info); + space_info->flush = 0; + spin_unlock(&space_info->lock); + return; + } +