X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=Kill.c;h=f5c582180ac28d7a8593657f42b02d481aa352be;hb=0d5a423fe7481de5ce20c6174841afeb1aadd255;hp=9441f73bb43f88ce4733ac7671e7c2cfc9dd94ab;hpb=d7eaf49f65ecb99e24255026331b0af7a9245cc2;p=thirdparty%2Fmdadm.git diff --git a/Kill.c b/Kill.c index 9441f73b..f5c58218 100644 --- a/Kill.c +++ b/Kill.c @@ -1,7 +1,7 @@ /* * mdadm - manage Linux "md" devices aka RAID arrays. * - * Copyright (C) 2001-2002 Neil Brown + * Copyright (C) 2001-2009 Neil Brown * * * This program is free software; you can redistribute it and/or modify @@ -19,12 +19,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Author: Neil Brown - * Email: - * Paper: Neil Brown - * School of Computer Science and Engineering - * The University of New South Wales - * Sydney, 2052 - * Australia + * Email: * * Added by Dale Stephenson * steph@snapserver.com @@ -34,48 +29,48 @@ #include "md_u.h" #include "md_p.h" -int Kill(char *dev, int force) +int Kill(char *dev, int force, int quiet, int noexcl) { /* * Nothing fancy about Kill. It just zeroes out a superblock * Definitely not safe. */ - mdp_super_t super; int fd, rv = 0; - - fd = open(dev, O_RDWR|O_EXCL); + struct supertype *st; + + if (force) + noexcl = 1; + fd = open(dev, O_RDWR|(force ? 0 : O_EXCL)); if (fd < 0) { - fprintf(stderr, Name ": Couldn't open %s for write - not zeroing\n", - dev); + if (!quiet) + fprintf(stderr, Name ": Couldn't open %s for write - not zeroing\n", + dev); + close(fd); return 1; - } - rv = load_super(fd, &super); - if (force && rv >= 5) - rv = 0; /* ignore bad data in superblock */ - switch(rv) { - case 1: - fprintf(stderr, Name ": cannot file device size for %s: %s\n", - dev, strerror(errno)); - break; - case 2: - fprintf(stderr, Name ": %s is too small for md.\n", dev); - break; - case 3: - case 4: - fprintf(stderr, Name ": cannot access superblock on %s.\n", dev); - break; - case 5: - case 6: - fprintf(stderr, Name ": %s does not appear to have an MD superblock.\n", dev); - break; } - if (!rv) { - memset(&super, 0, sizeof(super)); - if (store_super(fd, &super)) { - fprintf(stderr, Name ": Could not zero superblock on %s\n", - dev); + st = guess_super(fd); + if (st == NULL) { + if (!quiet) + fprintf(stderr, Name ": Unrecognised md component device - %s\n", dev); + close(fd); + return 1; + } + rv = st->ss->load_super(st, fd, dev); + if (force && rv >= 2) + rv = 0; /* ignore bad data in superblock */ + if (rv== 0 || (force && rv >= 2)) { + st->ss->free_super(st); + st->ss->init_super(st, NULL, 0, "", NULL, NULL); + if (st->ss->store_super(st, fd)) { + if (!quiet) + fprintf(stderr, Name ": Could not zero superblock on %s\n", + dev); rv = 1; + } else if (rv) { + if (!quiet) + fprintf(stderr, Name ": superblock zeroed anyway\n"); + rv = 0; } } close(fd);