diff options
Diffstat (limited to 'util-linux/mkswap.c')
-rw-r--r-- | util-linux/mkswap.c | 197 |
1 files changed, 100 insertions, 97 deletions
diff --git a/util-linux/mkswap.c b/util-linux/mkswap.c index 601188f..130d241 100644 --- a/util-linux/mkswap.c +++ b/util-linux/mkswap.c @@ -1,3 +1,4 @@ +/* vi: set sw=4 ts=4: */ /* * mkswap.c - set up a linux swap device * @@ -40,20 +41,21 @@ #include <string.h> #include <fcntl.h> #include <stdlib.h> -#include <sys/ioctl.h> /* for _IO */ +#include <sys/ioctl.h> /* for _IO */ #include <sys/utsname.h> #include <sys/stat.h> -#include <asm/page.h> /* for PAGE_SIZE and PAGE_SHIFT */ +#include <asm/page.h> /* for PAGE_SIZE and PAGE_SHIFT */ /* we also get PAGE_SIZE via getpagesize() */ -static const char mkswap_usage[] = "mkswap [-c] [-v0|-v1] device [block-count]\n\n" -"Prepare a disk partition to be used as a swap partition.\n\n" -"Options:\n" -"\t-c\t\tCheck for read-ability.\n" -"\t-v0\t\tMake version 0 swap [max 128 Megs].\n" -"\t-v1\t\tMake version 1 swap [big!] (default for kernels > 2.1.117).\n" -"\tblock-count\tNumber of block to use (default is entire partition).\n"; +static const char mkswap_usage[] = + "mkswap [-c] [-v0|-v1] device [block-count]\n\n" + "Prepare a disk partition to be used as a swap partition.\n\n" + "Options:\n" "\t-c\t\tCheck for read-ability.\n" + "\t-v0\t\tMake version 0 swap [max 128 Megs].\n" + "\t-v1\t\tMake version 1 swap [big!] (default for kernels > 2.1.117).\n" + + "\tblock-count\tNumber of block to use (default is entire partition).\n"; #ifndef _IO @@ -64,8 +66,8 @@ static const char mkswap_usage[] = "mkswap [-c] [-v0|-v1] device [block-count]\n #define BLKGETSIZE _IO(0x12,96) #endif -static char * program_name = "mkswap"; -static char * device_name = NULL; +static char *program_name = "mkswap"; +static char *device_name = NULL; static int DEV = -1; static long PAGES = 0; static int check = 0; @@ -74,8 +76,8 @@ static int version = -1; #define MAKE_VERSION(p,q,r) (65536*(p) + 256*(q) + (r)) -static int -linux_version_code(void) { +static int linux_version_code(void) +{ struct utsname my_utsname; int p, q, r; @@ -83,7 +85,7 @@ linux_version_code(void) { p = atoi(strtok(my_utsname.release, ".")); q = atoi(strtok(NULL, ".")); r = atoi(strtok(NULL, ".")); - return MAKE_VERSION(p,q,r); + return MAKE_VERSION(p, q, r); } return 0; } @@ -98,7 +100,7 @@ static int pagesize; static int *signature_page; struct swap_header_v1 { - char bootbits[1024]; /* Space for disklabel etc. */ + char bootbits[1024]; /* Space for disklabel etc. */ unsigned int version; unsigned int last_page; unsigned int nr_badpages; @@ -106,8 +108,8 @@ struct swap_header_v1 { unsigned int badpages[1]; } *p; -static void -init_signature_page() { +static void init_signature_page() +{ pagesize = getpagesize(); #ifdef PAGE_SIZE @@ -115,15 +117,15 @@ init_signature_page() { fprintf(stderr, "Assuming pages of size %d\n", pagesize); #endif signature_page = (int *) malloc(pagesize); - memset(signature_page,0,pagesize); + memset(signature_page, 0, pagesize); p = (struct swap_header_v1 *) signature_page; } -static void -write_signature(char *sig) { +static void write_signature(char *sig) +{ char *sp = (char *) signature_page; - strncpy(sp+pagesize-10, sig, 10); + strncpy(sp + pagesize - 10, sig, 10); } #define V0_MAX_PAGES (8 * (pagesize - 10)) @@ -172,42 +174,46 @@ It is roughly 2GB on i386, PPC, m68k, ARM, 1GB on sparc, 512MB on mips, #define MAX_BADPAGES ((pagesize-1024-128*sizeof(int)-10)/sizeof(int)) -static void bit_set (unsigned int *addr, unsigned int nr) +static void bit_set(unsigned int *addr, unsigned int nr) { unsigned int r, m; addr += nr / (8 * sizeof(int)); + r = *addr; m = 1 << (nr & (8 * sizeof(int) - 1)); + *addr = r | m; } -static int bit_test_and_clear (unsigned int *addr, unsigned int nr) +static int bit_test_and_clear(unsigned int *addr, unsigned int nr) { unsigned int r, m; addr += nr / (8 * sizeof(int)); + r = *addr; m = 1 << (nr & (8 * sizeof(int) - 1)); + *addr = r & ~m; return (r & m) != 0; } -void -die(const char *str) { +void die(const char *str) +{ fprintf(stderr, "%s: %s\n", program_name, str); - exit( FALSE); + exit(FALSE); } -void -page_ok(int page) { - if (version==0) +void page_ok(int page) +{ + if (version == 0) bit_set(signature_page, page); } -void -page_bad(int page) { +void page_bad(int page) +{ if (version == 0) bit_test_and_clear(signature_page, page); else { @@ -218,8 +224,8 @@ page_bad(int page) { badpages++; } -void -check_blocks(void) { +void check_blocks(void) +{ unsigned int current_page; int do_seek = 1; char *buffer; @@ -233,8 +239,8 @@ check_blocks(void) { page_ok(current_page++); continue; } - if (do_seek && lseek(DEV,current_page*pagesize,SEEK_SET) != - current_page*pagesize) + if (do_seek && lseek(DEV, current_page * pagesize, SEEK_SET) != + current_page * pagesize) die("seek failed in check_blocks"); if ((do_seek = (pagesize != read(DEV, buffer, pagesize)))) { page_bad(current_page++); @@ -248,30 +254,28 @@ check_blocks(void) { printf("%d bad pages\n", badpages); } -static long valid_offset (int fd, int offset) +static long valid_offset(int fd, int offset) { char ch; - if (lseek (fd, offset, 0) < 0) + if (lseek(fd, offset, 0) < 0) return 0; - if (read (fd, &ch, 1) < 1) + if (read(fd, &ch, 1) < 1) return 0; return 1; } -static int -find_size (int fd) +static int find_size(int fd) { unsigned int high, low; low = 0; - for (high = 1; high > 0 && valid_offset (fd, high); high *= 2) + for (high = 1; high > 0 && valid_offset(fd, high); high *= 2) low = high; - while (low < high - 1) - { + while (low < high - 1) { const int mid = (low + high) / 2; - if (valid_offset (fd, mid)) + if (valid_offset(fd, mid)) low = mid; else high = mid; @@ -280,11 +284,10 @@ find_size (int fd) } /* return size in pages, to avoid integer overflow */ -static long -get_size(const char *file) +static long get_size(const char *file) { - int fd; - long size; + int fd; + long size; fd = open(file, O_RDONLY); if (fd < 0) { @@ -292,7 +295,8 @@ get_size(const char *file) exit(1); } if (ioctl(fd, BLKGETSIZE, &size) >= 0) { - int sectors_per_page = pagesize/512; + int sectors_per_page = pagesize / 512; + size /= sectors_per_page; } else { size = find_size(fd) / pagesize; @@ -301,9 +305,9 @@ get_size(const char *file) return size; } -int mkswap_main(int argc, char ** argv) +int mkswap_main(int argc, char **argv) { - char * tmp; + char *tmp; struct stat statbuf; int sz; int maxpages; @@ -314,56 +318,56 @@ int mkswap_main(int argc, char ** argv) if (argc && *argv) program_name = *argv; - init_signature_page(); /* get pagesize */ + init_signature_page(); /* get pagesize */ while (argc-- > 1) { argv++; if (argv[0][0] != '-') { if (device_name) { - int blocks_per_page = pagesize/1024; - PAGES = strtol(argv[0],&tmp,0)/blocks_per_page; + int blocks_per_page = pagesize / 1024; + + PAGES = strtol(argv[0], &tmp, 0) / blocks_per_page; if (*tmp) - usage( mkswap_usage); + usage(mkswap_usage); } else device_name = argv[0]; } else { switch (argv[0][1]) { - case 'c': - check=1; - break; - case 'f': - force=1; - break; - case 'v': - version=atoi(argv[0]+2); - break; - default: - usage( mkswap_usage); + case 'c': + check = 1; + break; + case 'f': + force = 1; + break; + case 'v': + version = atoi(argv[0] + 2); + break; + default: + usage(mkswap_usage); } } } if (!device_name) { fprintf(stderr, - "%s: error: Nowhere to set up swap on?\n", - program_name); - usage( mkswap_usage); + "%s: error: Nowhere to set up swap on?\n", program_name); + usage(mkswap_usage); } sz = get_size(device_name); if (!PAGES) { PAGES = sz; } else if (PAGES > sz && !force) { fprintf(stderr, - "%s: error: " - "size %ld is larger than device size %d\n", - program_name, - PAGES*(pagesize/1024), sz*(pagesize/1024)); - exit( FALSE); + "%s: error: " + "size %ld is larger than device size %d\n", + program_name, + PAGES * (pagesize / 1024), sz * (pagesize / 1024)); + exit(FALSE); } if (version == -1) { if (PAGES <= V0_MAX_PAGES) version = 0; - else if (linux_version_code() < MAKE_VERSION(2,1,117)) + else if (linux_version_code() < MAKE_VERSION(2, 1, 117)) version = 0; else if (pagesize < 2048) version = 0; @@ -372,21 +376,21 @@ int mkswap_main(int argc, char ** argv) } if (version != 0 && version != 1) { fprintf(stderr, "%s: error: unknown version %d\n", - program_name, version); - usage( mkswap_usage); + program_name, version); + usage(mkswap_usage); } if (PAGES < 10) { fprintf(stderr, - "%s: error: swap area needs to be at least %ldkB\n", - program_name, (long)(10 * pagesize / 1024)); - usage( mkswap_usage); + "%s: error: swap area needs to be at least %ldkB\n", + program_name, (long) (10 * pagesize / 1024)); + usage(mkswap_usage); } #if 0 maxpages = ((version == 0) ? V0_MAX_PAGES : V1_MAX_PAGES); #else if (!version) maxpages = V0_MAX_PAGES; - else if (linux_version_code() >= MAKE_VERSION(2,2,1)) + else if (linux_version_code() >= MAKE_VERSION(2, 2, 1)) maxpages = V1_MAX_PAGES; else { maxpages = V1_OLD_MAX_PAGES; @@ -397,29 +401,29 @@ int mkswap_main(int argc, char ** argv) if (PAGES > maxpages) { PAGES = maxpages; fprintf(stderr, "%s: warning: truncating swap area to %ldkB\n", - program_name, PAGES * pagesize / 1024); + program_name, PAGES * pagesize / 1024); } - DEV = open(device_name,O_RDWR); + DEV = open(device_name, O_RDWR); if (DEV < 0 || fstat(DEV, &statbuf) < 0) { perror(device_name); - exit( FALSE); + exit(FALSE); } if (!S_ISBLK(statbuf.st_mode)) - check=0; + check = 0; else if (statbuf.st_rdev == 0x0300 || statbuf.st_rdev == 0x0340) die("Will not try to make swapdevice on '%s'"); #ifdef __sparc__ if (!force && version == 0) { /* Don't overwrite partition table unless forced */ - unsigned char *buffer = (unsigned char *)signature_page; + unsigned char *buffer = (unsigned char *) signature_page; unsigned short *q, sum; if (read(DEV, buffer, 512) != 512) die("fatal: first page unreadable"); if (buffer[508] == 0xDA && buffer[509] == 0xBE) { - q = (unsigned short *)(buffer + 510); + q = (unsigned short *) (buffer + 510); for (sum = 0; q >= (unsigned short *) buffer;) sum ^= *q--; if (!sum) { @@ -427,9 +431,8 @@ int mkswap_main(int argc, char ** argv) %s: Device '%s' contains a valid Sun disklabel.\n\ This probably means creating v0 swap would destroy your partition table\n\ No swap created. If you really want to create swap v0 on that device, use\n\ -the -f option to force it.\n", - program_name, device_name); - exit( FALSE); +the -f option to force it.\n", program_name, device_name); + exit(FALSE); } } } @@ -437,11 +440,11 @@ the -f option to force it.\n", if (version == 0 || check) check_blocks(); - if (version == 0 && !bit_test_and_clear(signature_page,0)) + if (version == 0 && !bit_test_and_clear(signature_page, 0)) die("fatal: first page unreadable"); if (version == 1) { p->version = version; - p->last_page = PAGES-1; + p->last_page = PAGES - 1; p->nr_badpages = badpages; } @@ -449,14 +452,14 @@ the -f option to force it.\n", if (goodpages <= 0) die("Unable to set up swap-space: unreadable"); printf("Setting up swapspace version %d, size = %ld bytes\n", - version, (long)(goodpages*pagesize)); + version, (long) (goodpages * pagesize)); write_signature((version == 0) ? "SWAP-SPACE" : "SWAPSPACE2"); offset = ((version == 0) ? 0 : 1024); if (lseek(DEV, offset, SEEK_SET) != offset) die("unable to rewind swap-device"); - if (write(DEV,(char*)signature_page+offset, pagesize-offset) - != pagesize-offset) + if (write(DEV, (char *) signature_page + offset, pagesize - offset) + != pagesize - offset) die("unable to write signature page"); /* @@ -464,6 +467,6 @@ the -f option to force it.\n", * is not actually on disk. (This is a kernel bug.) */ if (fsync(DEV)) - die("fsync failed"); - exit ( TRUE); + die("fsync failed"); + exit(TRUE); } |