On Thursday November 2, [EMAIL PROTECTED] wrote:
> 
> Neil, can we apply the patch contributed to fix this:
> 
>   
> http://bugs.debian.org/cgi-bin/bugreport.cgi/mdadm-fix-infinite-loop.diff?bug=396582;msg=5;att=1
> 
> or do I remember that you previously replaced devlist with NULL to
> fix another bug?

Replacing the NULL with devlist will stopped stacked-device from being
auto-assembled properly.

This patch seems to fix the problem, and I am happy with it.

Thanks for the report.

NeilBrown


------------------------
Fixed problems that could cause infinitel loop with auto assemble.

If an auto-assembly attempt failes because the array cannot be 
opened or because the array has already been created, then we
get into an infinite loop.

Reported-by: Dan Pascu <[EMAIL PROTECTED]>
Fixes-debian-bug: 396582


### Diffstat output
 ./Assemble.c |   22 +++++++++++++++++++---
 1 file changed, 19 insertions(+), 3 deletions(-)

diff .prev/Assemble.c ./Assemble.c
--- .prev/Assemble.c    2006-10-13 08:46:15.000000000 +1000
+++ ./Assemble.c        2006-11-06 12:48:20.000000000 +1100
@@ -185,6 +185,8 @@ int Assemble(struct supertype *st, char 
        else if (mdfd >= 0)
                inargv = 1;
 
+ try_again:
+
        tmpdev = devlist; num_devs = 0;
        while (tmpdev) {
                if (tmpdev->used)
@@ -383,14 +385,28 @@ int Assemble(struct supertype *st, char 
                else
                        asprintf(&mddev, "/dev/md/%s", c);
                mdfd = open_mddev(mddev, ident->autof);
-               if (mdfd < 0)
-                       return mdfd;
+               if (mdfd < 0) {
+                       free(first_super);
+                       free(devices);
+                       first_super = NULL;
+                       goto try_again;
+               }
                vers = md_get_version(mdfd);
                if (ioctl(mdfd, GET_ARRAY_INFO, &inf)==0) {
+                       for (tmpdev = devlist ;
+                            tmpdev && tmpdev->used != 1;
+                            tmpdev = tmpdev->next)
+                               ;
                        fprintf(stderr, Name ": %s already active, cannot 
restart it!\n", mddev);
+                       if (tmpdev)
+                               fprintf(stderr, Name ":   %s needed for 
%s...\n",
+                                       mddev, tmpdev->devname);
                        close(mdfd);
+                       mdfd = -1;
                        free(first_super);
-                       return 1;
+                       free(devices);
+                       first_super = NULL;
+                       goto try_again;
                }
                must_close = 1;
        }


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to