diff options
Diffstat (limited to 'util-linux')
-rw-r--r-- | util-linux/Config.in | 7 | ||||
-rw-r--r-- | util-linux/swaponoff.c | 37 |
2 files changed, 38 insertions, 6 deletions
diff --git a/util-linux/Config.in b/util-linux/Config.in index c30091a7a..3b7630e6b 100644 --- a/util-linux/Config.in +++ b/util-linux/Config.in @@ -743,6 +743,13 @@ config SWAPONOFF space. If you are not using any swap space, you can leave this option disabled. +config FEATURE_SWAPON_PRI + bool "Support option -p in swapon" + default n + depends on SWAPONOFF + help + Enable support for setting swap device priority in swapon. + config SWITCH_ROOT bool "switch_root" default n diff --git a/util-linux/swaponoff.c b/util-linux/swaponoff.c index beefac030..6eafa3e21 100644 --- a/util-linux/swaponoff.c +++ b/util-linux/swaponoff.c @@ -11,6 +11,16 @@ #include <mntent.h> #include <sys/swap.h> +#if ENABLE_FEATURE_SWAPON_PRI +struct globals { + int flags; +}; +#define G (*(struct globals*)&bb_common_bufsiz1) +#define g_flags (G.flags) +#else +#define g_flags 0 +#endif + static int swap_enable_disable(char *device) { int status; @@ -26,7 +36,7 @@ static int swap_enable_disable(char *device) #endif if (applet_name[5] == 'n') - status = swapon(device, 0); + status = swapon(device, g_flags); else status = swapoff(device); @@ -63,15 +73,30 @@ int swap_on_off_main(int argc ATTRIBUTE_UNUSED, char **argv) { int ret; - if (!argv[1]) - bb_show_usage(); - +#if !ENABLE_FEATURE_SWAPON_PRI ret = getopt32(argv, "a"); - if (ret) +#else + opt_complementary = "p+"; + ret = getopt32(argv, (applet_name[5] == 'n') ? "ap:" : "a", &g_flags); + + if (ret & 2) { // -p + g_flags = SWAP_FLAG_PREFER | + ((g_flags & SWAP_FLAG_PRIO_MASK) << SWAP_FLAG_PRIO_SHIFT); + ret &= 1; + } +#endif + + if (ret /* & 1: not needed */) // -a return do_em_all(); + argv += optind; + if (!*argv) + bb_show_usage(); + /* ret = 0; redundant */ - while (*++argv) + do { ret += swap_enable_disable(*argv); + } while (*++argv); + return ret; } |