diff options
Diffstat (limited to 'usr/src/cmd/avs/dsbitmap/dsbitmap.c')
-rw-r--r-- | usr/src/cmd/avs/dsbitmap/dsbitmap.c | 436 |
1 files changed, 0 insertions, 436 deletions
diff --git a/usr/src/cmd/avs/dsbitmap/dsbitmap.c b/usr/src/cmd/avs/dsbitmap/dsbitmap.c deleted file mode 100644 index 77c5be7c1f..0000000000 --- a/usr/src/cmd/avs/dsbitmap/dsbitmap.c +++ /dev/null @@ -1,436 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -#include <sys/types.h> -#include <sys/stat.h> -#include <sys/dkio.h> -#include <sys/vtoc.h> -#include <sys/mkdev.h> -#ifdef DKIOCPARTITION -#include <sys/efi_partition.h> -#endif -#include <strings.h> -#include <stdarg.h> -#include <stdlib.h> -#include <fcntl.h> -#include <errno.h> -#include <stdio.h> -#include <locale.h> -#include <unistd.h> -#include <libgen.h> -#include <kstat.h> - -#include <sys/unistat/spcs_s.h> -#include <sys/unistat/spcs_s_u.h> -#include <sys/unistat/spcs_errors.h> - -#include <sys/nsctl/dsw.h> -#include <sys/nsctl/dsw_dev.h> -#include <sys/nsctl/rdc_io.h> -#include <sys/nsctl/rdc_bitmap.h> - -enum { UNKNOWN = 0, SNDR, II }; - -static char *program; - -void -usage(void) -{ - (void) printf(gettext("usage: %s -h\n"), program); - (void) printf(gettext(" %s { -p | -r } data_volume " - "[bitmap_volume]\n"), program); - (void) printf(gettext(" -h : This usage message\n")); - (void) printf(gettext(" -p : Calculate size of Point in Time " - "bitmap\n")); - (void) printf(gettext(" -r : Calculate size of Remote Mirror " - "bitmap\n")); -} - - -static void -message(char *prefix, spcs_s_info_t *status, caddr_t string, va_list ap) -{ - (void) fprintf(stderr, "%s: %s: ", program, prefix); - (void) vfprintf(stderr, string, ap); - (void) fprintf(stderr, "\n"); - - if (status) { - spcs_s_report(*status, stderr); - spcs_s_ufree(status); - } -} - - -static void -error(spcs_s_info_t *status, char *string, ...) -{ - va_list ap; - va_start(ap, string); - - message(gettext("error"), status, string, ap); - va_end(ap); - exit(1); -} - - -static void -warn(spcs_s_info_t *status, char *string, ...) -{ - va_list ap; - va_start(ap, string); - - message(gettext("warning"), status, string, ap); - va_end(ap); -} - -#if defined(_LP64) - /* max value of a "long int" */ -#define ULONG_MAX 18446744073709551615UL -#else /* _ILP32 */ -#define ULONG_MAX 4294967295UL /* max of "unsigned long int" */ -#endif - -static uint64_t -get_partsize(char *partition) -{ -#ifdef DKIOCPARTITION - struct dk_cinfo dki_info; - struct partition64 p64; -#endif - struct vtoc vtoc; - uint64_t size; - int fd; - int rc; - - if ((fd = open(partition, O_RDONLY)) < 0) { - error(NULL, gettext("unable to open partition, %s: %s"), - partition, strerror(errno)); - /* NOTREACHED */ - } - - rc = read_vtoc(fd, &vtoc); - if (rc >= 0) { - size = (uint64_t)(ULONG_MAX & vtoc.v_part[rc].p_size); - return (size); - } -#ifdef DKIOCPARTITION - else if (rc != VT_ENOTSUP) { -#endif - error(NULL, - gettext("unable to read the vtoc from partition, %s: %s"), - partition, strerror(errno)); - /* NOTREACHED */ -#ifdef DKIOCPARTITION - } - - /* See if there is an EFI label */ - rc = ioctl(fd, DKIOCINFO, &dki_info); - if (rc < 0) { - error(NULL, gettext("unable to get controller info " - "from partition, %s: %s"), - partition, strerror(errno)); - /* NOTREACHED */ - } - - bzero(&p64, sizeof (p64)); - p64.p_partno = (uint_t)dki_info.dki_partition; - rc = ioctl(fd, DKIOCPARTITION, &p64); - if (rc >= 0) { - size = (uint64_t)p64.p_size; - return (size); - } else { - struct stat64 stb1, stb2; - struct dk_minfo dkm; - - /* - * See if the stat64 for ZFS's zvol matches - * this file descriptor's fstat64 data. - */ - if (stat64("/devices/pseudo/zfs@0:zfs", &stb1) != 0 || - fstat64(fd, &stb2) != 0 || - !S_ISCHR(stb1.st_mode) || - !S_ISCHR(stb2.st_mode) || - major(stb1.st_rdev) != major(stb2.st_rdev)) { - error(NULL, - gettext("unable to read disk partition, %s: %s"), - partition, strerror(errno)); - /* NOTREACHED */ - } - - rc = ioctl(fd, DKIOCGMEDIAINFO, (void *)&dkm); - if (rc >= 0) { - size = LE_64(dkm.dki_capacity) * - dkm.dki_lbsize / 512; - return (size); - } else { - error(NULL, gettext("unable to read EFI label " - "from partition, %s: %s"), - partition, strerror(errno)); - /* NOTREACHED */ - } - } - return (size); - -#endif /* DKIOCPARTITION */ -} - - -int -do_sndr(char *volume, char *bitmap) -{ - uint64_t vblocks; - uint64_t bblocks; - uint64_t bsize_bits; /* size of the bits alone */ - uint64_t bsize_simple; /* size of the simple bitmap */ - uint64_t bsize_diskq; /* size of the diskq bitmap, 8 bit refcnt */ - uint64_t bsize_diskq32; /* size of the diskq bitmap, 32 bit refcnt */ - int rc = 0; - - vblocks = get_partsize(volume); - if (bitmap) { - bblocks = get_partsize(bitmap); - } - - bsize_bits = BMAP_LOG_BYTES(vblocks); - bsize_bits = (bsize_bits + 511) / 512; - - bsize_simple = RDC_BITMAP_FBA + bsize_bits; - bsize_diskq = RDC_BITMAP_FBA + bsize_bits + (BITS_IN_BYTE * bsize_bits); - bsize_diskq32 = RDC_BITMAP_FBA + bsize_bits + (BITS_IN_BYTE * - bsize_bits * sizeof (unsigned int)); - - (void) printf(gettext("Remote Mirror bitmap sizing\n\n")); - (void) printf(gettext("Data volume (%s) size: %llu blocks\n"), - volume, vblocks); - - (void) printf(gettext("Required bitmap volume size:\n")); - (void) printf(gettext(" Sync replication: %llu blocks\n"), - bsize_simple); - (void) printf(gettext(" Async replication with memory queue: " - "%llu blocks\n"), bsize_simple); - (void) printf(gettext(" Async replication with disk queue: " - "%llu blocks\n"), bsize_diskq); - (void) printf(gettext(" Async replication with disk queue and 32 bit " - "refcount: %llu blocks\n"), bsize_diskq32); - - if (bitmap) { - (void) printf("\n"); - (void) printf(gettext("Supplied bitmap volume %s " - "(%llu blocks)\n"), - bitmap, bblocks); - if (bblocks >= bsize_diskq32) { - (void) printf(gettext("is large enough for all " - "replication modes\n")); - } else if (bblocks >= bsize_diskq) { - (void) printf(gettext("is large enough for all " - "replication modes, but with restricted diskq " - "reference counts\n")); - } else if (bblocks >= bsize_simple) { - (void) printf(gettext( - "is large enough for: Sync and Async(memory) " - "replication modes only\n")); - rc = 3; - } else { - (void) printf(gettext( - "is not large enough for any replication modes\n")); - rc = 4; - } - } - - return (rc); -} - - -/* sizes in bytes */ -#define KILO (1024) -#define MEGA (KILO * KILO) -#define GIGA (MEGA * KILO) -#define TERA ((uint64_t)((uint64_t)GIGA * (uint64_t)KILO)) - -/* rounding function */ -#define roundup_2n(x, y) (((x) + ((y) - 1)) & (~y)) - -int -do_ii(char *volume, char *bitmap) -{ - const uint64_t int64_bits = sizeof (uint64_t) * BITS_IN_BYTE; - const uint64_t int32_bits = sizeof (uint32_t) * BITS_IN_BYTE; - const uint64_t terablocks = TERA / ((uint64_t)FBA_SIZE(1)); - uint64_t vblocks_phys, vblocks; - uint64_t bblocks; - uint64_t bsize_ind; /* indep and dep not compact */ - uint64_t bsize_cdep; /* compact dep */ - int rc = 0; - - vblocks_phys = get_partsize(volume); - if (bitmap) { - bblocks = get_partsize(bitmap); - } - - /* round up to multiple of DSW_SIZE blocks */ - vblocks = roundup_2n(vblocks_phys, DSW_SIZE); - bsize_ind = DSW_SHD_BM_OFFSET + (2 * DSW_BM_FBA_LEN(vblocks)); - bsize_cdep = bsize_ind; - bsize_cdep += DSW_BM_FBA_LEN(vblocks) * - ((vblocks < (uint64_t)(terablocks * DSW_SIZE)) ? - int32_bits : int64_bits); - - (void) printf(gettext("Point in Time bitmap sizing\n\n")); - (void) printf(gettext("Data volume (%s) size: %llu blocks\n"), - volume, vblocks_phys); - - (void) printf(gettext("Required bitmap volume size:\n")); - (void) printf(gettext(" Independent shadow: %llu blocks\n"), - bsize_ind); - (void) printf(gettext(" Full size dependent shadow: %llu blocks\n"), - bsize_ind); - (void) printf(gettext(" Compact dependent shadow: %llu blocks\n"), - bsize_cdep); - - if (bitmap) { - (void) printf("\n"); - (void) printf(gettext("Supplied bitmap volume %s " - "(%llu blocks)\n"), bitmap, bblocks); - - if (bblocks >= bsize_cdep) { - (void) printf(gettext("is large enough for all types " - "of shadow volume\n")); - } else if (bblocks >= bsize_ind) { - (void) printf(gettext("is large enough for: " - "Independent and full size dependent shadow " - "volumes only\n")); - rc = 6; - } else { - (void) printf(gettext("is not large enough for" - "any type of shadow volume\n")); - rc = 5; - } - } - - return (rc); -} - - -/* - * Return codes: - * 0 success (if bitmap was supplied it is large enough for all uses) - * 1 usage, programing, or access errors - * 2 unknown option supplied on command line - * 3 SNDR bitmap is not large enough for diskq usage - * 4 SNDR bitmap is not large enough for any usage - * 5 II bitmap is not large enough for any usage - * 6 II bitmap is not large enough for compact dependent usage - */ -int -main(int argc, char *argv[]) -{ - extern int optind; - char *volume, *bitmap; - int type = UNKNOWN; - int opt; - int rc = 0; - - (void) setlocale(LC_ALL, ""); - (void) textdomain("dsbitmap"); - - program = strdup(basename(argv[0])); - - while ((opt = getopt(argc, argv, "hpr")) != EOF) { - switch (opt) { - case 'p': - if (type != UNKNOWN) { - warn(NULL, gettext( - "cannot specify -p with other options")); - usage(); - return (1); - } - type = II; - break; - - case 'r': - if (type != UNKNOWN) { - warn(NULL, gettext( - "cannot specify -r with other options")); - usage(); - return (1); - } - type = SNDR; - break; - - case 'h': - if (argc != 2) { - warn(NULL, gettext( - "cannot specify -h with other options")); - rc = 1; - } - usage(); - return (rc); - /* NOTREACHED */ - - default: - usage(); - return (2); - /* NOTREACHED */ - } - } - - if (type == UNKNOWN) { - warn(NULL, gettext("one of -p and -r must be specified")); - usage(); - return (1); - } - - if ((argc - optind) != 1 && (argc - optind) != 2) { - warn(NULL, gettext("incorrect number of arguments to %s"), - (type == SNDR) ? "-r" : "-p"); - usage(); - return (1); - } - - volume = argv[optind]; - if ((argc - optind) == 2) { - bitmap = argv[optind+1]; - } else { - bitmap = NULL; - } - - switch (type) { - case SNDR: - rc = do_sndr(volume, bitmap); - break; - - case II: - rc = do_ii(volume, bitmap); - break; - - default: - /* cannot happen */ - warn(NULL, gettext("one of -p and -r must be specified")); - rc = 1; - break; - } - - return (rc); -} |