Skip to content

Commit 1bbe254

Browse files
den-pltliu-song-6
authored andcommitted
md-cluster: check for timeout while a new disk adding
A new disk adding may end up with timeout and a new disk won't be added. Add returning the error in that case. Found by Linux Verification Center (linuxtesting.org) with SVACE Signed-off-by: Denis Plotnikov <den-plotnikov@yandex-team.ru> Signed-off-by: Song Liu <song@kernel.org> Link: https://lore.kernel.org/r/20230925125940.1542506-1-den-plotnikov@yandex-team.ru
1 parent 9164e4a commit 1bbe254

1 file changed

Lines changed: 11 additions & 4 deletions

File tree

drivers/md/md-cluster.c

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -501,14 +501,15 @@ static void process_suspend_info(struct mddev *mddev,
501501
mddev->pers->quiesce(mddev, 0);
502502
}
503503

504-
static void process_add_new_disk(struct mddev *mddev, struct cluster_msg *cmsg)
504+
static int process_add_new_disk(struct mddev *mddev, struct cluster_msg *cmsg)
505505
{
506506
char disk_uuid[64];
507507
struct md_cluster_info *cinfo = mddev->cluster_info;
508508
char event_name[] = "EVENT=ADD_DEVICE";
509509
char raid_slot[16];
510510
char *envp[] = {event_name, disk_uuid, raid_slot, NULL};
511511
int len;
512+
int res = 0;
512513

513514
len = snprintf(disk_uuid, 64, "DEVICE_UUID=");
514515
sprintf(disk_uuid + len, "%pU", cmsg->uuid);
@@ -517,9 +518,14 @@ static void process_add_new_disk(struct mddev *mddev, struct cluster_msg *cmsg)
517518
init_completion(&cinfo->newdisk_completion);
518519
set_bit(MD_CLUSTER_WAITING_FOR_NEWDISK, &cinfo->state);
519520
kobject_uevent_env(&disk_to_dev(mddev->gendisk)->kobj, KOBJ_CHANGE, envp);
520-
wait_for_completion_timeout(&cinfo->newdisk_completion,
521-
NEW_DEV_TIMEOUT);
521+
if (!wait_for_completion_timeout(&cinfo->newdisk_completion,
522+
NEW_DEV_TIMEOUT)) {
523+
pr_err("md-cluster(%s:%d): timeout on a new disk adding\n",
524+
__func__, __LINE__);
525+
res = -1;
526+
}
522527
clear_bit(MD_CLUSTER_WAITING_FOR_NEWDISK, &cinfo->state);
528+
return res;
523529
}
524530

525531

@@ -594,7 +600,8 @@ static int process_recvd_msg(struct mddev *mddev, struct cluster_msg *msg)
594600
le64_to_cpu(msg->high));
595601
break;
596602
case NEWDISK:
597-
process_add_new_disk(mddev, msg);
603+
if (process_add_new_disk(mddev, msg))
604+
ret = -1;
598605
break;
599606
case REMOVE:
600607
process_remove_disk(mddev, msg);

0 commit comments

Comments
 (0)