usr/src/cmd/format/modify_partition.c
author sjelinek
Thu, 27 Oct 2005 09:01:18 -0700
changeset 767 0aa24dfb5d87
parent 0 68f95e015346
child 5421 872db5a31484
permissions -rw-r--r--
PSARC 2004/776 device checking for fs utilities PSARC 2005/461 Device in use checking environment variables 5084421 libdiskmgt needs to detect in use ZFS data 5085739 remove workaround for bug 4725434 6194015 Device in use checking for Solaris utilities-PSARC/2004/776 6261853 libdiskmgt does not work correctly in all cases on amd64 6268374 libdiskmgt allocates incorrect size for readdir_r() dirent argument 6291309 PSARC/2005/461 - libdiskmgt should enable bypassing of inuse checking 6301815 PSARC/2005/461-Need Sun private libdiskmgt flag for use during install to disable sysevent starting
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     5
 * Common Development and Distribution License, Version 1.0 only
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     6
 * (the "License").  You may not use this file except in compliance
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 * with the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    23
 * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
#pragma ident	"%Z%%M%	%I%	%E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
 * This file contains functions to implement the partition menu commands.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
#include "global.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
#include "partition.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
#include "menu_partition.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
#include "menu_command.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
#include "modify_partition.h"
767
0aa24dfb5d87 PSARC 2004/776 device checking for fs utilities
sjelinek
parents: 0
diff changeset
    37
#include "checkdev.h"
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
#include "misc.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
#include "label.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
#include "auto_sense.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
#include <stdlib.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
#include <string.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
#ifdef __STDC__
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
/* Function prototypes for ANSI C Compilers */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
static void	adj_cyl_offset(struct dk_map32 *map);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
static int	check_map(struct dk_map32 *map);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
static void	get_user_map(struct dk_map32 *map, int float_part);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
static void	get_user_map_efi(struct dk_gpt *map, int float_part);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
#else	/* __STDC__ */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
/* Function prototypes for non-ANSI C Compilers */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
static void	adj_cyl_offset();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
static int	check_map();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
static void	get_user_map();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
static void	get_user_map_efi();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
#endif	/* __STDC__ */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
static char *partn_list[] = { "0", "1", "2", "3", "4", "5", "6", "7", NULL };
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
static char *sel_list[] = { "0", "1", "2", "3", NULL };
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
#define	MBYTE	(1024*1024)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
 * Modify/Create a predefined partition table.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
p_modify()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
	struct	partition_info	tmp_pinfo[1];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
	struct	dk_map32	*map = tmp_pinfo->pinfo_map;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
	u_ioparam_t		ioparam;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
	int			inpt_dflt = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
	int			free_hog = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
	int			i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
	char			tmpstr[80];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
	char			tmpstr2[300];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
	int			sel_type = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
	 * There must be a current disk type (and therefore a current disk).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
	if (cur_dtype == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
		err_print("Current Disk Type is not set.\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
	 * check if there exists a partition table for the disk.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
	if (cur_parts == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
		err_print("Current Disk has no partition table.\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
	 * If the disk has mounted partitions, cannot modify
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
	if (checkmount((daddr_t)-1, (daddr_t)-1)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
		err_print(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
"Cannot modify disk partitions while it has mounted partitions.\n\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
	 * If the disk has partitions currently being used for
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
	 * swapping, cannot modify
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
	if (checkswap((daddr_t)-1, (daddr_t)-1)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
		err_print(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
"Cannot modify disk partitions while it is \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
currently being used for swapping.\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
	 * prompt user for a partition table base
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
	if (cur_parts->pinfo_name != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
		(void) snprintf(tmpstr, sizeof (tmpstr),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
			"\t0. Current partition table (%s)",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
			cur_parts->pinfo_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
		(void) sprintf(tmpstr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
			"\t0. Current partition table (unnamed)");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
	(void) snprintf(tmpstr2, sizeof (tmpstr2),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
"Select partitioning base:\n%s\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
"\t1. All Free Hog\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
"Choose base (enter number) ",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
		tmpstr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
	ioparam.io_charlist = sel_list;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
	sel_type = input(FIO_MSTR, tmpstr2, '?', &ioparam,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
		&sel_type, DATA_INPUT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
	switch (cur_label) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
	case L_TYPE_SOLARIS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
	    if (sel_type == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
		 * Check for invalid parameters but do
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
		 * not modify the table.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
		if (check_map(cur_parts->pinfo_map)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
			err_print("\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
Warning: Fix, or select a different partition table.\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
		 * Create partition map from existing map
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
		tmp_pinfo->vtoc = cur_parts->vtoc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
		for (i = 0; i < NDKMAP; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
			map[i].dkl_nblk = cur_parts->pinfo_map[i].dkl_nblk;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
			map[i].dkl_cylno = cur_parts->pinfo_map[i].dkl_cylno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
	    } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
		 * Make an empty partition map, with all the space
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
		 * in the c partition.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
		set_vtoc_defaults(tmp_pinfo);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
		for (i = 0; i < NDKMAP; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
			map[i].dkl_nblk = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
			map[i].dkl_cylno = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
		map[C_PARTITION].dkl_nblk = ncyl * spc();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
#if defined(i386)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
		 * Adjust for the boot and possibly alternates partitions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
		map[I_PARTITION].dkl_nblk = spc();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
		map[I_PARTITION].dkl_cylno = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
		if (cur_ctype->ctype_ctype != DKC_SCSI_CCS) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
			map[J_PARTITION].dkl_nblk = 2 * spc();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
			map[J_PARTITION].dkl_cylno = spc() / spc();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
#endif			/* defined(i386) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
	    break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
	case L_TYPE_EFI:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
	    if (sel_type == 1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
		for (i = 0; i < cur_parts->etoc->efi_nparts; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
		    cur_parts->etoc->efi_parts[i].p_start = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
		    cur_parts->etoc->efi_parts[i].p_size = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
	    break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
	fmt_print("\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
	if (cur_label == L_TYPE_SOLARIS) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
	    print_map(tmp_pinfo);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
	    print_map(cur_parts);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
	ioparam.io_charlist = confirm_list;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
	if (input(FIO_MSTR,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
"Do you wish to continue creating a new partition\ntable based on above table",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
			'?', &ioparam, &inpt_dflt, DATA_INPUT)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
	 * get Free Hog partition
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
	inpt_dflt = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
	while ((free_hog < 0) && (cur_label == L_TYPE_SOLARIS)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
		free_hog = G_PARTITION;	/* default to g partition */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
		ioparam.io_charlist = partn_list;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
		free_hog = input(FIO_MSTR, "Free Hog partition", '?',
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
			&ioparam, &free_hog, DATA_INPUT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
		/* disallow c partition */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
		if (free_hog == C_PARTITION) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
			fmt_print("'%c' cannot be the 'Free Hog' partition.\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
				C_PARTITION + PARTITION_BASE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
			free_hog = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
		 * If user selected all float set the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
		 * float to be the whole disk.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
		if (sel_type == 1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
			map[free_hog].dkl_nblk = map[C_PARTITION].dkl_nblk;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
#if defined(i386)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
			map[free_hog].dkl_nblk -= map[I_PARTITION].dkl_nblk;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
			if (cur_ctype->ctype_ctype != DKC_SCSI_CCS) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
				map[free_hog].dkl_nblk -=
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
					map[J_PARTITION].dkl_nblk;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
#endif			/* defined(i386) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
		 * Warn the user if there is no free space in
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
		 * the float partition.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
		if (map[free_hog].dkl_nblk == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
			err_print("\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
Warning: No space available from Free Hog partition.\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
			ioparam.io_charlist = confirm_list;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
			if (input(FIO_MSTR, "Continue", '?',
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
				&ioparam, &inpt_dflt, DATA_INPUT)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
				free_hog = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
	inpt_dflt = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
	if (cur_label == L_TYPE_EFI) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
	    free_hog = G_PARTITION; /* default to g partition */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
	    ioparam.io_charlist = partn_list;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
	    free_hog = input(FIO_MSTR, "Free Hog partition", '?',
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
		&ioparam, &free_hog, DATA_INPUT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
	    /* disallow c partition */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
	    if (free_hog == C_PARTITION) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
		fmt_print("'%c' cannot be the 'Free Hog' partition.\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
		    C_PARTITION + PARTITION_BASE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
	    get_user_map_efi(cur_parts->etoc, free_hog);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
	    print_map(cur_parts);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
	    if (check("Ready to label disk, continue")) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
	    fmt_print("\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
	    if (write_label()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
		err_print("Writing label failed\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
	    return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
	 * get user modified partition table
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
	get_user_map(map, free_hog);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
	 * Update cylno offsets
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
	adj_cyl_offset(map);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
	fmt_print("\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
	print_map(tmp_pinfo);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
	ioparam.io_charlist = confirm_list;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
	if (input(FIO_MSTR, "\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
Okay to make this the current partition table", '?',
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
		&ioparam, &inpt_dflt, DATA_INPUT)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
		make_partition();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
		 * Update new partition map
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
		for (i = 0; i < NDKMAP; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
			cur_parts->pinfo_map[i].dkl_nblk = map[i].dkl_nblk;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
			cur_parts->pinfo_map[i].dkl_cylno = map[i].dkl_cylno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
#ifdef i386
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
			cur_parts->vtoc.v_part[i].p_start =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
				map[i].dkl_cylno * nhead * nsect;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
			cur_parts->vtoc.v_part[i].p_size =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
				map[i].dkl_nblk;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
		(void) p_name();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
		 * Label the disk now
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
		if (check("Ready to label disk, continue")) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
			return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
		fmt_print("\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
		if (write_label()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
			err_print("Writing label failed\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
			return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
 * Adjust cylinder offsets
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   340
adj_cyl_offset(map)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
	struct	dk_map32 *map;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
	int	i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
	int	cyloffset = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
	 * Update cylno offsets
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
#if defined(_SUNOS_VTOC_16)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
	 * Correct cylinder allocation for having the boot and alternates
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
	 * slice in the beginning of the disk
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
	for (i = NDKMAP/2; i < NDKMAP; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
		if (i != C_PARTITION && map[i].dkl_nblk) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
			map[i].dkl_cylno = cyloffset;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
			cyloffset += (map[i].dkl_nblk + (spc()-1))/spc();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   360
		} else if (map[i].dkl_nblk == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   361
			map[i].dkl_cylno = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   362
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   363
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
	for (i = 0; i < NDKMAP/2; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   365
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   366
#else					/* !defined(_SUNOS_VTOC_16) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
	for (i = 0; i < NDKMAP; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   368
#endif					/* defined(_SUNOS_VTOC_16) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
		if (i != C_PARTITION && map[i].dkl_nblk) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
			map[i].dkl_cylno = cyloffset;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
			cyloffset += (map[i].dkl_nblk + (spc()-1))/spc();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
		} else if (map[i].dkl_nblk == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
			map[i].dkl_cylno = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   378
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   379
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   380
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   381
 * Check partition table
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
check_map(map)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
	struct	dk_map32 *map;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
	int	i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
	int	cyloffset = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
	int	tot_blks = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
#ifdef i386
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
	 * On x86, we must account for the boot and alternates
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
	cyloffset = map[0].dkl_cylno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
	tot_blks = map[0].dkl_nblk;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
	 * Do some checks for invalid parameters but do
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
	 * not modify the table.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
	for (i = 0; i < NDKMAP; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
		if (map[i].dkl_cylno < 0 ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
				map[i].dkl_cylno > (daddr_t)ncyl-1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
			err_print("\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   407
Warning: Partition %c starting cylinder %d is out of range.\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   408
				(PARTITION_BASE+i), map[i].dkl_cylno);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   409
			return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   410
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   411
		if (map[i].dkl_nblk < 0 || map[i].dkl_nblk > (daddr_t)(ncyl -
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   412
			map[i].dkl_cylno) * spc()) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   413
			err_print("\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   414
Warning: Partition %c, specified # of blocks, %d, is out of range.\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   415
				(PARTITION_BASE+i), map[i].dkl_nblk);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   416
			return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
		if (i != C_PARTITION && map[i].dkl_nblk) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
#ifdef	i386
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
			if (i == I_PARTITION || i == J_PARTITION)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
				continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   422
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   423
			if (map[i].dkl_cylno < cyloffset) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   424
				err_print(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   425
"Warning: Overlapping partition (%c) in table.\n", PARTITION_BASE+i);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   426
				return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   427
			} else if (map[i].dkl_cylno > cyloffset) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   428
				err_print(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   429
"Warning: Non-contiguous partition (%c) in table.\n", PARTITION_BASE+i);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   430
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   431
			cyloffset += (map[i].dkl_nblk + (spc()-1))/spc();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   432
			tot_blks = map[i].dkl_nblk;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   433
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   434
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   435
	if (tot_blks > map[C_PARTITION].dkl_nblk) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   436
		err_print("\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   437
Warning: Total blocks used is greater than number of blocks in '%c'\n\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   438
\tpartition.\n", C_PARTITION + PARTITION_BASE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   439
	return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   440
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   441
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   442
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   443
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   444
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   445
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   446
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   447
 * get user defined partitions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   448
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   449
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   450
get_user_map(map, float_part)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   451
	struct	dk_map32 *map;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   452
	int	float_part;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   453
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   454
	int		i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   455
	int		newsize;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   456
	int		deflt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   457
	char		tmpstr[80];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   458
	u_ioparam_t	ioparam;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   459
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   460
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   461
	 * Get partition sizes
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   462
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   463
	for (i = 0; i < NDKMAP; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   464
		if (partn_list[i] == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   465
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   466
		if ((i == C_PARTITION) || (i == float_part))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   467
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   468
		else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   469
			ioparam.io_bounds.lower = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   470
			ioparam.io_bounds.upper = map[i].dkl_nblk +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   471
				map[float_part].dkl_nblk;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   472
			deflt = map[i].dkl_nblk;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   473
			if (ioparam.io_bounds.upper == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
				err_print("\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
Warning: no space available for '%s' from Free Hog partition\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   476
					partn_list[i]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   477
				continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   478
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   479
			(void) snprintf(tmpstr, sizeof (tmpstr),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   480
				"Enter size of partition '%s' ",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   481
				partn_list[i]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   482
			newsize = input(FIO_CYL, tmpstr, ':',
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   483
				&ioparam, &deflt, DATA_INPUT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   484
			map[float_part].dkl_nblk -= (newsize - map[i].dkl_nblk);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   485
			map[i].dkl_nblk = newsize;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   486
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   487
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   488
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   489
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   490
static struct partition_info *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   491
build_partition(tptr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   492
struct disk_type *tptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   493
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   494
	struct partition_info	*part;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   495
	struct dk_label		*label;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   496
	int			i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   497
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   498
#ifdef DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   499
	fmt_print("Creating Default Partition for the disk \n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   500
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   501
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   502
	 * construct a label and pass it on to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   503
	 * build_default_partition() which builds the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   504
	 * default partition list.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   505
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   506
	label = zalloc(sizeof (struct dk_label));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   507
	label->dkl_pcyl = tptr->dtype_pcyl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   508
	label->dkl_ncyl = tptr->dtype_ncyl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   509
	label->dkl_acyl = tptr->dtype_acyl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   510
	label->dkl_nhead = tptr->dtype_nhead;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   511
	label->dkl_nsect = tptr->dtype_nsect;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   512
	label->dkl_apc = apc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   513
	label->dkl_intrlv = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   514
	label->dkl_rpm	= tptr->dtype_rpm;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   515
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   516
	if (!build_default_partition(label, cur_ctype->ctype_ctype))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   517
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   518
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   519
	part = (struct partition_info *)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   520
		    zalloc(sizeof (struct partition_info));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   521
	part->pinfo_name = alloc_string(tptr->dtype_asciilabel);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   522
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   523
	 * Fill in the partition info from the label
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   524
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   525
	for (i = 0; i < NDKMAP; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   526
#if defined(_SUNOS_VTOC_8)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   527
	    part->pinfo_map[i] = label->dkl_map[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   528
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   529
	    part->pinfo_map[i].dkl_cylno =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   530
	    label->dkl_vtoc.v_part[i].p_start /
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   531
			((int)(tptr->dtype_nhead * tptr->dtype_nsect - apc));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   532
	    part->pinfo_map[i].dkl_nblk =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   533
		label->dkl_vtoc.v_part[i].p_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   534
#endif /* ifdefined(_SUNOS_VTOC_8) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   535
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   536
	part->vtoc = label->dkl_vtoc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   537
	return (part);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   538
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   539
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   540
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   541
 * build new partition table for given disk type
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   542
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   543
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   544
get_user_map_efi(map, float_part)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   545
	struct dk_gpt *map;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   546
	int	float_part;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   547
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   548
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   549
	int		i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   550
	efi_deflt_t	efi_deflt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   551
	u_ioparam_t	ioparam;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   552
	char		tmpstr[80];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   553
	uint64_t	i64;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   554
	uint64_t	start_lba = 34;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   555
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   556
	for (i = 0; i < map->efi_nparts - 1; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   557
		if (i == float_part)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   558
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   559
		else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   560
			ioparam.io_bounds.lower = start_lba;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   561
			ioparam.io_bounds.upper = map->efi_last_u_lba;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   562
			efi_deflt.start_sector = ioparam.io_bounds.lower;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   563
			efi_deflt.end_sector = map->efi_parts[i].p_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   564
			(void) sprintf(tmpstr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   565
			    "Enter size of partition %d ", i);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   566
			i64 = input(FIO_EFI, tmpstr, ':',
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   567
			    &ioparam, (int *)&efi_deflt, DATA_INPUT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   568
			if (i64 == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   569
			    map->efi_parts[i].p_tag = V_UNASSIGNED;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   570
			} else if ((i64 != 0) && (map->efi_parts[i].p_tag ==
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   571
				V_UNASSIGNED)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   572
			    map->efi_parts[i].p_tag = V_USR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   573
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   574
			if (i64 == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   575
			    map->efi_parts[i].p_start = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   576
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   577
			    map->efi_parts[i].p_start = start_lba;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   578
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   579
			map->efi_parts[i].p_size = i64;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   580
			start_lba += i64;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   581
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   582
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   583
		map->efi_parts[float_part].p_start = start_lba;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   584
		map->efi_parts[float_part].p_size = map->efi_last_u_lba -
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   585
			start_lba - (1024 * 16);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   586
		map->efi_parts[float_part].p_tag = V_USR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   587
		if (map->efi_parts[float_part].p_size == UINT_MAX64) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   588
			map->efi_parts[float_part].p_size = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   589
			map->efi_parts[float_part].p_start = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   590
			map->efi_parts[float_part].p_tag = V_UNASSIGNED;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   591
			fmt_print("Warning: No space left for HOG\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   592
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   593
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   594
		for (i = 0; i < map->efi_nparts; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   595
		    if (map->efi_parts[i].p_tag == V_RESERVED) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   596
			map->efi_parts[i].p_start = map->efi_last_u_lba -
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   597
			    (1024 * 16);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   598
			map->efi_parts[i].p_size = (1024 * 16);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   599
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   600
		    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   601
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   602
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   603
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   604
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   605
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   606
new_partitiontable(tptr, oldtptr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   607
struct disk_type	*tptr, *oldtptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   608
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   609
	struct partition_info *part;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   610
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   611
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   612
	 * check if disk geometry has changed , if so add new
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   613
	 * partition table else copy the old partition table.(best guess).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   614
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   615
	if ((oldtptr != NULL) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   616
		(tptr->dtype_ncyl ==  oldtptr->dtype_ncyl) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   617
		(tptr->dtype_nhead == oldtptr->dtype_nhead) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   618
		(tptr->dtype_nsect == oldtptr->dtype_nsect)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   619
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   620
	    part = (struct partition_info *)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   621
			zalloc(sizeof (struct partition_info));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   622
	    bcopy((char *)cur_parts, (char *)part,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   623
			sizeof (struct partition_info));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   624
	    part->pinfo_next = tptr->dtype_plist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   625
	    tptr->dtype_plist = part;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   626
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   627
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   628
#ifdef DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   629
		if (cur_parts != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   630
			fmt_print("Warning: Partition Table is set");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   631
			fmt_print("to default partition table. \n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   632
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   633
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   634
		if (tptr->dtype_plist == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   635
			part = (struct partition_info *)build_partition(tptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   636
			if (part != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   637
				part->pinfo_next = tptr->dtype_plist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   638
				tptr->dtype_plist = part;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   639
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   640
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   641
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   642
}