Revert "swapon: Do not overwrite Linux swap header"

This reverts commit cf04a7775a4e8ff6fd28c768be9daa3d83dd382e.This is
broken on armv7, and closer scrutiny of the reviews shows I was in error
when I thought it was ready.
This commit is contained in:
Warner Losh 2024-04-23 21:18:00 -06:00
parent 560931508c
commit feabaf8d53
4 changed files with 1 additions and 126 deletions

View File

@ -6,8 +6,6 @@ LINKS= ${BINDIR}/swapon ${BINDIR}/swapoff
LINKS+= ${BINDIR}/swapon ${BINDIR}/swapctl
MLINKS= swapon.8 swapoff.8
MLINKS+=swapon.8 swapctl.8
SRCS= swapon.c swaplinux.c
HDRS+= extern.h
LIBADD= util

View File

@ -1,5 +0,0 @@
/*-
* SPDX-License-Identifier: BSD-3-Clause
*/
int is_linux_swap(const char *);

View File

@ -1,66 +0,0 @@
/*-
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <fcntl.h>
#include <err.h>
#include <stdint.h>
#include <string.h>
#include <unistd.h>
#include "extern.h"
/*
* Definitions and structure taken from
* https://github.com/util-linux/util-linux/blob/master/include/swapheader.h
*/
#define SWAP_VERSION 1
#define SWAP_UUID_LENGTH 16
#define SWAP_LABEL_LENGTH 16
#define SWAP_SIGNATURE "SWAPSPACE2"
#define SWAP_SIGNATURE_SZ (sizeof(SWAP_SIGNATURE) - 1)
struct swap_header_v1_2 {
char bootbits[1024]; /* Space for disklabel etc. */
uint32_t version;
uint32_t last_page;
uint32_t nr_badpages;
unsigned char uuid[SWAP_UUID_LENGTH];
char volume_name[SWAP_LABEL_LENGTH];
uint32_t padding[117];
uint32_t badpages[1];
};
typedef union {
struct swap_header_v1_2 header;
struct {
uint8_t reserved[4096 - SWAP_SIGNATURE_SZ];
char signature[SWAP_SIGNATURE_SZ];
} tail;
} swhdr_t;
#define sw_version header.version
#define sw_volume_name header.volume_name
#define sw_signature tail.signature
int
is_linux_swap(const char *name)
{
uint8_t buf[4096];
swhdr_t *hdr = (swhdr_t *) buf;
int fd;
fd = open(name, O_RDONLY);
if (fd == -1)
return (-1);
if (read(fd, buf, 4096) != 4096) {
close(fd);
return (-1);
}
close(fd);
return (hdr->sw_version == SWAP_VERSION &&
!memcmp(hdr->sw_signature, SWAP_SIGNATURE, SWAP_SIGNATURE_SZ));
}

View File

@ -54,15 +54,10 @@
#include <string.h>
#include <unistd.h>
#include "extern.h"
#define _PATH_GNOP "/sbin/gnop"
static void usage(void) __dead2;
static const char *swap_on_off(const char *, int, char *);
static const char *swap_on_off_gbde(const char *, int);
static const char *swap_on_off_geli(const char *, char *, int);
static const char *swap_on_off_linux(const char *, int);
static const char *swap_on_off_md(const char *, char *, int);
static const char *swap_on_off_sfile(const char *, int);
static void swaplist(int, int, int);
@ -255,13 +250,8 @@ swap_on_off(const char *name, int doingall, char *mntops)
return (swap_on_off_geli(name, mntops, doingall));
}
free(basebuf);
/* Linux swap */
if (is_linux_swap(name))
return (swap_on_off_linux(name, doingall));
/* Swap on special file. */
free(basebuf);
return (swap_on_off_sfile(name, doingall));
}
@ -476,48 +466,6 @@ swap_on_off_geli(const char *name, char *mntops, int doingall)
return (swap_on_off_sfile(name, doingall));
}
static const char *
swap_on_off_linux(const char *name, int doingall)
{
const char *ret;
char *nopname;
size_t nopnamelen;
int error;
if (which_prog == SWAPON) {
/* Skip the header for Linux swap partitions */
error = run_cmd(NULL, "%s create -o 4096 %s", _PATH_GNOP,
name);
if (error) {
warnx("gnop (create) error: %s", name);
return (NULL);
}
}
/* Append ".nop" to name */
nopnamelen = strlen(name) + sizeof(".nop");
nopname = (char *) malloc(nopnamelen);
if (nopname == NULL)
err(1, "malloc()");
(void)strlcpy(nopname, name, nopnamelen);
(void)strlcat(nopname, ".nop", nopnamelen);
ret = swap_on_off_sfile(nopname, doingall);
if (which_prog == SWAPOFF) {
error = run_cmd(NULL, "%s destroy %s", _PATH_GNOP, nopname);
if (error) {
warnx("gnop (destroy) error: %s", name);
free(nopname);
return (NULL);
}
}
free(nopname);
return (ret);
}
static const char *
swap_on_off_md(const char *name, char *mntops, int doingall)
{