Skip to content

Commit ffd2cb6

Browse files
committed
Merge tag 'block-6.8-2024-02-22' of git://git.kernel.dk/linux
Pull block fixes from Jens Axboe: "Mostly just fixlets for md, but also a sed-opal parsing fix" * tag 'block-6.8-2024-02-22' of git://git.kernel.dk/linux: block: sed-opal: handle empty atoms when parsing response md: Don't suspend the array for interrupted reshape md: Don't register sync_thread for reshape directly md: Make sure md_do_sync() will set MD_RECOVERY_DONE md: Don't ignore read-only array in md_check_recovery() md: Don't ignore suspended array in md_check_recovery() md: Fix missing release of 'active_io' for flush
2 parents 4c36fbb + 5429c8d commit ffd2cb6

File tree

5 files changed

+54
-68
lines changed

5 files changed

+54
-68
lines changed

block/opal_proto.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ enum opal_response_token {
7171
#define SHORT_ATOM_BYTE 0xBF
7272
#define MEDIUM_ATOM_BYTE 0xDF
7373
#define LONG_ATOM_BYTE 0xE3
74+
#define EMPTY_ATOM_BYTE 0xFF
7475

7576
#define OPAL_INVAL_PARAM 12
7677
#define OPAL_MANUFACTURED_INACTIVE 0x08

block/sed-opal.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1056,16 +1056,20 @@ static int response_parse(const u8 *buf, size_t length,
10561056
token_length = response_parse_medium(iter, pos);
10571057
else if (pos[0] <= LONG_ATOM_BYTE) /* long atom */
10581058
token_length = response_parse_long(iter, pos);
1059+
else if (pos[0] == EMPTY_ATOM_BYTE) /* empty atom */
1060+
token_length = 1;
10591061
else /* TOKEN */
10601062
token_length = response_parse_token(iter, pos);
10611063

10621064
if (token_length < 0)
10631065
return token_length;
10641066

1067+
if (pos[0] != EMPTY_ATOM_BYTE)
1068+
num_entries++;
1069+
10651070
pos += token_length;
10661071
total -= token_length;
10671072
iter++;
1068-
num_entries++;
10691073
}
10701074

10711075
resp->num = num_entries;

drivers/md/md.c

Lines changed: 44 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -579,8 +579,12 @@ static void submit_flushes(struct work_struct *ws)
579579
rcu_read_lock();
580580
}
581581
rcu_read_unlock();
582-
if (atomic_dec_and_test(&mddev->flush_pending))
582+
if (atomic_dec_and_test(&mddev->flush_pending)) {
583+
/* The pair is percpu_ref_get() from md_flush_request() */
584+
percpu_ref_put(&mddev->active_io);
585+
583586
queue_work(md_wq, &mddev->flush_work);
587+
}
584588
}
585589

586590
static void md_submit_flush_data(struct work_struct *ws)
@@ -8788,12 +8792,16 @@ void md_do_sync(struct md_thread *thread)
87888792
int ret;
87898793

87908794
/* just incase thread restarts... */
8791-
if (test_bit(MD_RECOVERY_DONE, &mddev->recovery) ||
8792-
test_bit(MD_RECOVERY_WAIT, &mddev->recovery))
8795+
if (test_bit(MD_RECOVERY_DONE, &mddev->recovery))
87938796
return;
8794-
if (!md_is_rdwr(mddev)) {/* never try to sync a read-only array */
8797+
8798+
if (test_bit(MD_RECOVERY_INTR, &mddev->recovery))
8799+
goto skip;
8800+
8801+
if (test_bit(MD_RECOVERY_WAIT, &mddev->recovery) ||
8802+
!md_is_rdwr(mddev)) {/* never try to sync a read-only array */
87958803
set_bit(MD_RECOVERY_INTR, &mddev->recovery);
8796-
return;
8804+
goto skip;
87978805
}
87988806

87998807
if (mddev_is_clustered(mddev)) {
@@ -9368,13 +9376,19 @@ static void md_start_sync(struct work_struct *ws)
93689376
struct mddev *mddev = container_of(ws, struct mddev, sync_work);
93699377
int spares = 0;
93709378
bool suspend = false;
9379+
char *name;
93719380

9372-
if (md_spares_need_change(mddev))
9381+
/*
9382+
* If reshape is still in progress, spares won't be added or removed
9383+
* from conf until reshape is done.
9384+
*/
9385+
if (mddev->reshape_position == MaxSector &&
9386+
md_spares_need_change(mddev)) {
93739387
suspend = true;
9388+
mddev_suspend(mddev, false);
9389+
}
93749390

9375-
suspend ? mddev_suspend_and_lock_nointr(mddev) :
9376-
mddev_lock_nointr(mddev);
9377-
9391+
mddev_lock_nointr(mddev);
93789392
if (!md_is_rdwr(mddev)) {
93799393
/*
93809394
* On a read-only array we can:
@@ -9400,8 +9414,10 @@ static void md_start_sync(struct work_struct *ws)
94009414
if (spares)
94019415
md_bitmap_write_all(mddev->bitmap);
94029416

9417+
name = test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) ?
9418+
"reshape" : "resync";
94039419
rcu_assign_pointer(mddev->sync_thread,
9404-
md_register_thread(md_do_sync, mddev, "resync"));
9420+
md_register_thread(md_do_sync, mddev, name));
94059421
if (!mddev->sync_thread) {
94069422
pr_warn("%s: could not start resync thread...\n",
94079423
mdname(mddev));
@@ -9445,6 +9461,20 @@ static void md_start_sync(struct work_struct *ws)
94459461
sysfs_notify_dirent_safe(mddev->sysfs_action);
94469462
}
94479463

9464+
static void unregister_sync_thread(struct mddev *mddev)
9465+
{
9466+
if (!test_bit(MD_RECOVERY_DONE, &mddev->recovery)) {
9467+
/* resync/recovery still happening */
9468+
clear_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
9469+
return;
9470+
}
9471+
9472+
if (WARN_ON_ONCE(!mddev->sync_thread))
9473+
return;
9474+
9475+
md_reap_sync_thread(mddev);
9476+
}
9477+
94489478
/*
94499479
* This routine is regularly called by all per-raid-array threads to
94509480
* deal with generic issues like resync and super-block update.
@@ -9469,9 +9499,6 @@ static void md_start_sync(struct work_struct *ws)
94699499
*/
94709500
void md_check_recovery(struct mddev *mddev)
94719501
{
9472-
if (READ_ONCE(mddev->suspended))
9473-
return;
9474-
94759502
if (mddev->bitmap)
94769503
md_bitmap_daemon_work(mddev);
94779504

@@ -9485,7 +9512,8 @@ void md_check_recovery(struct mddev *mddev)
94859512
}
94869513

94879514
if (!md_is_rdwr(mddev) &&
9488-
!test_bit(MD_RECOVERY_NEEDED, &mddev->recovery))
9515+
!test_bit(MD_RECOVERY_NEEDED, &mddev->recovery) &&
9516+
!test_bit(MD_RECOVERY_DONE, &mddev->recovery))
94899517
return;
94909518
if ( ! (
94919519
(mddev->sb_flags & ~ (1<<MD_SB_CHANGE_PENDING)) ||
@@ -9507,8 +9535,7 @@ void md_check_recovery(struct mddev *mddev)
95079535
struct md_rdev *rdev;
95089536

95099537
if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) {
9510-
/* sync_work already queued. */
9511-
clear_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
9538+
unregister_sync_thread(mddev);
95129539
goto unlock;
95139540
}
95149541

@@ -9571,16 +9598,7 @@ void md_check_recovery(struct mddev *mddev)
95719598
* still set.
95729599
*/
95739600
if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) {
9574-
if (!test_bit(MD_RECOVERY_DONE, &mddev->recovery)) {
9575-
/* resync/recovery still happening */
9576-
clear_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
9577-
goto unlock;
9578-
}
9579-
9580-
if (WARN_ON_ONCE(!mddev->sync_thread))
9581-
goto unlock;
9582-
9583-
md_reap_sync_thread(mddev);
9601+
unregister_sync_thread(mddev);
95849602
goto unlock;
95859603
}
95869604

drivers/md/raid10.c

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4175,11 +4175,7 @@ static int raid10_run(struct mddev *mddev)
41754175
clear_bit(MD_RECOVERY_SYNC, &mddev->recovery);
41764176
clear_bit(MD_RECOVERY_CHECK, &mddev->recovery);
41774177
set_bit(MD_RECOVERY_RESHAPE, &mddev->recovery);
4178-
set_bit(MD_RECOVERY_RUNNING, &mddev->recovery);
4179-
rcu_assign_pointer(mddev->sync_thread,
4180-
md_register_thread(md_do_sync, mddev, "reshape"));
4181-
if (!mddev->sync_thread)
4182-
goto out_free_conf;
4178+
set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
41834179
}
41844180

41854181
return 0;
@@ -4573,16 +4569,8 @@ static int raid10_start_reshape(struct mddev *mddev)
45734569
clear_bit(MD_RECOVERY_CHECK, &mddev->recovery);
45744570
clear_bit(MD_RECOVERY_DONE, &mddev->recovery);
45754571
set_bit(MD_RECOVERY_RESHAPE, &mddev->recovery);
4576-
set_bit(MD_RECOVERY_RUNNING, &mddev->recovery);
4577-
4578-
rcu_assign_pointer(mddev->sync_thread,
4579-
md_register_thread(md_do_sync, mddev, "reshape"));
4580-
if (!mddev->sync_thread) {
4581-
ret = -EAGAIN;
4582-
goto abort;
4583-
}
4572+
set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
45844573
conf->reshape_checkpoint = jiffies;
4585-
md_wakeup_thread(mddev->sync_thread);
45864574
md_new_event();
45874575
return 0;
45884576

drivers/md/raid5.c

Lines changed: 2 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -7936,11 +7936,7 @@ static int raid5_run(struct mddev *mddev)
79367936
clear_bit(MD_RECOVERY_SYNC, &mddev->recovery);
79377937
clear_bit(MD_RECOVERY_CHECK, &mddev->recovery);
79387938
set_bit(MD_RECOVERY_RESHAPE, &mddev->recovery);
7939-
set_bit(MD_RECOVERY_RUNNING, &mddev->recovery);
7940-
rcu_assign_pointer(mddev->sync_thread,
7941-
md_register_thread(md_do_sync, mddev, "reshape"));
7942-
if (!mddev->sync_thread)
7943-
goto abort;
7939+
set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
79447940
}
79457941

79467942
/* Ok, everything is just fine now */
@@ -8506,29 +8502,8 @@ static int raid5_start_reshape(struct mddev *mddev)
85068502
clear_bit(MD_RECOVERY_CHECK, &mddev->recovery);
85078503
clear_bit(MD_RECOVERY_DONE, &mddev->recovery);
85088504
set_bit(MD_RECOVERY_RESHAPE, &mddev->recovery);
8509-
set_bit(MD_RECOVERY_RUNNING, &mddev->recovery);
8510-
rcu_assign_pointer(mddev->sync_thread,
8511-
md_register_thread(md_do_sync, mddev, "reshape"));
8512-
if (!mddev->sync_thread) {
8513-
mddev->recovery = 0;
8514-
spin_lock_irq(&conf->device_lock);
8515-
write_seqcount_begin(&conf->gen_lock);
8516-
mddev->raid_disks = conf->raid_disks = conf->previous_raid_disks;
8517-
mddev->new_chunk_sectors =
8518-
conf->chunk_sectors = conf->prev_chunk_sectors;
8519-
mddev->new_layout = conf->algorithm = conf->prev_algo;
8520-
rdev_for_each(rdev, mddev)
8521-
rdev->new_data_offset = rdev->data_offset;
8522-
smp_wmb();
8523-
conf->generation --;
8524-
conf->reshape_progress = MaxSector;
8525-
mddev->reshape_position = MaxSector;
8526-
write_seqcount_end(&conf->gen_lock);
8527-
spin_unlock_irq(&conf->device_lock);
8528-
return -EAGAIN;
8529-
}
8505+
set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
85308506
conf->reshape_checkpoint = jiffies;
8531-
md_wakeup_thread(mddev->sync_thread);
85328507
md_new_event();
85338508
return 0;
85348509
}

0 commit comments

Comments
 (0)