]> err.no Git - util-linux/commitdiff
swapon: add -f/--fixpgsz option
authorKarel Zak <kzak@redhat.com>
Tue, 3 Mar 2009 13:53:27 +0000 (14:53 +0100)
committerKarel Zak <kzak@redhat.com>
Tue, 3 Mar 2009 14:21:38 +0000 (15:21 +0100)
The patch:

commit 3399a218f4eff4016a22044e7c416521bc37c53c
Author: Matthias Koenig <mkoenig@suse.de>
Date:   Thu Nov 27 12:32:56 2008 +0100
swapon: add swap format detection and pagesize check

introduced a new feature. This feature should be optional (disabled by
default) to keep happy people who use swap-space bad blocks or
nonstandard swap-space size.

CC: Hugh Dickins <hugh@veritas.com>
CC: Olaf Hering <olh@suse.de>
CC: Matthias Koenig <mkoenig@suse.de>
Signed-off-by: Karel Zak <kzak@redhat.com>
mount/swapon.8
mount/swapon.c

index 6fc6571c82c99091524eedb5893f69c0765bc927..66adc8724f1897c543f943b5adb8cffe02cf90cb 100644 (file)
@@ -54,6 +54,7 @@ Enable/disable:
 .br
 .in +5
 .B swapon
+.RB [ \-f ]
 .RB [ \-p
 .IR priority ]
 .RB [ \-v ]
@@ -73,6 +74,7 @@ Enable/disable all:
 .in +5
 .B swapon \-a
 .RB [ \-e ]
+.RB [ \-f ]
 .RB [ \-v ]
 .br
 .B swapoff \-a
@@ -116,6 +118,12 @@ Devices that are already being used as swap are silently skipped.
 .B "\-e, \-\-ifexists"
 Silently skip devices that do not exist.
 .TP
+.B "\-f, \-\-fixpgsz"
+Reinitialize (exec /sbin/mkswap) the swap space when the page size mismatch between
+the current running kernel and swap space is detected. Note that in such a case
+.B mkswap(2)
+initializes the whole device and does not check for bad blocks.
+.TP
 .B \-h, \-\-help
 Provide help.
 .TP
index b795ba05bf74f3868aded8393114e736950dcd1a..a6726cdb5496d8425d677c9ec25d2b04f4f1c499 100644 (file)
@@ -56,6 +56,7 @@ int priority = -1;    /* non-prioritized swap by default */
 
 /* If true, don't complain if the device/file doesn't exist */
 int ifexists;
+int fixpgsz;
 
 int verbose;
 char *progname;
@@ -65,6 +66,7 @@ static struct option longswaponopts[] = {
        { "priority", required_argument, 0, 'p' },
        { "ifexists", 0, 0, 'e' },
        { "summary", 0, 0, 's' },
+       { "fixpgsz", 0, 0, 'f' },
                /* also for swapoff */
        { "all", 0, 0, 'a' },
        { "help", 0, 0, 'h' },
@@ -73,7 +75,7 @@ static struct option longswaponopts[] = {
        { NULL, 0, 0, 0 }
 };
 
-static struct option *longswapoffopts = &longswaponopts[3];
+static struct option *longswapoffopts = &longswaponopts[4];
 
 static int cannot_find(const char *special);
 
@@ -88,8 +90,8 @@ static int cannot_find(const char *special);
 static void
 swapon_usage(FILE *fp, int n) {
        fprintf(fp, _("\nUsage:\n"
-       " %1$s -a [-e] [-v]                  enable all swaps from /etc/fstab\n"
-       " %1$s [-p priority] [-v] <special>  enable given swap\n"
+       " %1$s -a [-e] [-v] [-f]             enable all swaps from /etc/fstab\n"
+       " %1$s [-p priority] [-v] [-f] <special>  enable given swap\n"
        " %1$s -s                            display swap usage summary\n"
        " %1$s -h                            display help\n"
        " %1$s -V                            display version\n\n"), progname);
@@ -193,6 +195,8 @@ swap_reinitialize(const char *device) {
        char *cmd[7];
        int idx=0;
 
+       warnx(_("%s: reinitializing the swap."), device);
+
        switch((pid=fork())) {
        case -1: /* fork error */
                warn(_("fork failed"));
@@ -407,11 +411,15 @@ swapon_checks(const char *special)
                                        " than actual size of swapspace"),
                                        special, swapsize);
                } else if (getpagesize() != pagesize) {
-                       warn(_("%s: swap format pagesize does not match."
-                               " Reinitializing the swap."),
-                               special);
-                       if (swap_reinitialize(special) < 0)
-                               goto err;
+                       if (fixpgsz) {
+                               warn(_("%s: swap format pagesize does not match."),
+                                       special);
+                               if (swap_reinitialize(special) < 0)
+                                       goto err;
+                       } else
+                               warn(_("%s: swap format pagesize does not match. "
+                                       "(may try --fixpgsz to reinitialize)"),
+                                       special);
                }
        } else if (sig == SIG_SWSUSPEND) {
                /* We have to reinitialize swap with old (=useless) software suspend
@@ -601,7 +609,7 @@ main_swapon(int argc, char *argv[]) {
        int status = 0;
        int c, i;
 
-       while ((c = getopt_long(argc, argv, "ahep:svVL:U:",
+       while ((c = getopt_long(argc, argv, "ahefp:svVL:U:",
                                longswaponopts, NULL)) != -1) {
                switch (c) {
                case 'a':               /* all */
@@ -622,6 +630,9 @@ main_swapon(int argc, char *argv[]) {
                case 'e':               /* ifexists */
                        ifexists = 1;
                        break;
+               case 'f':
+                       fixpgsz = 1;
+                       break;
                case 's':               /* status report */
                        status = display_summary();
                        exit(status);