Thread (16 messages) 16 messages, 2 authors, 2011-10-02

Re: [PATCH 6/8] Verify reshape restart position

flat view

From: NeilBrown <hidden>
Date: 2011-10-02 23:06:28

On Tue, 27 Sep 2011 14:05:22 +0200 Adam Kwolek [off-list ref] wrote:
quoted hunk ↗ jump to hunk
Check if reshape restart position is the same as set in md.
If position doesn't match this means that we cannot restart reshape.

Signed-off-by: Adam Kwolek <redacted>
---

 Grow.c |   32 ++++++++++++++++++++++++++++++++
 1 files changed, 32 insertions(+), 0 deletions(-)
diff --git a/Grow.c b/Grow.c
index afe4c72..3ff249d 100644
--- a/Grow.c
+++ b/Grow.c
@@ -3653,6 +3653,8 @@ int Grow_continue_command(char *devname, int fd,
 	char buf[40];
 	int cfd = -1;
 	int fd2 = -1;
+	char *ep;
+	unsigned long long position;
 
 	dprintf("Grow continue from command line called for %s\n",
 		devname);
@@ -3754,6 +3756,36 @@ int Grow_continue_command(char *devname, int fd,
 		}
 	}
 
+	/* verify that array under reshape is started from
+	 * correct position
+	 */
+	ret_val = sysfs_get_str(content, NULL, "sync_max", buf, 40);
+	if (ret_val <= 0) {
+		fprintf(stderr, Name
+			": cannot open verify reshape progress for %s (%i)\n",
+			content->sys_name, ret_val);
+		ret_val = 1;
+		goto Grow_continue_command_exit;
+	}
+	dprintf(Name ": Read sync_max sysfs entry is: %s\n", buf);
+	errno = 0;
+	position = strtoull(buf, &ep, 0);
+	if (errno || ep == buf || (*ep != 0 && *ep != '\n' && *ep != ' ')) {
+		fprintf(stderr, Name ": md is not allowed to finish reshape "
+			"wihout mdadm assistance.\n");
+		ret_val = 1;
+		goto Grow_continue_command_exit;
+	}
+	position *= get_data_disks(map_name(pers, mdstat->level),
+				   content->new_layout,
+				   content->array.raid_disks);
+	if (position != content->reshape_progress) {
+		fprintf(stderr, Name ": md is not allowed to finish reshape "
+			"wihout mdadm assistance.\n");
+		ret_val = 1;
+		goto Grow_continue_command_exit;
+	}
+
 	/* continue reshape
 	 */
 	ret_val = Grow_continue(fd, st, content, backup_file,

Applied with a few small changes.

1/ is it never correct to test errno to see if an error occurred.  You must 
   test something else to see if an error occurred, and the check errno to
   see what the error was.
2/ The error message didn't seem helpful.  I changed it to:

     Fatal error: array reshape was not properly frozen.

Thanks,
NeilBrown

Attachments

Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help