Thread (36 messages) 36 messages, 2 authors, 2011-01-06
STALE5744d

[PATCH 09/34] FIX: get updated information from metadata

From: Adam Kwolek <hidden>
Date: 2011-01-04 14:36:49
Subsystem: the rest · Maintainer: Linus Torvalds

Metadata is not modified by metadata preparation handler.
It has to be read again from array.
There is 2 read required:
1. before 'for' entry to get updated information after reshape_super() call
2. inside 'for' loop to get updated information for every processed array
  (it can happen /i.e. imsm case/ that container operation is a set of array operations
   and information in metadata is changed after every loop).

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

 Grow.c |   19 +++++++++++++++++--
 1 files changed, 17 insertions(+), 2 deletions(-)
diff --git a/Grow.c b/Grow.c
index 9e0a51d..5d73365 100644
--- a/Grow.c
+++ b/Grow.c
@@ -2083,6 +2083,8 @@ int reshape_container(char *container, int cfd, char *devname,
 		      int quiet)
 {
 	struct mdinfo *cc;
+	struct mdinfo *cc_fresh = NULL;
+
 	if (reshape_super(st, info->component_size, info->new_level,
 			  info->new_layout, info->new_chunk,
 			  info->array.raid_disks + info->delta_disks,
@@ -2091,6 +2093,14 @@ int reshape_container(char *container, int cfd, char *devname,
 
 	sync_metadata(st);
 
+	/* ping monitor to be sure that update is on disk
+	 */
+	ping_monitor(container);
+
+	/* reload metadata to get updated information
+	 */
+	st->ss->load_container(st, cfd, NULL);
+
 	cc = st->ss->container_content(st, NULL);
 
 	if (!cc)
@@ -2106,7 +2116,6 @@ int reshape_container(char *container, int cfd, char *devname,
 	case 0: /* child */
 		break;
 	}
-
 	/* For each member array, we need to perform the reshape */
 	for (; cc; cc = cc->next) {
 		int rv;
@@ -2128,12 +2137,18 @@ int reshape_container(char *container, int cfd, char *devname,
 		if (!adev)
 			adev = cc->text_version;
 
-		rv = reshape_array(container, fd, adev, st, cc, force,
+		sysfs_free(cc_fresh);
+		st->ss->load_container(st, cfd, NULL);
+		cc_fresh = st->ss->container_content(st, subarray);
+		rv = reshape_array(container, fd, adev, st,
+				   cc_fresh, force,
 				   backup_file, quiet, 1);
 		close(fd);
 		if (rv)
 			break;
 	}
+	sysfs_free(cc_fresh);
+	sysfs_free(cc);
 	exit(0);
 }
 
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help