diff options
author | NeilBrown <neilb@suse.de> | 2010-08-23 16:59:50 +1000 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2010-09-06 11:26:27 +1000 |
commit | 15d4a7e44748e0b71315ec2e14f0a0f959b82568 (patch) | |
tree | d0b270d43ba74f057d6be346a984f79ff81be0b5 /Incremental.c | |
parent | f5f12c84ac14bd123b9fa59ecb4f4366ab948853 (diff) |
Introduce single-exit pattern for Incremental
All exits should goto the end for clean-up.
Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'Incremental.c')
-rw-r--r-- | Incremental.c | 92 |
1 files changed, 47 insertions, 45 deletions
diff --git a/Incremental.c b/Incremental.c index 4d3d181b..4b995940 100644 --- a/Incremental.c +++ b/Incremental.c @@ -81,9 +81,9 @@ int Incremental(char *devname, int verbose, int runstop, struct mdinfo info; struct mddev_ident_s *array_list, *match; char chosen_name[1024]; - int rv; + int rv = 1; struct map_ent *mp, *map = NULL; - int dfd, mdfd; + int dfd = -1, mdfd = -1; char *avail; int active_disks; int trustworthy = FOREIGN; @@ -100,7 +100,7 @@ int Incremental(char *devname, int verbose, int runstop, fprintf(stderr, Name ": %s not permitted by mdadm.conf.\n", devname); - return 1; + goto out; } /* 2/ Find metadata, reject if none appropriate (check @@ -111,21 +111,19 @@ int Incremental(char *devname, int verbose, int runstop, if (verbose >= 0) fprintf(stderr, Name ": cannot open %s: %s.\n", devname, strerror(errno)); - return 1; + goto out; } if (fstat(dfd, &stb) < 0) { if (verbose >= 0) fprintf(stderr, Name ": fstat failed for %s: %s.\n", devname, strerror(errno)); - close(dfd); - return 1; + goto out; } if ((stb.st_mode & S_IFMT) != S_IFBLK) { if (verbose >= 0) fprintf(stderr, Name ": %s is not a block device.\n", devname); - close(dfd); - return 1; + goto out; } if (st == NULL && (st = guess_super(dfd)) == NULL) { @@ -133,17 +131,15 @@ int Incremental(char *devname, int verbose, int runstop, fprintf(stderr, Name ": no recognisable superblock on %s.\n", devname); - close(dfd); - return 1; + goto out; } if (st->ss->load_super(st, dfd, NULL)) { if (verbose >= 0) fprintf(stderr, Name ": no RAID superblock on %s.\n", devname); - close(dfd); - return 1; + goto out; } - close (dfd); + close (dfd); dfd = -1; memset(&info, 0, sizeof(info)); st->ss->getinfo_super(st, &info); @@ -207,7 +203,8 @@ int Incremental(char *devname, int verbose, int runstop, fprintf(stderr, Name ": multiple lines in mdadm.conf match\n"); } - return 2; + rv = 2; + goto out; } match = array_list; } @@ -218,7 +215,7 @@ int Incremental(char *devname, int verbose, int runstop, fprintf(stderr, Name ": array containing %s is explicitly" " ignored by mdadm.conf\n", devname); - return 1; + goto out; } /* 3a/ if not, check for homehost match. If no match, continue @@ -242,7 +239,7 @@ int Incremental(char *devname, int verbose, int runstop, ": %s has metadata type %s for which " "auto-assembly is disabled\n", devname, st->ss->name); - return 1; + goto out; } if (trustworthy == LOCAL_ANY) trustworthy = LOCAL; @@ -264,14 +261,16 @@ int Incremental(char *devname, int verbose, int runstop, else { if (verbose) fprintf(stderr, Name ": not enough devices to start the container\n"); - return 0; + rv = 0; + goto out; } /* This is a pre-built container array, so we do something * rather different. */ - return Incremental_container(st, devname, verbose, runstop, + rv = Incremental_container(st, devname, verbose, runstop, autof, trustworthy); + goto out; } name_to_use = info.name; @@ -312,15 +311,15 @@ int Incremental(char *devname, int verbose, int runstop, name_to_use, autof, trustworthy, chosen_name); if (mdfd < 0) - return 1; + goto out; sysfs_init(&info, mdfd, 0); if (set_array_info(mdfd, st, &info) != 0) { fprintf(stderr, Name ": failed to set array info for %s: %s\n", chosen_name, strerror(errno)); - close(mdfd); - return 2; + rv = 2; + goto out; } dinfo = info; @@ -330,8 +329,8 @@ int Incremental(char *devname, int verbose, int runstop, fprintf(stderr, Name ": failed to add %s to %s: %s.\n", devname, chosen_name, strerror(errno)); ioctl(mdfd, STOP_ARRAY, 0); - close(mdfd); - return 2; + rv = 2; + goto out; } sra = sysfs_read(mdfd, fd2devnum(mdfd), GET_DEVS); if (!sra || !sra->devs || sra->devs->disk.raid_disk >= 0) { @@ -343,9 +342,9 @@ int Incremental(char *devname, int verbose, int runstop, fprintf(stderr, Name ": You have an old buggy kernel which cannot support\n" " --incremental reliably. Aborting.\n"); - close(mdfd); sysfs_free(sra); - return 2; + rv = 2; + goto out; } info.array.working_disks = 1; sysfs_free(sra); @@ -392,14 +391,15 @@ int Incremental(char *devname, int verbose, int runstop, fprintf(stderr, Name ": not adding %s to active array (without --run) %s\n", devname, chosen_name); - close(mdfd); - return 2; + rv = 2; + goto out; } } sra = sysfs_read(mdfd, fd2devnum(mdfd), (GET_DEVS | GET_STATE)); - if (!sra) - return 2; - + if (!sra) { + rv = 2; + goto out; + } if (sra->devs) { sprintf(dn, "%d:%d", sra->devs->disk.major, sra->devs->disk.minor); @@ -411,9 +411,9 @@ int Incremental(char *devname, int verbose, int runstop, ": metadata mismatch between %s and " "chosen array %s\n", devname, chosen_name); - close(mdfd); close(dfd2); - return 2; + rv = 2; + goto out; } close(dfd2); memset(&info2, 0, sizeof(info2)); @@ -425,8 +425,8 @@ int Incremental(char *devname, int verbose, int runstop, fprintf(stderr, Name ": unexpected difference between %s and %s.\n", chosen_name, devname); - close(mdfd); - return 2; + rv = 2; + goto out; } } info2.disk.major = major(stb.st_rdev); @@ -446,8 +446,8 @@ int Incremental(char *devname, int verbose, int runstop, if (err < 0) { fprintf(stderr, Name ": failed to add %s to %s: %s.\n", devname, chosen_name, strerror(errno)); - close(mdfd); - return 2; + rv = 2; + goto out; } info.array.working_disks = 0; for (d = sra->devs; d; d=d->next) @@ -487,8 +487,8 @@ int Incremental(char *devname, int verbose, int runstop, ": %s attached to %s, not enough to start (%d).\n", devname, chosen_name, active_disks); map_unlock(&map); - close(mdfd); - return 0; + rv = 0; + goto out; } free(avail); @@ -503,9 +503,9 @@ int Incremental(char *devname, int verbose, int runstop, fprintf(stderr, Name ": %s attached to %s which is already active.\n", devname, chosen_name); - close(mdfd); map_unlock(&map); - return 0; + rv = 0; + goto out; } map_unlock(&map); @@ -518,16 +518,14 @@ int Incremental(char *devname, int verbose, int runstop, fprintf(stderr, Name ": Could not open bitmap file %s.\n", match->bitmap_file); - close(mdfd); - return 1; + goto out; } if (ioctl(mdfd, SET_BITMAP_FILE, bmfd) != 0) { close(bmfd); fprintf(stderr, Name ": Failed to set bitmapfile for %s.\n", chosen_name); - close(mdfd); - return 1; + goto out; } close(bmfd); } @@ -558,7 +556,11 @@ int Incremental(char *devname, int verbose, int runstop, devname, chosen_name); rv = 0; } - close(mdfd); +out: + if (dfd >= 0) + close(dfd); + if (mdfd >= 0) + close(mdfd); return rv; } |