1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * CDDL HEADER START
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * The contents of this file are subject to the terms of the
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Common Development and Distribution License (the "License").
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * You may not use this file except in compliance with the License.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * or http://www.opensolaris.org/os/licensing.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * See the License for the specific language governing permissions
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * and limitations under the License.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * When distributing Covered Code, include this CDDL HEADER in each
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * If applicable, add the following below this CDDL HEADER, with the
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * fields enclosed by brackets "[]" replaced with your own identifying
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * information: Portions Copyright [yyyy] [name of copyright owner]
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * CDDL HEADER END
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
ca6d128098b8e877673c13a3db1a0d3417ce5879Alexandre Chartre * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#ifndef _VDSK_COMMON_H
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define _VDSK_COMMON_H
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#ifdef __cplusplus
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppoextern "C" {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#endif
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * This header file contains the private LDoms Virtual Disk (vDisk) definitions
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * common to both the server (vds) and the client (vdc)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan#include <sys/efi_partition.h>
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#include <sys/machparam.h>
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#include <sys/vtoc.h>
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#include <sys/ldc.h>
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#include <sys/vio_common.h>
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#include <sys/vio_mailbox.h>
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * vDisk definitions
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * The number of Descriptor Ring entries
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Constraints:
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * - overall DRing size must be greater than 8K (MMU_PAGESIZE)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * - overall DRing size should be 8K aligned (desirable but not enforced)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * - DRing entry must be 8 byte aligned
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define VD_DRING_LEN 512
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define VD_DRING_ENTRY_SZ (sizeof (vd_dring_entry_t) + \
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo (sizeof (ldc_mem_cookie_t) * (VD_MAX_COOKIES - 1)))
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * The maximum block size we can transmit using one Descriptor Ring entry
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Currently no FS uses more than 128K and it doesn't look like they
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * will either as there is no perf gain to be had by larger values.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * ( see ZFS comment at definition of SPA_MAXBLOCKSIZE ).
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo *
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * We choose 256K to give us some headroom.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define VD_MAX_BLOCK_SIZE (256 * 1024)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define VD_MAX_COOKIES ((VD_MAX_BLOCK_SIZE / PAGESIZE) + 1)
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define VD_USEC_TIMEOUT 20000
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define VD_LDC_IDS_PROP "ldc-ids"
e1ebb9ec908bc2d0a8810f137ebd6566cc8a8061lm#define VD_LDC_MTU 256
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Flags used by ioctl routines to indicate if a copyin/copyout is needed
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define VD_COPYOUT 0x1
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define VD_COPYIN 0x2
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * vDisk operations on physical devices
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define VD_OP_BREAD 0x01 /* Block Read */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define VD_OP_BWRITE 0x02 /* Block Write */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define VD_OP_FLUSH 0x03 /* Flush disk write cache contents */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define VD_OP_GET_WCE 0x04 /* Get disk W$ status */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define VD_OP_SET_WCE 0x05 /* Enable/Disable disk W$ */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define VD_OP_GET_VTOC 0x06 /* Get VTOC */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define VD_OP_SET_VTOC 0x07 /* Set VTOC */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define VD_OP_GET_DISKGEOM 0x08 /* Get disk geometry */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define VD_OP_SET_DISKGEOM 0x09 /* Set disk geometry */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define VD_OP_SCSICMD 0x0a /* SCSI control command */
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan#define VD_OP_GET_DEVID 0x0b /* Get device id */
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan#define VD_OP_GET_EFI 0x0c /* Get EFI */
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan#define VD_OP_SET_EFI 0x0d /* Set EFI */
2f5224ae5d04383463098ad866ccee0464ee6429achartre#define VD_OP_RESET 0x0e /* Reset disk */
2f5224ae5d04383463098ad866ccee0464ee6429achartre#define VD_OP_GET_ACCESS 0x0f /* Get disk access */
2f5224ae5d04383463098ad866ccee0464ee6429achartre#define VD_OP_SET_ACCESS 0x10 /* Set disk access */
2f5224ae5d04383463098ad866ccee0464ee6429achartre#define VD_OP_GET_CAPACITY 0x11 /* Get disk capacity */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#define VD_OP_MASK 0xFF /* mask of all possible operations */
2f5224ae5d04383463098ad866ccee0464ee6429achartre#define VD_OP_COUNT 0x11 /* Number of operations */
2f5224ae5d04383463098ad866ccee0464ee6429achartre
2f5224ae5d04383463098ad866ccee0464ee6429achartre/*
2f5224ae5d04383463098ad866ccee0464ee6429achartre * Status for the VD_OP_GET_ACCESS operation
2f5224ae5d04383463098ad866ccee0464ee6429achartre */
2f5224ae5d04383463098ad866ccee0464ee6429achartre#define VD_ACCESS_DENIED 0x00 /* access is not allowed */
2f5224ae5d04383463098ad866ccee0464ee6429achartre#define VD_ACCESS_ALLOWED 0x01 /* access is allowed */
2f5224ae5d04383463098ad866ccee0464ee6429achartre
2f5224ae5d04383463098ad866ccee0464ee6429achartre/*
2f5224ae5d04383463098ad866ccee0464ee6429achartre * Flags for the VD_OP_SET_ACCESS operation
2f5224ae5d04383463098ad866ccee0464ee6429achartre */
2f5224ae5d04383463098ad866ccee0464ee6429achartre#define VD_ACCESS_SET_CLEAR 0x00 /* clear exclusive access rights */
2f5224ae5d04383463098ad866ccee0464ee6429achartre#define VD_ACCESS_SET_EXCLUSIVE 0x01 /* set exclusive access rights */
2f5224ae5d04383463098ad866ccee0464ee6429achartre#define VD_ACCESS_SET_PREEMPT 0x02 /* forcefully set access rights */
2f5224ae5d04383463098ad866ccee0464ee6429achartre#define VD_ACCESS_SET_PRESERVE 0x04 /* preserve access rights */
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan
17cadca83cc82e37ff517ea2783eb4bfcc07b950lm/*
17cadca83cc82e37ff517ea2783eb4bfcc07b950lm * This is a mask of all the basic operations supported by all
17cadca83cc82e37ff517ea2783eb4bfcc07b950lm * disk types (v1.0).
17cadca83cc82e37ff517ea2783eb4bfcc07b950lm */
17cadca83cc82e37ff517ea2783eb4bfcc07b950lm#define VD_OP_MASK_READ \
17cadca83cc82e37ff517ea2783eb4bfcc07b950lm ((1 << VD_OP_BREAD) | \
17cadca83cc82e37ff517ea2783eb4bfcc07b950lm (1 << VD_OP_GET_WCE) | \
17cadca83cc82e37ff517ea2783eb4bfcc07b950lm (1 << VD_OP_GET_VTOC) | \
17cadca83cc82e37ff517ea2783eb4bfcc07b950lm (1 << VD_OP_GET_DISKGEOM) | \
17cadca83cc82e37ff517ea2783eb4bfcc07b950lm (1 << VD_OP_GET_DEVID) | \
17cadca83cc82e37ff517ea2783eb4bfcc07b950lm (1 << VD_OP_GET_EFI))
17cadca83cc82e37ff517ea2783eb4bfcc07b950lm
17cadca83cc82e37ff517ea2783eb4bfcc07b950lm#define VD_OP_MASK_WRITE \
17cadca83cc82e37ff517ea2783eb4bfcc07b950lm ((1 << VD_OP_BWRITE) | \
17cadca83cc82e37ff517ea2783eb4bfcc07b950lm (1 << VD_OP_FLUSH) | \
17cadca83cc82e37ff517ea2783eb4bfcc07b950lm (1 << VD_OP_SET_WCE) | \
17cadca83cc82e37ff517ea2783eb4bfcc07b950lm (1 << VD_OP_SET_VTOC) | \
17cadca83cc82e37ff517ea2783eb4bfcc07b950lm (1 << VD_OP_SET_DISKGEOM) | \
17cadca83cc82e37ff517ea2783eb4bfcc07b950lm (1 << VD_OP_SET_EFI))
17cadca83cc82e37ff517ea2783eb4bfcc07b950lm
2f5224ae5d04383463098ad866ccee0464ee6429achartre/*
2f5224ae5d04383463098ad866ccee0464ee6429achartre * Mask for additional operations provided for SCSI disks (v1.1)
2f5224ae5d04383463098ad866ccee0464ee6429achartre */
2f5224ae5d04383463098ad866ccee0464ee6429achartre#define VD_OP_MASK_SCSI \
2f5224ae5d04383463098ad866ccee0464ee6429achartre ((1 << VD_OP_SCSICMD) | \
2f5224ae5d04383463098ad866ccee0464ee6429achartre (1 << VD_OP_RESET) | \
2f5224ae5d04383463098ad866ccee0464ee6429achartre (1 << VD_OP_GET_ACCESS) | \
de3a53312897a4ba0d450636226db584e8b09648Ramesh Chitrothu (1 << VD_OP_SET_ACCESS))
17cadca83cc82e37ff517ea2783eb4bfcc07b950lm
17cadca83cc82e37ff517ea2783eb4bfcc07b950lm/*
17cadca83cc82e37ff517ea2783eb4bfcc07b950lm * macro to check if the operation 'op' is supported by checking the list
17cadca83cc82e37ff517ea2783eb4bfcc07b950lm * of operations supported which is exported by the vDisk server.
17cadca83cc82e37ff517ea2783eb4bfcc07b950lm */
17cadca83cc82e37ff517ea2783eb4bfcc07b950lm#define VD_OP_SUPPORTED(ops_bitmask, op) ((ops_bitmask) & (1 << (op)))
17cadca83cc82e37ff517ea2783eb4bfcc07b950lm
87a7269eb068de448caa9e4404e38bebf4449531achartre/*
87a7269eb068de448caa9e4404e38bebf4449531achartre * Slice for absolute disk transaction.
87a7269eb068de448caa9e4404e38bebf4449531achartre */
87a7269eb068de448caa9e4404e38bebf4449531achartre#define VD_SLICE_NONE 0xFF
87a7269eb068de448caa9e4404e38bebf4449531achartre
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan/*
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan * EFI disks do not have a slice 7. Actually that slice is used to represent
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan * the whole disk.
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan */
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan#define VD_EFI_WD_SLICE 7
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * Definitions of the various ways vds can export disk support to vdc.
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppotypedef enum vd_disk_type {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo VD_DISK_TYPE_UNK = 0, /* Unknown device type */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo VD_DISK_TYPE_SLICE, /* slice in block device */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo VD_DISK_TYPE_DISK /* entire disk (slice 2) */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo} vd_disk_type_t;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan/*
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan * Definitions of the various disk label that vDisk supports.
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan */
4bac220845f606f60663ed6f3a2b88caa00ae87enarayantypedef enum vd_disk_label {
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan VD_DISK_LABEL_UNK = 0, /* Unknown disk label */
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan VD_DISK_LABEL_VTOC, /* VTOC disk label */
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan VD_DISK_LABEL_EFI /* EFI disk label */
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan} vd_disk_label_t;
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * vDisk Descriptor payload
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppotypedef struct vd_dring_payload {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo uint64_t req_id; /* The request ID being processed */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo uint8_t operation; /* operation for server to perform */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo uint8_t slice; /* The disk slice being accessed */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo uint16_t resv1; /* padding */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo uint32_t status; /* "errno" of server operation */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo uint64_t addr; /* LP64 diskaddr_t (block I/O) */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo uint64_t nbytes; /* LP64 size_t */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo uint32_t ncookies; /* Number of cookies used */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo uint32_t resv2; /* padding */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo ldc_mem_cookie_t cookie[1]; /* variable sized array */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo} vd_dring_payload_t;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * vDisk Descriptor entry
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppotypedef struct vd_dring_entry {
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo vio_dring_entry_hdr_t hdr; /* common header */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo vd_dring_payload_t payload; /* disk specific data */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo} vd_dring_entry_t;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
edcc07547a39d6570197493a9836083bd6b2a197achartre/*
edcc07547a39d6570197493a9836083bd6b2a197achartre * vDisk logical partition
edcc07547a39d6570197493a9836083bd6b2a197achartre */
edcc07547a39d6570197493a9836083bd6b2a197achartretypedef struct vd_slice {
edcc07547a39d6570197493a9836083bd6b2a197achartre daddr_t start; /* block number of slice start */
edcc07547a39d6570197493a9836083bd6b2a197achartre daddr_t nblocks; /* number of blocks in the slice */
edcc07547a39d6570197493a9836083bd6b2a197achartre} vd_slice_t;
edcc07547a39d6570197493a9836083bd6b2a197achartre
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo * vDisk control operation structures
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm * vDisk geometry definition (VD_OP_GET_DISKGEOM and VD_OP_SET_DISKGEOM)
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm */
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lmtypedef struct vd_geom {
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm uint16_t ncyl; /* number of data cylinders */
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm uint16_t acyl; /* number of alternate cylinders */
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm uint16_t bcyl; /* cyl offset for fixed head area */
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm uint16_t nhead; /* number of heads */
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm uint16_t nsect; /* number of data sectors per track */
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm uint16_t intrlv; /* interleave factor */
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm uint16_t apc; /* alternates per cyl (SCSI only) */
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm uint16_t rpm; /* revolutions per minute */
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm uint16_t pcyl; /* number of physical cylinders */
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm uint16_t write_reinstruct; /* # sectors to skip, writes */
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm uint16_t read_reinstruct; /* # sectors to skip, reads */
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm} vd_geom_t;
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm/*
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm * vDisk partition definition
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppotypedef struct vd_partition {
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm uint16_t id_tag; /* ID tag of partition */
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm uint16_t perm; /* permission flags for partition */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo uint32_t reserved; /* padding */
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm uint64_t start; /* block number of partition start */
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm uint64_t nblocks; /* number of blocks in partition */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo} vd_partition_t;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm/*
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm * vDisk VTOC definition (VD_OP_GET_VTOC and VD_OP_SET_VTOC)
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm */
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm#define VD_VOLNAME_LEN 8 /* length of volume_name field */
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm#define VD_ASCIILABEL_LEN 128 /* length of ascii_label field */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppotypedef struct vd_vtoc {
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm char volume_name[VD_VOLNAME_LEN]; /* volume name */
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm uint16_t sector_size; /* sector size in bytes */
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm uint16_t num_partitions; /* number of partitions */
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm char ascii_label[VD_ASCIILABEL_LEN]; /* ASCII label */
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm vd_partition_t partition[V_NUMPAR]; /* partition headers */
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo} vd_vtoc_t;
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan/*
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan * vDisk EFI definition (VD_OP_GET_EFI and VD_OP_SET_EFI)
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan */
4bac220845f606f60663ed6f3a2b88caa00ae87enarayantypedef struct vd_efi {
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan uint64_t lba; /* lba of the request */
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan uint64_t length; /* length of data */
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan char data[1]; /* data of the request */
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan} vd_efi_t;
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan/*
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan * vDisk DEVID definition (VD_OP_GET_DEVID)
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan */
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan#define VD_DEVID_SIZE(l) (sizeof (vd_devid_t) - 1 + l)
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan#define VD_DEVID_DEFAULT_LEN 128
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan
4bac220845f606f60663ed6f3a2b88caa00ae87enarayantypedef struct vd_devid {
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan uint16_t reserved; /* padding */
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan uint16_t type; /* type of device id */
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan uint32_t length; /* length the device id */
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan char id[1]; /* device id */
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan} vd_devid_t;
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan
2f5224ae5d04383463098ad866ccee0464ee6429achartre/*
2f5224ae5d04383463098ad866ccee0464ee6429achartre * vDisk CAPACITY definition (VD_OP_GET_CAPACITY)
2f5224ae5d04383463098ad866ccee0464ee6429achartre */
2f5224ae5d04383463098ad866ccee0464ee6429achartretypedef struct vd_capacity {
2f5224ae5d04383463098ad866ccee0464ee6429achartre uint32_t vdisk_block_size; /* block size in bytes */
2f5224ae5d04383463098ad866ccee0464ee6429achartre uint32_t reserved; /* reserved */
2f5224ae5d04383463098ad866ccee0464ee6429achartre uint64_t vdisk_size; /* disk size in blocks */
2f5224ae5d04383463098ad866ccee0464ee6429achartre} vd_capacity_t;
2f5224ae5d04383463098ad866ccee0464ee6429achartre
2f5224ae5d04383463098ad866ccee0464ee6429achartre/* Identifier for unknown disk size */
2f5224ae5d04383463098ad866ccee0464ee6429achartre#define VD_SIZE_UNKNOWN -1
2f5224ae5d04383463098ad866ccee0464ee6429achartre
2f5224ae5d04383463098ad866ccee0464ee6429achartre/*
2f5224ae5d04383463098ad866ccee0464ee6429achartre * vDisk SCSI definition (VD_OP_SCSICMD)
2f5224ae5d04383463098ad866ccee0464ee6429achartre */
2f5224ae5d04383463098ad866ccee0464ee6429achartretypedef struct vd_scsi {
2f5224ae5d04383463098ad866ccee0464ee6429achartre uint8_t cmd_status; /* command completion status */
2f5224ae5d04383463098ad866ccee0464ee6429achartre uint8_t sense_status; /* sense command completion status */
2f5224ae5d04383463098ad866ccee0464ee6429achartre uint8_t task_attribute; /* task attribute */
2f5224ae5d04383463098ad866ccee0464ee6429achartre uint8_t task_priority; /* task priority */
2f5224ae5d04383463098ad866ccee0464ee6429achartre uint8_t crn; /* command reference number */
2f5224ae5d04383463098ad866ccee0464ee6429achartre uint8_t reserved; /* reserved */
2f5224ae5d04383463098ad866ccee0464ee6429achartre uint16_t timeout; /* command timeout */
2f5224ae5d04383463098ad866ccee0464ee6429achartre uint64_t options; /* options */
2f5224ae5d04383463098ad866ccee0464ee6429achartre uint64_t cdb_len; /* CDB data length */
2f5224ae5d04383463098ad866ccee0464ee6429achartre uint64_t sense_len; /* sense request length */
2f5224ae5d04383463098ad866ccee0464ee6429achartre uint64_t datain_len; /* data in buffer length */
2f5224ae5d04383463098ad866ccee0464ee6429achartre uint64_t dataout_len; /* data out buffer length */
2f5224ae5d04383463098ad866ccee0464ee6429achartre char data[1]; /* data (CDB, sense, data in/out */
2f5224ae5d04383463098ad866ccee0464ee6429achartre} vd_scsi_t;
2f5224ae5d04383463098ad866ccee0464ee6429achartre
2f5224ae5d04383463098ad866ccee0464ee6429achartre/* Minimum size of the vd_scsi structure */
2f5224ae5d04383463098ad866ccee0464ee6429achartre#define VD_SCSI_SIZE (sizeof (vd_scsi_t) - sizeof (uint64_t))
2f5224ae5d04383463098ad866ccee0464ee6429achartre
2f5224ae5d04383463098ad866ccee0464ee6429achartre/*
2f5224ae5d04383463098ad866ccee0464ee6429achartre * Macros to access data buffers in a vd_scsi structure. When using these
2f5224ae5d04383463098ad866ccee0464ee6429achartre * macros, the vd_scsi structure needs to be populated with the sizes of
2f5224ae5d04383463098ad866ccee0464ee6429achartre * data buffers allocated in the structure.
2f5224ae5d04383463098ad866ccee0464ee6429achartre */
2f5224ae5d04383463098ad866ccee0464ee6429achartre#define VD_SCSI_DATA_CDB(vscsi) \
2f5224ae5d04383463098ad866ccee0464ee6429achartre ((union scsi_cdb *)(uintptr_t)((vscsi)->data))
2f5224ae5d04383463098ad866ccee0464ee6429achartre
2f5224ae5d04383463098ad866ccee0464ee6429achartre#define VD_SCSI_DATA_SENSE(vscsi) \
2f5224ae5d04383463098ad866ccee0464ee6429achartre ((struct scsi_extended_sense *)(uintptr_t)((vscsi)->data + \
2f5224ae5d04383463098ad866ccee0464ee6429achartre P2ROUNDUP((vscsi)->cdb_len, sizeof (uint64_t))))
2f5224ae5d04383463098ad866ccee0464ee6429achartre
2f5224ae5d04383463098ad866ccee0464ee6429achartre#define VD_SCSI_DATA_IN(vscsi) \
2f5224ae5d04383463098ad866ccee0464ee6429achartre ((uintptr_t)((vscsi)->data + \
2f5224ae5d04383463098ad866ccee0464ee6429achartre P2ROUNDUP((vscsi)->cdb_len, sizeof (uint64_t)) + \
2f5224ae5d04383463098ad866ccee0464ee6429achartre P2ROUNDUP((vscsi)->sense_len, sizeof (uint64_t))))
2f5224ae5d04383463098ad866ccee0464ee6429achartre
2f5224ae5d04383463098ad866ccee0464ee6429achartre#define VD_SCSI_DATA_OUT(vscsi) \
2f5224ae5d04383463098ad866ccee0464ee6429achartre ((uintptr_t)((vscsi)->data + \
2f5224ae5d04383463098ad866ccee0464ee6429achartre P2ROUNDUP((vscsi)->cdb_len, sizeof (uint64_t)) + \
2f5224ae5d04383463098ad866ccee0464ee6429achartre P2ROUNDUP((vscsi)->sense_len, sizeof (uint64_t)) + \
2f5224ae5d04383463098ad866ccee0464ee6429achartre P2ROUNDUP((vscsi)->datain_len, sizeof (uint64_t))))
2f5224ae5d04383463098ad866ccee0464ee6429achartre
2f5224ae5d04383463098ad866ccee0464ee6429achartre/* vDisk SCSI task attribute */
2f5224ae5d04383463098ad866ccee0464ee6429achartre#define VD_SCSI_TASK_SIMPLE 0x01 /* simple task */
2f5224ae5d04383463098ad866ccee0464ee6429achartre#define VD_SCSI_TASK_ORDERED 0x02 /* ordered task */
2f5224ae5d04383463098ad866ccee0464ee6429achartre#define VD_SCSI_TASK_HQUEUE 0x03 /* head of queue task */
2f5224ae5d04383463098ad866ccee0464ee6429achartre#define VD_SCSI_TASK_ACA 0x04 /* ACA task */
2f5224ae5d04383463098ad866ccee0464ee6429achartre
2f5224ae5d04383463098ad866ccee0464ee6429achartre/* vDisk SCSI options */
2f5224ae5d04383463098ad866ccee0464ee6429achartre#define VD_SCSI_OPT_CRN 0x01 /* request has a CRN */
2f5224ae5d04383463098ad866ccee0464ee6429achartre#define VD_SCSI_OPT_NORETRY 0x02 /* do not attempt any retry */
2f5224ae5d04383463098ad866ccee0464ee6429achartre
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo/*
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm * Copy the contents of a vd_geom_t to the contents of a dk_geom struct
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo */
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm#define VD_GEOM2DK_GEOM(vd_geom, dk_geom) \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm{ \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm bzero((dk_geom), sizeof (*(dk_geom))); \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm (dk_geom)->dkg_ncyl = (vd_geom)->ncyl; \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm (dk_geom)->dkg_acyl = (vd_geom)->acyl; \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm (dk_geom)->dkg_bcyl = (vd_geom)->bcyl; \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm (dk_geom)->dkg_nhead = (vd_geom)->nhead; \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm (dk_geom)->dkg_nsect = (vd_geom)->nsect; \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm (dk_geom)->dkg_intrlv = (vd_geom)->intrlv; \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm (dk_geom)->dkg_apc = (vd_geom)->apc; \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm (dk_geom)->dkg_rpm = (vd_geom)->rpm; \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm (dk_geom)->dkg_pcyl = (vd_geom)->pcyl; \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm (dk_geom)->dkg_write_reinstruct = (vd_geom)->write_reinstruct; \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm (dk_geom)->dkg_read_reinstruct = (vd_geom)->read_reinstruct; \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm}
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm/*
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm * Copy the contents of a vd_vtoc_t to the contents of a vtoc struct
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm */
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm#define VD_VTOC2VTOC(vd_vtoc, vtoc) \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm{ \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm bzero((vtoc), sizeof (*(vtoc))); \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm bcopy((vd_vtoc)->volume_name, (vtoc)->v_volume, \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm MIN(sizeof ((vd_vtoc)->volume_name), \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm sizeof ((vtoc)->v_volume))); \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm bcopy((vd_vtoc)->ascii_label, (vtoc)->v_asciilabel, \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm MIN(sizeof ((vd_vtoc)->ascii_label), \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm sizeof ((vtoc)->v_asciilabel))); \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm (vtoc)->v_sanity = VTOC_SANE; \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm (vtoc)->v_version = V_VERSION; \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm (vtoc)->v_sectorsz = (vd_vtoc)->sector_size; \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm (vtoc)->v_nparts = (vd_vtoc)->num_partitions; \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm for (int i = 0; i < (vd_vtoc)->num_partitions; i++) { \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm (vtoc)->v_part[i].p_tag = (vd_vtoc)->partition[i].id_tag; \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm (vtoc)->v_part[i].p_flag = (vd_vtoc)->partition[i].perm; \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm (vtoc)->v_part[i].p_start = (vd_vtoc)->partition[i].start; \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm (vtoc)->v_part[i].p_size = (vd_vtoc)->partition[i].nblocks; \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm } \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm}
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm/*
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm * Copy the contents of a dk_geom struct to the contents of a vd_geom_t
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm */
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm#define DK_GEOM2VD_GEOM(dk_geom, vd_geom) \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm{ \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm bzero((vd_geom), sizeof (*(vd_geom))); \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm (vd_geom)->ncyl = (dk_geom)->dkg_ncyl; \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm (vd_geom)->acyl = (dk_geom)->dkg_acyl; \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm (vd_geom)->bcyl = (dk_geom)->dkg_bcyl; \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm (vd_geom)->nhead = (dk_geom)->dkg_nhead; \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm (vd_geom)->nsect = (dk_geom)->dkg_nsect; \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm (vd_geom)->intrlv = (dk_geom)->dkg_intrlv; \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm (vd_geom)->apc = (dk_geom)->dkg_apc; \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm (vd_geom)->rpm = (dk_geom)->dkg_rpm; \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm (vd_geom)->pcyl = (dk_geom)->dkg_pcyl; \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm (vd_geom)->write_reinstruct = (dk_geom)->dkg_write_reinstruct; \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm (vd_geom)->read_reinstruct = (dk_geom)->dkg_read_reinstruct; \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm}
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm/*
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm * Copy the contents of a vtoc struct to the contents of a vd_vtoc_t
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm */
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm#define VTOC2VD_VTOC(vtoc, vd_vtoc) \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm{ \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm bzero((vd_vtoc), sizeof (*(vd_vtoc))); \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm bcopy((vtoc)->v_volume, (vd_vtoc)->volume_name, \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm MIN(sizeof ((vtoc)->v_volume), \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm sizeof ((vd_vtoc)->volume_name))); \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm bcopy((vtoc)->v_asciilabel, (vd_vtoc)->ascii_label, \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm MIN(sizeof ((vtoc)->v_asciilabel), \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm sizeof ((vd_vtoc)->ascii_label))); \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm (vd_vtoc)->sector_size = (vtoc)->v_sectorsz; \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm (vd_vtoc)->num_partitions = (vtoc)->v_nparts; \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm for (int i = 0; i < (vtoc)->v_nparts; i++) { \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm (vd_vtoc)->partition[i].id_tag = (vtoc)->v_part[i].p_tag; \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm (vd_vtoc)->partition[i].perm = (vtoc)->v_part[i].p_flag; \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm (vd_vtoc)->partition[i].start = (vtoc)->v_part[i].p_start; \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm (vd_vtoc)->partition[i].nblocks = (vtoc)->v_part[i].p_size; \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm } \
0a55fbb79ee31ed09f84a9ae28e9747bc23f4a08lm}
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan/*
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan * Copy the contents of a vd_efi_t to the contents of a dk_efi_t.
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan * Note that (dk_efi)->dki_data and (vd_efi)->data should be correctly
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan * initialized prior to using this macro.
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan */
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan#define VD_EFI2DK_EFI(vd_efi, dk_efi) \
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan{ \
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan (dk_efi)->dki_lba = (vd_efi)->lba; \
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan (dk_efi)->dki_length = (vd_efi)->length; \
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan bcopy((vd_efi)->data, (dk_efi)->dki_data, (dk_efi)->dki_length); \
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan}
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan/*
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan * Copy the contents of dk_efi_t to the contents of vd_efi_t.
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan * Note that (dk_efi)->dki_data and (vd_efi)->data should be correctly
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan * initialized prior to using this macro.
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan */
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan#define DK_EFI2VD_EFI(dk_efi, vd_efi) \
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan{ \
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan (vd_efi)->lba = (dk_efi)->dki_lba; \
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan (vd_efi)->length = (dk_efi)->dki_length; \
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan bcopy((dk_efi)->dki_data, (vd_efi)->data, (vd_efi)->length); \
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan}
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan
17cadca83cc82e37ff517ea2783eb4bfcc07b950lm#define VD_MEDIATYPE2DK_MEDIATYPE(mt) \
17cadca83cc82e37ff517ea2783eb4bfcc07b950lm ((mt) == VD_MEDIA_FIXED ? DK_FIXED_DISK : \
17cadca83cc82e37ff517ea2783eb4bfcc07b950lm (mt) == VD_MEDIA_CD ? DK_CDROM : \
17cadca83cc82e37ff517ea2783eb4bfcc07b950lm (mt) == VD_MEDIA_DVD ? DK_DVDROM : \
17cadca83cc82e37ff517ea2783eb4bfcc07b950lm DK_UNKNOWN)
17cadca83cc82e37ff517ea2783eb4bfcc07b950lm
11f54b6e45feb2d8f72622727a377aa52baad4f9Alexandre Chartre/*
11f54b6e45feb2d8f72622727a377aa52baad4f9Alexandre Chartre * If the media type returned by the DKIOCGMEDIAINFO ioctl is greater than
11f54b6e45feb2d8f72622727a377aa52baad4f9Alexandre Chartre * 0xFFFF then this is not an optical media and we consider that this is
11f54b6e45feb2d8f72622727a377aa52baad4f9Alexandre Chartre * a fixed media.
11f54b6e45feb2d8f72622727a377aa52baad4f9Alexandre Chartre *
11f54b6e45feb2d8f72622727a377aa52baad4f9Alexandre Chartre * Otherwise, we have an optical media. If this is a SCSI media then the media
11f54b6e45feb2d8f72622727a377aa52baad4f9Alexandre Chartre * type is actually the profile number returned by the SCSI GET CONFIGURATION
11f54b6e45feb2d8f72622727a377aa52baad4f9Alexandre Chartre * command. In that case, the possible values we can have are described in the
11f54b6e45feb2d8f72622727a377aa52baad4f9Alexandre Chartre * SCSI Multi-Media Commands (MMC) documentation.
11f54b6e45feb2d8f72622727a377aa52baad4f9Alexandre Chartre *
11f54b6e45feb2d8f72622727a377aa52baad4f9Alexandre Chartre * Not all SCSI optical media profile numbers are defined in Solaris. However
11f54b6e45feb2d8f72622727a377aa52baad4f9Alexandre Chartre * undefined profiles are essentially different variants of DVD (like Blu-Ray
11f54b6e45feb2d8f72622727a377aa52baad4f9Alexandre Chartre * or HD-DVD). So we consider that any optical media that we can not explicitly
11f54b6e45feb2d8f72622727a377aa52baad4f9Alexandre Chartre * identify is a DVD.
11f54b6e45feb2d8f72622727a377aa52baad4f9Alexandre Chartre */
11f54b6e45feb2d8f72622727a377aa52baad4f9Alexandre Chartre#define DK_MEDIA_OPTICAL_MAX 0xFFFF
11f54b6e45feb2d8f72622727a377aa52baad4f9Alexandre Chartre
17cadca83cc82e37ff517ea2783eb4bfcc07b950lm#define DK_MEDIATYPE2VD_MEDIATYPE(mt) \
11f54b6e45feb2d8f72622727a377aa52baad4f9Alexandre Chartre (((mt) > DK_MEDIA_OPTICAL_MAX)? VD_MEDIA_FIXED : \
11f54b6e45feb2d8f72622727a377aa52baad4f9Alexandre Chartre (mt) == DK_REMOVABLE_DISK ? VD_MEDIA_FIXED : \
17cadca83cc82e37ff517ea2783eb4bfcc07b950lm (mt) == DK_MO_ERASABLE ? VD_MEDIA_FIXED : \
17cadca83cc82e37ff517ea2783eb4bfcc07b950lm (mt) == DK_MO_WRITEONCE ? VD_MEDIA_FIXED : \
17cadca83cc82e37ff517ea2783eb4bfcc07b950lm (mt) == DK_AS_MO ? VD_MEDIA_FIXED : \
17cadca83cc82e37ff517ea2783eb4bfcc07b950lm (mt) == DK_CDROM ? VD_MEDIA_CD : \
17cadca83cc82e37ff517ea2783eb4bfcc07b950lm (mt) == DK_CDR ? VD_MEDIA_CD : \
17cadca83cc82e37ff517ea2783eb4bfcc07b950lm (mt) == DK_CDRW ? VD_MEDIA_CD : \
11f54b6e45feb2d8f72622727a377aa52baad4f9Alexandre Chartre VD_MEDIA_DVD)
17cadca83cc82e37ff517ea2783eb4bfcc07b950lm
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan/*
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan * Hooks for EFI support
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan */
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan/*
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan * The EFI alloc_and_read() function will use some ioctls to get EFI data
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan * but the device reference we will use is different depending if the command
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan * is issued from the vDisk server side (vds) or from the vDisk client side
edcc07547a39d6570197493a9836083bd6b2a197achartre * (vdc). The vd_efi_dev structure is filled by vdc/vds to indicate the ioctl
edcc07547a39d6570197493a9836083bd6b2a197achartre * function to call back and to provide information about the virtual disk.
edcc07547a39d6570197493a9836083bd6b2a197achartre */
edcc07547a39d6570197493a9836083bd6b2a197achartretypedef int (*vd_efi_ioctl_func)(void *, int, uintptr_t);
edcc07547a39d6570197493a9836083bd6b2a197achartre
edcc07547a39d6570197493a9836083bd6b2a197achartretypedef struct vd_efi_dev {
edcc07547a39d6570197493a9836083bd6b2a197achartre void *vdisk; /* opaque pointer to the vdisk */
edcc07547a39d6570197493a9836083bd6b2a197achartre size_t block_size; /* vdisk block size */
edcc07547a39d6570197493a9836083bd6b2a197achartre size_t disk_size; /* vdisk size in blocks */
edcc07547a39d6570197493a9836083bd6b2a197achartre vd_efi_ioctl_func vdisk_ioctl; /* vdisk ioctl function */
edcc07547a39d6570197493a9836083bd6b2a197achartre} vd_efi_dev_t;
edcc07547a39d6570197493a9836083bd6b2a197achartre
65908c77dfc02644236ba18bffe67b5ed6f23135yu, larry liu - Sun Microsystems - Beijing China#define VDSK_EFI_DEV_SET(efi_dev, vdsk, ioctl, bsize, dsize) \
65908c77dfc02644236ba18bffe67b5ed6f23135yu, larry liu - Sun Microsystems - Beijing China (efi_dev).vdisk = vdsk; \
65908c77dfc02644236ba18bffe67b5ed6f23135yu, larry liu - Sun Microsystems - Beijing China (efi_dev).vdisk_ioctl = ioctl; \
65908c77dfc02644236ba18bffe67b5ed6f23135yu, larry liu - Sun Microsystems - Beijing China (efi_dev).block_size = bsize; \
65908c77dfc02644236ba18bffe67b5ed6f23135yu, larry liu - Sun Microsystems - Beijing China (efi_dev).disk_size = dsize;
edcc07547a39d6570197493a9836083bd6b2a197achartre
edcc07547a39d6570197493a9836083bd6b2a197achartre
edcc07547a39d6570197493a9836083bd6b2a197achartreint vd_efi_alloc_and_read(vd_efi_dev_t *dev, efi_gpt_t **gpt, efi_gpe_t **gpe);
edcc07547a39d6570197493a9836083bd6b2a197achartrevoid vd_efi_free(vd_efi_dev_t *dev, efi_gpt_t *gpt, efi_gpe_t *gpe);
4bac220845f606f60663ed6f3a2b88caa00ae87enarayan
366a92acff1608754cee271ee6b74357c2891fdflm/*
366a92acff1608754cee271ee6b74357c2891fdflm * Macros to update the I/O statistics kstat consumed by iostat(1m).
366a92acff1608754cee271ee6b74357c2891fdflm */
366a92acff1608754cee271ee6b74357c2891fdflm
366a92acff1608754cee271ee6b74357c2891fdflm/*
366a92acff1608754cee271ee6b74357c2891fdflm * Given a pointer to the instance private data of a vDisk driver (vd),
366a92acff1608754cee271ee6b74357c2891fdflm * the type of operation and the number of bytes read/written, this macro
366a92acff1608754cee271ee6b74357c2891fdflm * updates the I/O statistics in the kstat.
366a92acff1608754cee271ee6b74357c2891fdflm */
366a92acff1608754cee271ee6b74357c2891fdflm#define VD_UPDATE_IO_STATS(vd, op, len) \
366a92acff1608754cee271ee6b74357c2891fdflm { \
366a92acff1608754cee271ee6b74357c2891fdflm ASSERT((vd) != NULL); \
366a92acff1608754cee271ee6b74357c2891fdflm ASSERT(MUTEX_HELD(&(vd)->lock)); \
366a92acff1608754cee271ee6b74357c2891fdflm ASSERT(((op) == VD_OP_BREAD) || ((op) == VD_OP_BWRITE));\
366a92acff1608754cee271ee6b74357c2891fdflm if ((vd)->io_stats != NULL) { \
366a92acff1608754cee271ee6b74357c2891fdflm kstat_io_t *kip = KSTAT_IO_PTR((vd)->io_stats); \
366a92acff1608754cee271ee6b74357c2891fdflm if ((op) == VD_OP_BREAD) { \
366a92acff1608754cee271ee6b74357c2891fdflm kip->reads++; \
366a92acff1608754cee271ee6b74357c2891fdflm kip->nread += (len); \
366a92acff1608754cee271ee6b74357c2891fdflm } else { \
366a92acff1608754cee271ee6b74357c2891fdflm kip->writes++; \
366a92acff1608754cee271ee6b74357c2891fdflm kip->nwritten += (len); \
366a92acff1608754cee271ee6b74357c2891fdflm } \
366a92acff1608754cee271ee6b74357c2891fdflm } \
366a92acff1608754cee271ee6b74357c2891fdflm }
366a92acff1608754cee271ee6b74357c2891fdflm
366a92acff1608754cee271ee6b74357c2891fdflm/*
366a92acff1608754cee271ee6b74357c2891fdflm * These wrapper macros take a pointer to the I/O statistics kstat and
366a92acff1608754cee271ee6b74357c2891fdflm * update the queue length statistics. These are 'safe' wrappers which
366a92acff1608754cee271ee6b74357c2891fdflm * check to see if the kstat was created when the vDisk instance was
366a92acff1608754cee271ee6b74357c2891fdflm * added (i.e. is not NULL).
366a92acff1608754cee271ee6b74357c2891fdflm */
90e2f9dc8deb72bb1a3fb2e78d39aff80aa005b5lm#define VD_KSTAT_WAITQ_ENTER(vd) \
90e2f9dc8deb72bb1a3fb2e78d39aff80aa005b5lm if ((vd)->io_stats != NULL) { \
90e2f9dc8deb72bb1a3fb2e78d39aff80aa005b5lm ASSERT(MUTEX_HELD(&(vd)->lock)); \
90e2f9dc8deb72bb1a3fb2e78d39aff80aa005b5lm kstat_waitq_enter(KSTAT_IO_PTR((vd)->io_stats)); \
366a92acff1608754cee271ee6b74357c2891fdflm }
366a92acff1608754cee271ee6b74357c2891fdflm
90e2f9dc8deb72bb1a3fb2e78d39aff80aa005b5lm#define VD_KSTAT_WAITQ_EXIT(vd) \
90e2f9dc8deb72bb1a3fb2e78d39aff80aa005b5lm if ((vd)->io_stats != NULL) { \
90e2f9dc8deb72bb1a3fb2e78d39aff80aa005b5lm ASSERT(MUTEX_HELD(&(vd)->lock)); \
90e2f9dc8deb72bb1a3fb2e78d39aff80aa005b5lm kstat_waitq_exit(KSTAT_IO_PTR((vd)->io_stats)); \
366a92acff1608754cee271ee6b74357c2891fdflm }
366a92acff1608754cee271ee6b74357c2891fdflm
90e2f9dc8deb72bb1a3fb2e78d39aff80aa005b5lm#define VD_KSTAT_WAITQ_TO_RUNQ(vd) \
90e2f9dc8deb72bb1a3fb2e78d39aff80aa005b5lm if ((vd)->io_stats != NULL) { \
90e2f9dc8deb72bb1a3fb2e78d39aff80aa005b5lm ASSERT(MUTEX_HELD(&(vd)->lock)); \
90e2f9dc8deb72bb1a3fb2e78d39aff80aa005b5lm kstat_waitq_to_runq(KSTAT_IO_PTR((vd)->io_stats)); \
366a92acff1608754cee271ee6b74357c2891fdflm }
366a92acff1608754cee271ee6b74357c2891fdflm
ca6d128098b8e877673c13a3db1a0d3417ce5879Alexandre Chartre#define VD_KSTAT_RUNQ_BACK_TO_WAITQ(vd) \
ca6d128098b8e877673c13a3db1a0d3417ce5879Alexandre Chartre if ((vd)->io_stats != NULL) { \
ca6d128098b8e877673c13a3db1a0d3417ce5879Alexandre Chartre ASSERT(MUTEX_HELD(&(vd)->lock)); \
ca6d128098b8e877673c13a3db1a0d3417ce5879Alexandre Chartre kstat_runq_back_to_waitq(KSTAT_IO_PTR((vd)->io_stats)); \
ca6d128098b8e877673c13a3db1a0d3417ce5879Alexandre Chartre }
ca6d128098b8e877673c13a3db1a0d3417ce5879Alexandre Chartre
90e2f9dc8deb72bb1a3fb2e78d39aff80aa005b5lm#define VD_KSTAT_RUNQ_ENTER(vd) \
90e2f9dc8deb72bb1a3fb2e78d39aff80aa005b5lm if ((vd)->io_stats != NULL) { \
90e2f9dc8deb72bb1a3fb2e78d39aff80aa005b5lm ASSERT(MUTEX_HELD(&(vd)->lock)); \
90e2f9dc8deb72bb1a3fb2e78d39aff80aa005b5lm kstat_runq_enter(KSTAT_IO_PTR((vd)->io_stats)); \
366a92acff1608754cee271ee6b74357c2891fdflm }
366a92acff1608754cee271ee6b74357c2891fdflm
90e2f9dc8deb72bb1a3fb2e78d39aff80aa005b5lm#define VD_KSTAT_RUNQ_EXIT(vd) \
90e2f9dc8deb72bb1a3fb2e78d39aff80aa005b5lm if ((vd)->io_stats != NULL) { \
90e2f9dc8deb72bb1a3fb2e78d39aff80aa005b5lm ASSERT(MUTEX_HELD(&(vd)->lock)); \
90e2f9dc8deb72bb1a3fb2e78d39aff80aa005b5lm kstat_runq_exit(KSTAT_IO_PTR((vd)->io_stats)); \
366a92acff1608754cee271ee6b74357c2891fdflm }
366a92acff1608754cee271ee6b74357c2891fdflm
366a92acff1608754cee271ee6b74357c2891fdflm/*
366a92acff1608754cee271ee6b74357c2891fdflm * Given a pointer to the instance private data of a vDisk driver (vd) and
366a92acff1608754cee271ee6b74357c2891fdflm * the name of the error stats entry we wish to update, increment that value
366a92acff1608754cee271ee6b74357c2891fdflm */
366a92acff1608754cee271ee6b74357c2891fdflm#define VD_UPDATE_ERR_STATS(vd, stat_entry) \
366a92acff1608754cee271ee6b74357c2891fdflm{ \
366a92acff1608754cee271ee6b74357c2891fdflm ASSERT((vd) != NULL); \
366a92acff1608754cee271ee6b74357c2891fdflm ASSERT(MUTEX_HELD(&(vd)->lock)); \
366a92acff1608754cee271ee6b74357c2891fdflm if ((vd)->err_stats != NULL) { \
366a92acff1608754cee271ee6b74357c2891fdflm vd_err_stats_t *stp; \
366a92acff1608754cee271ee6b74357c2891fdflm stp = (vd_err_stats_t *)(vd)->err_stats->ks_data; \
366a92acff1608754cee271ee6b74357c2891fdflm stp->stat_entry.value.ui32++; \
366a92acff1608754cee271ee6b74357c2891fdflm } \
366a92acff1608754cee271ee6b74357c2891fdflm}
366a92acff1608754cee271ee6b74357c2891fdflm
366a92acff1608754cee271ee6b74357c2891fdflm/* Structure to record vDisk error statistics */
366a92acff1608754cee271ee6b74357c2891fdflmtypedef struct vd_err_stats {
366a92acff1608754cee271ee6b74357c2891fdflm struct kstat_named vd_softerrs; /* Softerrs */
366a92acff1608754cee271ee6b74357c2891fdflm struct kstat_named vd_transerrs; /* Transport errs */
366a92acff1608754cee271ee6b74357c2891fdflm struct kstat_named vd_protoerrs; /* VIO Protocol errs */
366a92acff1608754cee271ee6b74357c2891fdflm struct kstat_named vd_vid; /* Vendor ID */
366a92acff1608754cee271ee6b74357c2891fdflm struct kstat_named vd_pid; /* Product ID */
366a92acff1608754cee271ee6b74357c2891fdflm struct kstat_named vd_capacity; /* Capacity of the disk */
366a92acff1608754cee271ee6b74357c2891fdflm} vd_err_stats_t;
366a92acff1608754cee271ee6b74357c2891fdflm
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#ifdef __cplusplus
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo}
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#endif
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo
1ae0874509b6811fdde1dfd46f0d93fd09867a3fheppo#endif /* _VDSK_COMMON_H */