From df2647fa5bbe84960dae11531e34bafef549b8ff Mon Sep 17 00:00:00 2001 From: Pawel Baldysiak Date: Tue, 17 May 2016 13:24:41 +0200 Subject: [PATCH] IMSM: retry reading sync_completed during reshape The sync_completed after restarting a reshape (for example - after reboot) is set to "delayed" until mdmon changes the state. Mdadm does not wait for that change with old kernels. If this condition occurs - it exits and reshape is not continuing. This patch adds retry of reading sync_complete with a delay. It gives time for mdmon to change the "delayed" state. Signed-off-by: Pawel Baldysiak Signed-off-by: Jes Sorensen --- super-intel.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/super-intel.c b/super-intel.c index ba3ee48..7e2860c 100644 --- a/super-intel.c +++ b/super-intel.c @@ -10378,6 +10378,7 @@ exit_imsm_reshape_super: int wait_for_reshape_imsm(struct mdinfo *sra, int ndata) { int fd = sysfs_get_fd(sra, NULL, "sync_completed"); + int retry = 3; unsigned long long completed; /* to_complete : new sync_max position */ unsigned long long to_complete = sra->reshape_progress; @@ -10388,11 +10389,17 @@ int wait_for_reshape_imsm(struct mdinfo *sra, int ndata) return 1; } - if (sysfs_fd_get_ll(fd, &completed) < 0) { - dprintf("cannot read reshape_position (no reshape in progres)\n"); - close(fd); - return 1; - } + do { + if (sysfs_fd_get_ll(fd, &completed) < 0) { + if (!retry) { + dprintf("cannot read reshape_position (no reshape in progres)\n"); + close(fd); + return 1; + } + usleep(30000); + } else + break; + } while (retry--); if (completed > position_to_set) { dprintf("wrong next position to set %llu (%llu)\n",