md-cluster: check for timeout while a new disk adding
authorDenis Plotnikov <den-plotnikov@yandex-team.ru>
Mon, 25 Sep 2023 12:59:40 +0000 (15:59 +0300)
committerSong Liu <song@kernel.org>
Thu, 12 Oct 2023 16:16:19 +0000 (09:16 -0700)
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
drivers/md/md-cluster.c

index 1e26eb22334950c45b1510795b6172b3b1a94385..8e36a0feec09896eda6bc88ac0a855ae82da0f13 100644 (file)
@@ -501,7 +501,7 @@ static void process_suspend_info(struct mddev *mddev,
        mddev->pers->quiesce(mddev, 0);
 }
 
-static void process_add_new_disk(struct mddev *mddev, struct cluster_msg *cmsg)
+static int process_add_new_disk(struct mddev *mddev, struct cluster_msg *cmsg)
 {
        char disk_uuid[64];
        struct md_cluster_info *cinfo = mddev->cluster_info;
@@ -509,6 +509,7 @@ static void process_add_new_disk(struct mddev *mddev, struct cluster_msg *cmsg)
        char raid_slot[16];
        char *envp[] = {event_name, disk_uuid, raid_slot, NULL};
        int len;
+       int res = 0;
 
        len = snprintf(disk_uuid, 64, "DEVICE_UUID=");
        sprintf(disk_uuid + len, "%pU", cmsg->uuid);
@@ -517,9 +518,14 @@ static void process_add_new_disk(struct mddev *mddev, struct cluster_msg *cmsg)
        init_completion(&cinfo->newdisk_completion);
        set_bit(MD_CLUSTER_WAITING_FOR_NEWDISK, &cinfo->state);
        kobject_uevent_env(&disk_to_dev(mddev->gendisk)->kobj, KOBJ_CHANGE, envp);
-       wait_for_completion_timeout(&cinfo->newdisk_completion,
-                       NEW_DEV_TIMEOUT);
+       if (!wait_for_completion_timeout(&cinfo->newdisk_completion,
+                                       NEW_DEV_TIMEOUT)) {
+               pr_err("md-cluster(%s:%d): timeout on a new disk adding\n",
+                       __func__, __LINE__);
+               res = -1;
+       }
        clear_bit(MD_CLUSTER_WAITING_FOR_NEWDISK, &cinfo->state);
+       return res;
 }
 
 
@@ -594,7 +600,8 @@ static int process_recvd_msg(struct mddev *mddev, struct cluster_msg *msg)
                                     le64_to_cpu(msg->high));
                break;
        case NEWDISK:
-               process_add_new_disk(mddev, msg);
+               if (process_add_new_disk(mddev, msg))
+                       ret = -1;
                break;
        case REMOVE:
                process_remove_disk(mddev, msg);