From ae9f01f89bb61537c0b65a095c1087d6ac3ec8a1 Mon Sep 17 00:00:00 2001 From: Adam Kwolek Date: Thu, 9 Jun 2011 13:00:55 +1000 Subject: [PATCH] imsm: FIX: wait_for_reshape_imsm() cleanup This function needs to be corrected. It should check sysfs operations status and it should not interpret 0 reshape position special meaning. Unused input parameter is removed also. Signed-off-by: Adam Kwolek Signed-off-by: NeilBrown --- super-intel.c | 54 +++++++++++++++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 21 deletions(-) diff --git a/super-intel.c b/super-intel.c index 06831c3e..4b94e9d7 100644 --- a/super-intel.c +++ b/super-intel.c @@ -8559,39 +8559,50 @@ exit_imsm_reshape_super: * reshape process reach new position * Parameters: * sra : general array info - * to_complete : new sync_max position * ndata : number of disks in new array's layout * Returns: * 0 : success, * 1 : there is no reshape in progress, * -1 : fail ******************************************************************************/ -int wait_for_reshape_imsm(struct mdinfo *sra, unsigned long long to_complete, - int ndata) +int wait_for_reshape_imsm(struct mdinfo *sra, int ndata) { int fd = sysfs_get_fd(sra, NULL, "reshape_position"); unsigned long long completed; + /* to_complete : new sync_max position */ + unsigned long long to_complete = sra->reshape_progress; + unsigned long long position_to_set = to_complete / ndata; struct timeval timeout; - if (fd < 0) + if (fd < 0) { + dprintf("imsm: wait_for_reshape_imsm() " + "cannot open reshape_position\n"); return 1; + } - sysfs_fd_get_ll(fd, &completed); + if (sysfs_fd_get_ll(fd, &completed) < 0) { + dprintf("imsm: wait_for_reshape_imsm() " + "cannot read reshape_position (no reshape in progres)\n"); + close(fd); + return 0; + } - if (to_complete == 0) {/* reshape till the end of array */ - sysfs_set_str(sra, NULL, "sync_max", "max"); - to_complete = MaxSector; - } else { - if (completed > to_complete) { - close(fd); - return -1; - } - if (sysfs_set_num(sra, NULL, "sync_max", - to_complete / ndata) != 0) { - close(fd); - return -1; - } + if (completed > to_complete) { + dprintf("imsm: wait_for_reshape_imsm() " + "wrong next position to set %llu (%llu)\n", + to_complete, completed); + close(fd); + return -1; + } + dprintf("Position set: %llu\n", position_to_set); + if (sysfs_set_num(sra, NULL, "sync_max", + position_to_set) != 0) { + dprintf("imsm: wait_for_reshape_imsm() " + "cannot set reshape position to %llu\n", + position_to_set); + close(fd); + return -1; } /* FIXME should not need a timeout at all */ @@ -8604,6 +8615,8 @@ int wait_for_reshape_imsm(struct mdinfo *sra, unsigned long long to_complete, FD_SET(fd, &rfds); select(fd+1, NULL, NULL, &rfds, &timeout); if (sysfs_fd_get_ll(fd, &completed) < 0) { + dprintf("imsm: wait_for_reshape_imsm() " + "cannot read reshape_position (in loop)\n"); close(fd); return 1; } @@ -8853,15 +8866,14 @@ static int imsm_manage_reshape( next_step = next_step + sra->reshape_progress; sysfs_set_num(sra, NULL, "suspend_lo", sra->reshape_progress); sysfs_set_num(sra, NULL, "suspend_hi", next_step); + sra->reshape_progress = next_step; /* wait until reshape finish */ - if (wait_for_reshape_imsm(sra, next_step, ndata) < 0) { + if (wait_for_reshape_imsm(sra, ndata) < 0) { dprintf("wait_for_reshape_imsm returned error!\n"); goto abort; } - sra->reshape_progress = next_step; - if (save_checkpoint_imsm(st, sra, UNIT_SRC_NORMAL) == 1) { /* ignore error == 2, this can mean end of reshape here */ -- 2.39.2