On Tue, 3 Mar 2009, Karel Zak wrote: > > On Thu, Jan 22, 2009 at 04:46:57PM +0000, Hugh Dickins wrote: > > Though your swapon may mkswap for suspend reasons: hmm, wouldn't it > > do very much better just to rewrite the swap signature, than exec > > mkswap - maybe nobody ever uses the badpages list, but it really > > should be respected. > > CC: Hugh Dickins <hugh@xxxxxxxxxxx> > Signed-off-by: Karel Zak <kzak@xxxxxxxxxx> > --- Thanks a lot, Karel: this is a great improvement - seeing it implemented makes me feel all the more strongly that it was needed. One small point: if the lseek or write in swap_rewrite_signature() were to fail (neither seems likely), then there's no error message to the user that it failed. Hugh > mount/swapon.c | 44 +++++++++++++++++++++++++++++++++----------- > 1 files changed, 33 insertions(+), 11 deletions(-) > > diff --git a/mount/swapon.c b/mount/swapon.c > index 1c337c2..d61ff74 100644 > --- a/mount/swapon.c > +++ b/mount/swapon.c > @@ -48,6 +48,9 @@ enum { > SIG_SWSUSPEND > }; > > +#define SWAP_SIGNATURE "SWAPSPACE2" > +#define SWAP_SIGNATURE_SZ (sizeof(SWAP_SIGNATURE) - 1) > + > int all; > int priority = -1; /* non-prioritized swap by default */ > > @@ -229,6 +232,30 @@ swap_reinitialize(const char *device) { > } > > static int > +swap_rewrite_signature(const char *devname, unsigned int pagesize) > +{ > + int fd, rc = -1; > + > + fd = open(devname, O_WRONLY); > + if (fd == -1) { > + warn(_("%s: open failed"), devname); > + return -1; > + } > + > + if (lseek(fd, pagesize - SWAP_SIGNATURE_SZ, SEEK_SET) < 0) > + goto err; > + > + if (write(fd, (void *) SWAP_SIGNATURE, > + SWAP_SIGNATURE_SZ) != SWAP_SIGNATURE_SZ) > + goto err; > + > + rc = 0; > +err: > + close(fd); > + return rc; > +} > + > +static int > swap_detect_signature(const char *buf, int *sig) > { > if (memcmp(buf, "SWAP-SPACE", 10) == 0 || > @@ -271,9 +298,9 @@ swap_get_header(int fd, int *sig, unsigned int *pagesize) > continue; > /* the smallest swap area is PAGE_SIZE*10, it means > * 40k, that's less than MAX_PAGESIZE */ > - if (datasz < (page - 10)) > + if (datasz < (page - SWAP_SIGNATURE_SZ)) > break; > - if (swap_detect_signature(buf + page - 10, sig)) { > + if (swap_detect_signature(buf + page - SWAP_SIGNATURE_SZ, sig)) { > *pagesize = page; > break; > } > @@ -318,7 +345,6 @@ swap_get_size(const char *hdr, const char *devname, unsigned int pagesize) > static int > swapon_checks(const char *special) > { > - int reinitialize = 0; > struct stat st; > int fd = -1, sig; > char *hdr = NULL; > @@ -384,7 +410,8 @@ swapon_checks(const char *special) > warn(_("%s: swap format pagesize does not match." > " Reinitializing the swap."), > special); > - reinitialize = 1; > + if (swap_reinitialize(special) < 0) > + goto err; > } > } else if (sig == SIG_SWSUSPEND) { > /* We have to reinitialize swap with old (=useless) software suspend > @@ -392,20 +419,15 @@ swapon_checks(const char *special) > * corruption the next time an attempt at unsuspending is made. > */ > warnx(_("%s: software suspend data detected. " > - "Reinitializing the swap."), > + "Rewriting the swap signature."), > special); > - reinitialize = 1; > - } > - > - if (reinitialize) { > - if (swap_reinitialize(special) < 0) > + if (swap_rewrite_signature(special, pagesize) < 0) > goto err; > } > > free(hdr); > close(fd); > return 0; > - > err: > if (fd != -1) > close(fd); > -- > 1.6.0.6 -- To unsubscribe from this list: send the line "unsubscribe util-linux-ng" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html