Print this page
10517 Convert dkio(7I) to mandoc

Split Close
Expand all
Collapse all
          --- old/usr/src/man/man7i/dkio.7i.man.txt
          +++ new/usr/src/man/man7i/dkio.7i.man.txt
   1    1  DKIO(7I)                        Ioctl Requests                        DKIO(7I)
   2    2  
   3      -
   4      -
   5    3  NAME
   6      -       dkio - disk control operations
        4 +     dkio - disk control operations
   7    5  
   8    6  SYNOPSIS
   9      -       #include <sys/dkio.h>
  10      -       #include <sys/vtoc.h>
        7 +     #include <sys/dkio.h>
        8 +     #include <sys/vtoc.h>
  11    9  
  12      -
  13      -
  14      -
  15      -
  16   10  DESCRIPTION
  17      -       Disk drivers support a set of ioctl(2) requests for disk controller,
  18      -       geometry, and partition information. Basic to these ioctl() requests
  19      -       are the definitions in <sys/dkio.h>.
       11 +     Disk drivers support a set of ioctl(2) requests for disk controller,
       12 +     geometry, and partition information.  Basic to these ioctl(2) requests
       13 +     are the definitions in <sys/dkio.h>.
  20   14  
  21   15  IOCTLS
  22      -       The following ioctl() requests set and/or retrieve the current disk
  23      -       controller, partitions, or geometry information on all architectures:
       16 +     The following ioctl(2) requests set and/or retrieve the current disk
       17 +     controller, partitions, or geometry information on all architectures:
  24   18  
  25      -       DKIOCINFO
       19 +     DKIOCINFO
  26   20  
  27      -           The argument is a pointer to a dk_cinfo structure (described
  28      -           below). This structure tells the controller-type and attributes
  29      -           regarding bad-block processing done on the controller.
       21 +        The argument is a pointer to a dk_cinfo structure (described below).
       22 +        This structure tells the controller-type and attributes regarding bad-
       23 +        block processing done on the controller.
  30   24  
       25 +          /*
       26 +           * Structures and definitions for disk I/O control commands
       27 +           */
       28 +          #define DK_DEVLEN 16   /* device name max length, */
       29 +                                 /* including unit # and NULL */
  31   30  
  32      -         /*
  33      -          * Structures and definitions for disk I/O control commands
  34      -          */
  35      -         #define DK_DEVLEN 16   /* device name max length, */
  36      -                                /* including unit # and NULL */
  37      -                                /* Used for controller info */
  38      -         struct dk_cinfo {
  39      -              char      dki_cname[DK_DEVLEN];    /* controller name */
  40      -                                                 /* (no unit #) */
  41      -              ushort_t  dki_ctype;               /* controller type */
  42      -              ushort_t  dki_flags;               /* flags */
  43      -              ushort_t  dki_cnum;                /* controller number */
  44      -              uint_t    dki_addr;                /* controller address */
  45      -              uint_t    dki_space;               /* controller bus type */
  46      -              uint_t    dki_prio;                /* interrupt priority */
  47      -              uint_t    dki_vec;                 /* interrupt vector */
  48      -              char      dki_dname[DK_DEVLEN];    /* drive name (no unit #) */
  49      -              uint_t    dki_unit;                /* unit number */
  50      -              uint_t    dki_slave;               /* slave number */
  51      -              ushort_t  dki_partition;           /* partition number */
  52      -              ushort_t  dki_maxtransfer;         /* maximum transfer size */
  53      -                                                 /* in DEV_BSIZE */
       31 +          /* Used for controller info */
       32 +          struct dk_cinfo {
       33 +               char      dki_cname[DK_DEVLEN];    /* controller name */
       34 +                                                  /* (no unit #) */
       35 +               ushort_t  dki_ctype;               /* controller type */
       36 +               ushort_t  dki_flags;               /* flags */
       37 +               ushort_t  dki_cnum;                /* controller number */
       38 +               uint_t    dki_addr;                /* controller address */
       39 +               uint_t    dki_space;               /* controller bus type */
       40 +               uint_t    dki_prio;                /* interrupt priority */
       41 +               uint_t    dki_vec;                 /* interrupt vector */
       42 +               char      dki_dname[DK_DEVLEN];    /* drive name (no unit #) */
       43 +               uint_t    dki_unit;                /* unit number */
       44 +               uint_t    dki_slave;               /* slave number */
       45 +               ushort_t  dki_partition;           /* partition number */
       46 +               ushort_t  dki_maxtransfer;         /* maximum transfer size */
       47 +                                                  /* in DEV_BSIZE */
       48 +               };
  54   49  
  55      -              };
  56      -              /*
  57      -               * Controller types
  58      -               */
       50 +               /*
       51 +                * Controller types
       52 +                */
       53 +               #define DKC_UNKNOWN      0
       54 +               #define DKC_CDROM        1         /* CD-ROM, SCSI or other */
       55 +               #define DKC_WDC2880      2
       56 +               #define DKC_XXX_0        3         /* unassigned */
       57 +               #define DKC_XXX_1        4         /* unassigned */
       58 +               #define DKC_DSD5215      5
       59 +               #define DKC_ACB4000      7
       60 +               #define DKC_XXX_2        9         /* unassigned */
       61 +               #define DKC_NCRFLOPPY    10
       62 +               #define DKC_SMSFLOPPY    12
       63 +               #define DKC_SCSI_CCS     13        /* SCSI CCS compatible */
       64 +               #define DKC_INTEL82072   14        /* native floppy chip */
       65 +               #define DKC_INTEL82077   19        /* 82077 floppy disk */
       66 +                                                  /* controller */
       67 +               #define DKC_DIRECT       20        /* Intel direct attached */
       68 +                                                  /* device (IDE) */
       69 +               #define DKC_PCMCIA_MEM   21        /* PCMCIA memory disk-like */
       70 +                                                  /* type */
       71 +               #define DKC_PCMCIA_ATA   22        /* PCMCIA AT Attached type */
  59   72  
  60      -              #define DKC_UNKNOWN      0
  61      -              #define DKC_CDROM        1         /* CD-ROM, SCSI or other */
  62      -              #define DKC_WDC2880      2
  63      -              #define DKC_XXX_0        3         /* unassigned */
  64      -              #define DKC_XXX_1        4         /* unassigned */
  65      -              #define DKC_DSD5215      5
  66      -              #define DKC_ACB4000      7
  67      -              #define DKC_XXX_2        9         /* unassigned */
  68      -              #define DKC_NCRFLOPPY    10
  69      -              #define DKC_SMSFLOPPY    12
  70      -              #define DKC_SCSI_CCS     13        /* SCSI CCS compatible */
  71      -              #define DKC_INTEL82072   14        /* native floppy chip */
  72      -              #define DKC_INTEL82077   19        /* 82077 floppy disk */
  73      -                                                 /* controller */
  74      -              #define DKC_DIRECT       20        /* Intel direct attached */
  75      -                                                 /* device (IDE) */
  76      -              #define DKC_PCMCIA_MEM   21        /* PCMCIA memory disk-like */
  77      -                                                 /* type */
  78      -              #define DKC_PCMCIA_ATA   22        /* PCMCIA AT Attached type */
       73 +               /*
       74 +                * Sun reserves up through 1023
       75 +                */
  79   76  
  80      -              /*
  81      -               * Sun reserves up through 1023
  82      -               */
       77 +               #define DKC_CUSTOMER_BASE  1024
  83   78  
  84      -              #define DKC_CUSTOMER_BASE  1024
       79 +               /*
       80 +                * Flags
       81 +                */
       82 +               #define DKI_BAD144       0x01          /* use  DEC  std  144  */
       83 +                                                      /* bad  sector fwding */
       84 +               #define DKI_MAPTRK       0x02          /* controller does */
       85 +                                                      /* track mapping */
       86 +               #define DKI_FMTTRK       0x04          /* formats only  full
       87 +                                                      /* track at a time */
       88 +               #define DKI_FMTVOL       0x08          /* formats only full */
       89 +                                                      /* volume at a time */
       90 +               #define DKI_FMTCYL       0x10          /* formats only full */
       91 +                                                      /* cylinders at a time */
       92 +               #define DKI_HEXUNIT      0x20          /* unit number printed */
       93 +                                                      /* as 3 hexdigits */
       94 +               #define DKI_PCMCIA_PFD   0x40          /* PCMCIA pseudo-floppy */
       95 +                                                      /* memory card */
  85   96  
  86      -              /*
  87      -               * Flags
  88      -               */
       97 +     DKIOCGAPART
  89   98  
  90      -              #define DKI_BAD144       0x01          /* use  DEC  std  144  */
  91      -                                                     /* bad  sector fwding */
  92      -              #define DKI_MAPTRK       0x02          /* controller does */
  93      -                                                     /* track mapping */
  94      -              #define DKI_FMTTRK       0x04          /* formats only  full
  95      -                                                     /* track at a time*/
  96      -              #define DKI_FMTVOL       0x08          /* formats only full */
  97      -                                                     /* volume at a time*/
  98      -              #define DKI_FMTCYL       0x10          /* formats only full */
  99      -                                                     /* cylinders at a time*/
 100      -              #define DKI_HEXUNIT      0x20          /* unit number printed as */
 101      -                                                     /* 3 hexdigits */
 102      -              #define DKI_PCMCIA_PFD   0x40          /* PCMCIA pseudo-floppy */
 103      -                                                     /* memory card */
       99 +        The argument is a pointer to a dk_allmap structure (described below).
      100 +        This ioctl(2) gets the controller's notion of the current partition
      101 +        table for disk drive.
 104  102  
      103 +     DKIOCSAPART
 105  104  
 106      -       DKIOCGAPART
      105 +        The argument is a pointer to a dk_allmap structure (described below).
      106 +        This ioctl(2) sets the controller's notion of the partition table
      107 +        without changing the disk itself.
 107  108  
 108      -           The argument is a pointer to a dk_allmap structure (described
 109      -           below).  This ioctl() gets the controller's notion of the current
 110      -           partition table for disk drive.
      109 +          /*
      110 +           * Partition map (part of dk_label)
      111 +           */
      112 +          struct dk_map {
      113 +               daddr_t dkl_cylno;     /* starting cylinder */
      114 +               daddr_t dkl_nblk;      /* number of blocks */
      115 +          };
 111  116  
      117 +          /*
      118 +           * Used for all partitions
      119 +           */
      120 +          struct dk_allmap {
      121 +              struct dk_map    dka_map[NDKMAP];
      122 +          };
 112  123  
 113      -       DKIOCSAPART
      124 +     DKIOCGGEOM
 114  125  
 115      -           The argument is a pointer to a dk_allmap structure (described
 116      -           below).  This ioctl() sets the controller's notion of the partition
 117      -           table without changing the disk itself.
      126 +        The argument is a pointer to a dk_geom structure (described below).
      127 +        This ioctl(2) gets the controller's notion of the current geometry of
      128 +        the disk drive.
 118  129  
      130 +     DKIOCSGEOM
 119  131  
 120      -         /*
 121      -          * Partition map (part of dk_label)
 122      -          */ struct dk_map {
 123      -              daddr_t dkl_cylno;     /* starting cylinder */
 124      -              daddr_t dkl_nblk;      /* number of blocks */
 125      -              };
 126      -         /*
 127      -          * Used for all partitions
 128      -          */
 129      -         struct dk_allmap {
 130      -             struct dk_map    dka_map[NDKMAP];
 131      -         };
      132 +        The argument is a pointer to a dk_geom structure (described below).
      133 +        This ioctl(2) sets the controller's notion of the geometry without
      134 +        changing the disk itself.
 132  135  
      136 +     DKIOCGVTOC
 133  137  
 134      -       DKIOCGGEOM
 135      -                     The argument is a pointer to a dk_geom structure
 136      -                     (described below). This ioctl() gets the controller's
 137      -                     notion of the current geometry of the disk drive.
      138 +        The argument is a pointer to a vtoc structure (described below).  This
      139 +        ioctl(2) returns the device's current volume table of contents (VTOC).
      140 +        For disks larger than 1TB, DKIOCGEXTVTOC must be used instead.
 138  141  
      142 +     DKIOCSVTOC
 139  143  
 140      -       DKIOCSGEOM
 141      -                     The argument is a pointer to a dk_geom structure
 142      -                     (described below). This ioctl() sets the controller's
 143      -                     notion of the geometry without changing the disk itself.
      144 +        The argument is a pointer to a vtoc structure (described below).  This
      145 +        ioctl(2) changes the VTOC associated with the device.  For disks
      146 +        larger than 1TB, DKIOCSEXTVTOC must be used instead.
 144  147  
      148 +          struct partition {
      149 +              ushort_t      p_tag;         /* ID tag of partition */
      150 +              ushort_t      p_flag;        /* permission flags */
      151 +              daddr_t       p_start;       /* start sector of partition */
      152 +              long          p_size;        /* # of blocks in partition */
      153 +          };
 145  154  
 146      -       DKIOCGVTOC
 147      -                     The argument is a pointer to a vtoc structure (described
 148      -                     below). This ioctl() returns the device's current volume
 149      -                     table of contents (VTOC.) For disks larger than 1TB,
 150      -                     DKIOCGEXTVTOC must be used instead.
      155 +        If DKIOCSVTOC is used with a floppy diskette, the p_start field must
      156 +        be the first sector of a cylinder.  To compute the number of sectors
      157 +        per cylinder, multiply the number of heads by the number of sectors
      158 +        per track.
 151  159  
      160 +          struct vtoc {
      161 +              unsigned long     v_bootinfo[3];        /* info needed by mboot */
      162 +                                                      /* (unsupported) */
      163 +              unsigned long     v_sanity;             /* to verify vtoc */
      164 +                                                      /* sanity */
      165 +              unsigned long     v_version;            /* layout version */
      166 +              char              v_volume[LEN_DKL_VVOL]; /* volume name */
      167 +              ushort_t          v_sectorsz;           /* sector size in bytes */
      168 +              ushort_t          v_nparts;             /* number of partitions */
      169 +              unsigned long     v_reserved[10];       /* free space */
      170 +              struct partition  v_part[V_NUMPAR];     /* partition headers */
      171 +              time_t            timestamp[V_NUMPAR];  /* partition timestamp */
      172 +                                                      /* (unsupported) */
      173 +              char              v_asciilabel[LEN_DKL_ASCII]; /* compatibility */
      174 +          };
 152  175  
 153      -       DKIOCSVTOC
 154      -                     The argument is a pointer to a vtoc structure (described
 155      -                     below). This ioctl() changes the VTOC associated with the
 156      -                     device. For disks larger than 1TB, DKIOCSEXTVTOC must be
 157      -                     used instead.
      176 +          /*
      177 +           * Partition permission flags
      178 +           */
      179 +          #define V_UNMNT      0x01    /* Unmountable partition */
      180 +          #define V_RONLY      0x10    /* Read only */
 158  181  
      182 +          /*
      183 +           * Partition identification tags
      184 +           */
      185 +          #define V_UNASSIGNED   0x00  /* unassigned partition */
      186 +          #define V_BOOT         0x01  /* Boot partition */
      187 +          #define V_ROOT         0x02  /* Root filesystem */
      188 +          #define V_SWAP         0x03  /* Swap filesystem */
      189 +          #define V_USR          0x04  /* Usr filesystem */
      190 +          #define V_BACKUP       0x05  /* full disk */
      191 +          #define V_VAR          0x07  /* Var partition */
      192 +          #define V_HOME         0x08  /* Home partition */
      193 +          #define V_ALTSCTR      0x09  /* Alternate sector partition */
 159  194  
 160      -         struct partition {
 161      -         ushort_t      p_tag;         /* ID tag of partition */
 162      -         ushort_t      p_flag;        /* permission flags */
 163      -         daddr_t       p_start;       /* start sector of partition */
 164      -         long          p_size;        /* # of blocks in partition */
 165      -         };
      195 +     DKIOCGEXTVTOC
 166  196  
      197 +        The argument is a pointer to an extvtoc structure (described below).
      198 +        This ioctl returns the device's current volume table of contents
      199 +        (VTOC).  VTOC is extended to support a disk up to 2TB in size.  For
      200 +        disks larger than 1TB this ioctl must be used instead of DKIOCGVTOC.
 167  201  
      202 +     DKIOCSEXTVTOC
 168  203  
 169      -       If DKIOCSVTOC is used with a floppy diskette, the p_start field must be
 170      -       the first sector of a cylinder. To compute the number of sectors per
 171      -       cylinder, multiply the number of heads by the number of sectors per
 172      -       track.
      204 +        The argument is a pointer to an extvtoc structure (described below).
      205 +        This ioctl changes the VTOC associated with the device.  VTOC is
      206 +        extended to support a disk up to 2TB in size.  For disks larger than
      207 +        1TB this ioctl must be used instead of DKIOCSVTOC.
 173  208  
 174      -         struct vtoc {
 175      -         unsigned long     v_bootinfo[3];               /* info needed by mboot
 176      -                                                        /* (unsupported)*/
 177      -         unsigned long     v_sanity;                    /* to verify vtoc */
 178      -                                                        /* sanity */
 179      -         unsigned long     v_version;                   /* layout version */
 180      -         char              v_volume[LEN_DKL_VVOL];      /* volume name */
 181      -         ushort_t          v_sectorsz;                  /* sector size in bytes*/
 182      -         ushort_t          v_nparts;                    /* number of partitions*/
 183      -         unsigned long     v_reserved[10];              /* free space */
 184      -         struct partition  v_part[V_NUMPAR];            /* partition headers */
 185      -         time_t            timestamp[V_NUMPAR];         /* partition timestamp */
 186      -                                                        /* (unsupported) */
 187      -         char              v_asciilabel[LEN_DKL_ASCII]; /* compatibility */
 188      -         };
      209 +          struct extpartition {
      210 +              ushort_t p_tag;         /* ID tag of partition */
      211 +              ushort_t p_flag;        /* permission flags */
      212 +              ushort_t p_pad[2];      /* reserved */
      213 +              diskaddr_t p_start;     /* start sector no of partition */
      214 +              diskaddr_t p_size;      /* # of blocks in partition */
      215 +          };
 189  216  
 190      -         /*
 191      -         * Partition permission flags
 192      -         */
      217 +          struct extvtoc {
      218 +              uint64_t   v_bootinfo[3]; /* info needed by mboot (unsupported) */
      219 +              uint64_t   v_sanity;      /* to verify vtoc sanity */
      220 +              uint64_t   v_version;     /* layout version */
      221 +              char    v_volume[LEN_DKL_VVOL]; /* volume name */
      222 +              ushort_t   v_sectorsz;    /* sector size in bytes */
      223 +              ushort_t   v_nparts;      /* number of partitions */
      224 +              ushort_t   pad[2];
      225 +              uint64_t   v_reserved[10];
      226 +              struct extpartition v_part[V_NUMPAR]; /* partition headers */
      227 +              uint64_t timestamp[V_NUMPAR]; /* partition timestamp */
      228 +                                            /* (unsupported) */
      229 +              char    v_asciilabel[LEN_DKL_ASCII];    /* for compatibility */
      230 +          };
 193  231  
 194      -         #define V_UNMNT      0x01    /* Unmountable partition */
 195      -         #define V_RONLY      0x10    /* Read only */
      232 +        Partition permissions flags and identification tags are defined the
      233 +        same as vtoc structure.
 196  234  
 197      -         /*
 198      -         * Partition identification tags
 199      -         */
      235 +     DKIOCEJECT
 200  236  
 201      -         #define V_UNASSIGNED   0x00  /* unassigned partition */
 202      -         #define V_BOOT         0x01  /* Boot partition */
 203      -         #define V_ROOT         0x02  /* Root filesystem */
 204      -         #define V_SWAP         0x03  /* Swap filesystem */
 205      -         #define V_USR          0x04  /* Usr filesystem */
 206      -         #define V_BACKUP       0x05  /* full disk */
 207      -         #define V_VAR          0x07  /* Var partition */
 208      -         #define V_HOME         0x08  /* Home partition */
 209      -         #define V_ALTSCTR      0x09  /* Alternate sector partition */
      237 +        If the drive supports removable media, this ioctl(2) requests the disk
      238 +        drive to eject its disk.
 210  239  
      240 +     DKIOCREMOVABLE
 211  241  
 212      -       DKIOCGEXTVTOC
      242 +        The argument to this ioctl(2) is an integer.  After successful
      243 +        completion, this ioctl(2) sets that integer to a non-zero value if the
      244 +        drive in question has removable media.  If the media is not removable,
      245 +        the integer is set to 0.
 213  246  
 214      -           The argument is a pointer to an extvtoc structure (described
 215      -           below). This ioctl returns the device's current volume table of
 216      -           contents (VTOC). VTOC is extended to support a disk up to 2TB in
 217      -           size. For disks larger than 1TB this ioctl must be used instead of
 218      -           DKIOCGVTOC.
      247 +     DKIOCHOTPLUGGABLE
 219  248  
      249 +        The argument to this ioctl(2) is an integer.  After successful
      250 +        completion, this ioctl(2) sets that integer to a non-zero value if the
      251 +        drive in question is hotpluggable.  If the media is not hotpluggable,
      252 +        the integer is set to 0.
 220  253  
 221      -       DKIOCSEXTVTOC
      254 +     DKIOCSTATE
 222  255  
 223      -           The argument is a pointer to an extvtoc structure (described
 224      -           below). This ioctl changes the VTOC associated with the device.
 225      -           VTOC is extended to support a disk up to 2TB in size. For disks
 226      -           larger than 1TB this ioctl must be used instead of DKIOCSVTOC.
      256 +        This ioctl(2) blocks until the state of the drive, inserted or
      257 +        ejected, is changed.  The argument is a pointer to a dkio_state, enum,
      258 +        whose possible enumerations are listed below.  The initial value
      259 +        should be either the last reported state of the drive, or DKIO_NONE.
      260 +        Upon return, the enum pointed to by the argument is updated with the
      261 +        current state of the drive.
 227  262  
 228      -             struct extpartition {
 229      -             ushort_t p_tag;         /* ID tag of partition */
 230      -             ushort_t p_flag;        /* permission flags */
 231      -             ushort_t p_pad[2];       /* reserved */
 232      -             diskaddr_t p_start;      /* start sector no of partition */
 233      -             diskaddr_t p_size;       /* # of blocks in partition */
 234      -             };
      263 +          enum dkio_state {
      264 +              DKIO_NONE,          /* Return disk's current state */
      265 +              DKIO_EJECTED,       /* Disk state is 'ejected' */
      266 +              DKIO_INSERTED       /* Disk state is 'inserted' */
      267 +          };
 235  268  
      269 +     DKIOCLOCK
 236  270  
 237      -             struct extvtoc {
 238      -             uint64_t   v_bootinfo[3]; /* info needed by mboot (unsupported) */
 239      -             uint64_t   v_sanity;     /* to verify vtoc sanity */
 240      -             uint64_t   v_version;    /* layout version */
 241      -             char    v_volume[LEN_DKL_VVOL]; /* volume name */
 242      -             ushort_t   v_sectorsz;   /* sector size in bytes */
 243      -             ushort_t   v_nparts;     /* number of partitions */
 244      -             ushort_t   pad[2];
 245      -             uint64_t   v_reserved[10];
 246      -             struct extpartition v_part[V_NUMPAR]; /* partition headers */
 247      -             uint64_t timestamp[V_NUMPAR]; /* partition timestamp (unsupported)*/
 248      -             char    v_asciilabel[LEN_DKL_ASCII];    /* for compatibility */
 249      -             };
      271 +        For devices with removable media, this ioctl(2) requests the disk
      272 +        drive to lock the door.
 250  273  
 251      -             Partition permissions flags and identification tags
 252      -             are defined the same as vtoc structure.
      274 +     DKIOCUNLOCK
 253  275  
      276 +        For devices with removable media, this ioctl(2) requests the disk
      277 +        drive to unlock the door.
 254  278  
      279 +     DKIOCGMEDIAINFO
 255  280  
 256      -       DKIOCEJECT
      281 +        The argument to this ioctl(2) is a pointer to a dk_minfo structure.
      282 +        The structure indicates the type of media or the command set profile
      283 +        used by the drive to operate on the media.  The dk_minfo structure
      284 +        also indicates the logical media block size the drive uses as the
      285 +        basic unit block size of operation and the raw formatted capacity of
      286 +        the media in number of logical blocks.
 257  287  
 258      -           If the drive supports removable media, this ioctl() requests the
 259      -           disk drive to eject its disk.
      288 +     DKIOCGMEDIAINFOEXT
 260  289  
      290 +        The argument to this ioctl(2) is a pointer to a dk_minfo_ext
      291 +        structure.  The structure indicates the type of media or the command
      292 +        set profile used by the drive to operate on the media.  The
      293 +        dk_minfo_ext structure also indicates the logical media block size the
      294 +        drive uses as the basic unit block size of operation, the raw
      295 +        formatted capacity of the media in number of logical blocks and the
      296 +        physical block size of the media.
 261  297  
 262      -       DKIOCREMOVABLE
      298 +          /*
      299 +           * Used for media info or profile info
      300 +           */
      301 +          struct dk_minfo {
      302 +              uint_t dki_media_type;   /* Media type or profile info */
      303 +              uint_t dki_lbsize;       /* Logical blocksize of media */
      304 +              diskaddr_t dki_capacity; /* Capacity as # of dki_lbsize blks */
      305 +          };
 263  306  
 264      -           The argument to this ioctl() is an integer. After successful
 265      -           completion, this ioctl() sets that integer to a non-zero value if
 266      -           the drive in question has removable media. If the media is not
 267      -           removable, the integer is set to 0.
      307 +          /*
      308 +           * Used for media info or profile info and physical blocksize
      309 +           */
      310 +          struct dk_minfo_ext {
      311 +              uint_t dki_media_type; /* Media type or profile info */
      312 +              uint_t dki_lbsize; /* Logical blocksize of media */
      313 +              diskaddr_t dki_capacity; /* Capacity as # of dki_lbsize blks */
      314 +              uint_t dki_pbsize; /* Physical blocksize of media */
      315 +          };
 268  316  
 269  317  
 270      -       DKIOCHOTPLUGGABLE
      318 +          /*
      319 +           * Media types or profiles known
      320 +           */
      321 +          #define DK_UNKNOWN         0x00    /* Media inserted - type unknown */
 271  322  
 272      -           The argument to this ioctl() is an integer. After successful
 273      -           completion, this ioctl() sets that integer to a non-zero value if
 274      -           the drive in question is hotpluggable. If the media is not
 275      -           hotpluggable, the integer is set to 0.
      323 +          /*
      324 +           * SFF 8090 Specification Version 3, media types 0x01 - 0xfffe are
      325 +           * retained to maintain compatibility with SFF8090.  The following
      326 +           * define the optical media type.
      327 +           */
      328 +          #define DK_MO_ERASABLE     0x03 /* MO Erasable */
      329 +          #define DK_MO_WRITEONCE    0x04 /* MO Write once */
      330 +          #define DK_AS_MO           0x05 /* AS MO */
      331 +          #define DK_CDROM           0x08 /* CDROM */
      332 +          #define DK_CDR             0x09 /* CD-R */
      333 +          #define DK_CDRW            0x0A /* CD-RW */
      334 +          #define DK_DVDROM          0x10 /* DVD-ROM */
      335 +          #define DK_DVDR            0x11 /* DVD-R */
      336 +          #define DK_DVDRAM          0x12 /* DVD_RAM or DVD-RW */
 276  337  
      338 +          /*
      339 +           * Media types for other rewritable magnetic media
      340 +           */
      341 +          #define DK_FIXED_DISK      0x10001 /* Fixed disk SCSI or otherwise */
      342 +          #define DK_FLOPPY          0x10002 /* Floppy media */
      343 +          #define DK_ZIP             0x10003 /* IOMEGA ZIP media */
      344 +          #define DK_JAZ             0x10004 /* IOMEGA JAZ media */
 277  345  
 278      -       DKIOCSTATE
      346 +        If the media exists and the host can obtain a current profile list,
      347 +        the command succeeds and returns the dk_minfo structure with data
      348 +        representing that media.
 279  349  
 280      -           This ioctl() blocks until the state of the drive, inserted or
 281      -           ejected, is changed. The argument is a pointer to a dkio_state,
 282      -           enum, whose possible enumerations are listed below. The initial
 283      -           value should be either the last reported state of the drive, or
 284      -           DKIO_NONE. Upon return, the enum pointed to by the argument is
 285      -           updated with the current state of the drive.
      350 +        If there is no media in the drive, the command fails and the host
      351 +        returns an ENXIO error, indicating that it cannot gather the
      352 +        information requested.
 286  353  
 287      -             enum dkio_state {
 288      -             DKIO_NONE,          /* Return disk's current state */
 289      -             DKIO_EJECTED,       /* Disk state is 'ejected' */
 290      -             DKIO_INSERTED       /* Disk state is 'inserted' */
 291      -             };
      354 +        If the profile list is not available, the host attempts to identify
      355 +        the media-type based on the available information.
 292  356  
      357 +        If identification is not possible, the host returns media type
      358 +        DK_UNKNOWN.  See NOTES for blocksize usage and capacity information.
 293  359  
      360 +     DKIOCSMBOOT
 294  361  
 295      -       DKIOCLOCK
      362 +        The argument is a pointer to struct mboot.
 296  363  
 297      -           For devices with removable media, this ioctl() requests the disk
 298      -           drive to lock the door.
      364 +        Copies the mboot information supplied in the argument to the absolute
      365 +        sector 0 of the device.  Prior to copying the information, this
      366 +        ioctl(2) performs the following checks on the mboot data:
 299  367  
      368 +              o   Ensures that the signature field is set to 0xAA55.
 300  369  
 301      -       DKIOCUNLOCK
      370 +              o   Ensures that partitions do not overlap.
 302  371  
 303      -           For devices with removable media, this ioctl() requests the disk
 304      -           drive to unlock the door.
      372 +              o   On SPARC platforms, determines if the device is a removable
      373 +                  media.
 305  374  
      375 +        If the above verification fails, errno is set to EINVAL and the
      376 +        ioctl(2) command fails.
 306  377  
 307      -       DKIOCGMEDIAINFO
      378 +        x86 Platforms -- Upon successful write of mboot, the partition map
      379 +        structure maintained in the driver is updated.  If the new Solaris
      380 +        partition is different from the previous one, the internal VTOC table
      381 +        maintained in the driver is set as follows:
 308  382  
 309      -           The argument to this ioctl() is a pointer to a dk_minfo structure.
 310      -           The structure indicates the type of media or the command set
 311      -           profile used by the drive to operate on the media. The dk_minfo
 312      -           structure also indicates the logical media block size the drive
 313      -           uses as the basic unit block size of operation and the raw
 314      -           formatted capacity of the media in number of logical blocks.
      383 +        If _SUNOS_VTOC_8 is defined:
 315  384  
      385 +            Partition: 0 Start: 0 Capacity = Capacity of device.
      386 +            Partition: 2 Start: 0 Capacity = Capacity of device.
 316  387  
 317      -       DKIOCGMEDIAINFOEXT
      388 +        If _SUNOS_VTOC_16 is defined:
 318  389  
 319      -           The argument to this ioctl() is a pointer to a dk_minfo_ext
 320      -           structure. The structure indicates the type of media or the command
 321      -           set profile used by the drive to operate on the media. The
 322      -           dk_minfo_ext structure also indicates the logical media block size
 323      -           the drive uses as the basic unit block size of operation, the raw
 324      -           formatted capacity of the media in number of logical blocks and the
 325      -           physical block size of the media.
      390 +            Partition: 2 Start: 0 Size = Size specified in mboot - 2 cylinders.
      391 +            Partition: 8 Start: 0 Size = Sectors/cylinder.
      392 +            Partition: 9 Start: Sectors/cylinder  Size = 2 * sectors/cylinder
 326  393  
      394 +        To determine if the Solaris partition has changed:
 327  395  
 328      -         /*
 329      -         * Used for media info or profile info
 330      -         */
 331      -         struct dk_minfo {
 332      -         uint_t dki_media_type; /* Media type or profile info */
 333      -         uint_t dki_lbsize; /* Logical blocksize of media */
 334      -         diskaddr_t dki_capacity; /* Capacity as # of dki_lbsize blks */
 335      -         };
      396 +            If either offset or the size of the Solaris partition is different
      397 +            from the previous one then it shall be deemed to have changed.  In
      398 +            all other cases, the internal VTOC info remains as before.
 336  399  
 337      -         /*
 338      -         * Used for media info or profile info and physical blocksize
 339      -         */
 340      -         struct dk_minfo_ext {
 341      -         uint_t dki_media_type; /* Media type or profile info */
 342      -         uint_t dki_lbsize; /* Logical blocksize of media */
 343      -         diskaddr_t dki_capacity; /* Capacity as # of dki_lbsize blks */
 344      -         uint_t dki_pbsize; /* Physical blocksize of media */
 345      -         };
      400 +        SPARC Platforms -- The VTOC label and mboot both occupy the same
      401 +        location, namely sector 0.  As a result, following the successful
      402 +        write of mboot info, the internal VTOC table maintained in the driver
      403 +        is set as follows:
 346  404  
      405 +            Partition: 0  Start: 0  Size = Capacity of device.
      406 +            Partition: 2  Start: 0  Size = Capacity of device.
 347  407  
 348      -         /*
 349      -         * Media types or profiles known
 350      -         */
 351      -         #define DK_UNKNOWN         0x00    /* Media inserted - type unknown */
      408 +        See the NOTES section for usage of DKIOCSMBOOT when modifying Solaris
      409 +        partitions.
 352  410  
 353      -         /*
 354      -         * SFF 8090 Specification Version 3, media types 0x01 - 0xfffe are
 355      -         * retained to maintain compatibility with SFF8090.  The following
 356      -         * define the optical media type.
 357      -         */
 358      -         #define DK_MO_ERASABLE     0x03 /* MO Erasable */
 359      -         #define DK_MO_WRITEONCE    0x04 /* MO Write once */
 360      -         #define DK_AS_MO           0x05 /* AS MO */
 361      -         #define DK_CDROM           0x08 /* CDROM */
 362      -         #define DK_CDR             0x09 /* CD-R */
 363      -         #define DK_CDRW            0x0A /* CD-RW */
 364      -         #define DK_DVDROM          0x10 /* DVD-ROM */
 365      -         #define DK_DVDR            0x11 /* DVD-R */
 366      -         #define DK_DVDRAM          0x12 /* DVD_RAM or DVD-RW */
      411 +     DKIOCGETVOLCAP
 367  412  
 368      -         /*
 369      -         * Media types for other rewritable magnetic media
 370      -         */
 371      -         #define DK_FIXED_DISK      0x10001 /* Fixed disk SCSI or otherwise */
 372      -         #define DK_FLOPPY          0x10002 /* Floppy media */
 373      -         #define DK_ZIP             0x10003 /* IOMEGA ZIP media */
 374      -         #define DK_JAZ             0x10004 /* IOMEGA JAZ media */
      413 +        This ioctl provides information and status of available capabilities.
      414 +        vc_info is a bitmap and the valid flag values are:
 375  415  
      416 +          DKV_ABR_CAP  Capable of application-based recovery
      417 +          DKV_DMR_CAP  Ability to read specific copy of data when multiple
      418 +                       copies exist.  For example, in a two way mirror, this
      419 +                       ioctl is used to read each side of the mirror.
 376  420  
      421 +        vc_set is a bitmap and the valid flag values are:
 377  422  
 378      -       If the media exists and the host can obtain a current profile list, the
 379      -       command succeeds and returns the dk_minfo structure with data
 380      -       representing that media.
      423 +          DKV_ABR_CAP  This flag is set if ABR has been set on a device that
      424 +                       supports ABR functionality.
      425 +          DKV_DMR_CAP  Directed read has been enabled.
 381  426  
      427 +        These capabilities are not required to be persistent across a system
      428 +        reboot and their persistence depends upon the implementation.  For
      429 +        example, if the ABR capability for a DRL mirror simply clears the
      430 +        dirty-region list and subsequently stops updating this list, there is
      431 +        no reason for persistence because the VM recovery is a no-op.
      432 +        Conversely, if the ABR capability is applied to a non-DRL mirror to
      433 +        indicate that the VM should not perform a full recovery of the mirror
      434 +        following a system crash, the capability must be persistent so that
      435 +        the VM know whether or not to perform recovery.
 382  436  
 383      -       If there is no media in the drive, the command fails and the host
 384      -       returns an ENXIO error, indicating that it cannot gather the
 385      -       information requested.
      437 +        Return Errors:
 386  438  
      439 +          EINVAL   Invalid device for this operation.
      440 +          ENOTSUP  Functionality that is attempted to be set is not supported.
 387  441  
 388      -       If the profile list is not available, the host attempts to identify the
 389      -       media-type based on the available information.
      442 +     DKIOCSETVOLCAP
 390  443  
      444 +        This ioctl sets the available capabilities for the device.  If a
      445 +        capability flag is not set in vc_set, that capability is cleared.
 391  446  
 392      -       If identification is not possible, the host returns media type
 393      -       DK_UNKNOWN. See NOTES for blocksize usage and capacity information.
      447 +        vc_info flags are ignored.
 394  448  
 395      -       DKIOCSMBOOT
      449 +        vc_set valid flags are:
 396  450  
 397      -           The argument is a pointer to struct mboot.
      451 +          DKV_ABR_CAP  Flag to set application-based recovery.  A device can
      452 +                       successfully support ABR only if it is capable.
      453 +          DKV_DMR_CAP  Flag to set directed read.
 398  454  
 399      -           Copies the mboot information supplied in the argument to the
 400      -           absolute sector 0 of the device. Prior to copying the information,
 401      -           this ioctl() performs the following checks on the mboot data:
      455 +     DKIODMR
 402  456  
 403      -               o      Ensures that the signature field is set to 0xAA55.
      457 +        int ioctl(int, DKIODMR, vol_directed_rd *)
 404  458  
 405      -               o      Ensures that partitions do not overlap.
      459 +        This ioctl allows highly available applications to perform round-robin
      460 +        reads from the underlying devices of a replicated device.
 406  461  
 407      -               o      On SPARC platforms, determines if the device is a
 408      -                      removable media.
 409      -           If the above verification fails, errno is set to EINVAL and the
 410      -           ioctl() command fails.
      462 +          vdr_offset     Offset at which the read should occur.
      463 +          vdr_nbytes     Number of bytes to be read
      464 +          vdr_bytesread  Number of bytes successfully read by the kernel.
      465 +          vdr_data       Pointer to a user allocated buffer to return the data
      466 +                         read
      467 +          vdr_side       Side to be read.  Initialized to DKV_SIDE_INIT
      468 +          vdr_side_name  The volume name that has been read.
 411  469  
 412      -           x86 Platforms -- Upon successful write of mboot, the partition map
 413      -           structure maintained in the driver is updated. If the new Solaris
 414      -           partition is different from the previous one, the internal VTOC
 415      -           table maintained in the driver is set as follows:
      470 +        Valid vdr_flags are:
 416  471  
 417      -           If _SUNOS_VTOC_8 is defined:
      472 +          DKV_DMR_NEXT_SIDE  Set by user
      473 +          DKV_DMR_DONE       Return value
      474 +          DKV_DMR_ERROR      Return value
      475 +          DKV_DMR_SUCCESS    Return value
      476 +          DKV_DMR_SHORT      Return value
 418  477  
 419      -           Partition: 0. Start: 0. Capacity = Capacity of device.
      478 +        The calling sequence is as follows: The caller sets the vdr_flags to
      479 +        DK_DMR_NEXT_SIDE and vdr_side to DKV_SIDE_INIT at the start.
      480 +        Subsequent calls should be made without any changes to these values.
      481 +        If they are changed the results of the ioctl are indeterminate.
 420  482  
 421      -           Partition: 2. Start: 0. Capacity = Capacity of device.
      483 +        When DKV_SIDE_INIT is set, the call results in the kernel reading from
      484 +        the first side.  The kernel updates vdr_side to indicate the side that
      485 +        was read, and vdr_side_name to contain the name of that side.
      486 +        vdr_data contains the data that was read.  Therefore to perform a
      487 +        round-robin read all of the valid sides, there is no need for the
      488 +        caller to change the contents of vdr_side.
 422  489  
 423      -           If _SUNOS_VTOC_16 is defined:
      490 +        Subsequent ioctl(2) calls result in reads from the next valid side
      491 +        until all valid sides have been read.  On success, the kernel sets
      492 +        DKV_DMR_SUCCESS.  The following table shows the values of vdr_flags
      493 +        that are returned when an error occurs:
 424  494  
 425      -           Partition: 2. Start: 0. Size = Size specified in mboot - 2
 426      -           cylinders.
      495 +          vda_flags        vdr_side         Notes
      496 +          DKV_DMR_ERROR    DKV_SIDE_INIT    No valid side to read
      497 +          DKV_DMR_DONE     Not Init side    All valid sides read
      498 +          DKV_DMR_SHORT    Any value        Bytes requested cannot be read
      499 +                                            vdr_bytesread set to bytes
      500 +                                            actually read
      501 +        Typical code fragment:
 427  502  
 428      -           Partition: 8. Start: 0. Size = Sectors/cylinder.
      503 +          enable->vc_set |= DKV_ABR_SET;
      504 +          retval = ioctl(filedes, DKIOSETVOLCAP, enable);
      505 +          if (retval != EINVAL || retval != ENOTSUP) {
      506 +                  if (info->vc_set & DKV_DMR_SET) {
      507 +                          dr->vdr_flags |= DKV_DMR_NEXT_SIDE;
      508 +                          dr->vdr_side = DKV_SIDE_INIT;
      509 +                          dr->vdr_nbytes = 1024;
      510 +                          dr->vdr_offset = 0xff00;
      511 +                          do {
      512 +                                  rval = ioctl(fildes, DKIODMR, dr);
      513 +                                  if (rval != EINVAL) {
      514 +                                          /* Process data */
      515 +                                  }
      516 +                          } while (rval != EINVAL || dr->vdr_flags &
      517 +                              (DKV_DMR_DONE | DKV_DMR_ERROR | DKV_DMR_SHORT)
      518 +                  }
      519 +          }
 429  520  
 430      -           Partition: 9. Start: Sectors/cylinder. Size = 2 * sectors/cylinder
 431      -
 432      -           To determine if the Solaris partition has changed:
 433      -
 434      -           If either offset or the size of the Solaris partition is different
 435      -           from the previous one then it shall be deemed to have changed. In
 436      -           all other cases, the internal VTOC info remains as before.
 437      -
 438      -           SPARC Platforms -- The VTOC label and mboot both occupy the same
 439      -           location, namely sector 0. As a result, following the successful
 440      -           write of mboot info, the internal VTOC table maintained in the
 441      -           driver is set as follows:
 442      -
 443      -           Partition: 0. Start: 0. Size = Capacity of device.
 444      -
 445      -           Partition: 2. Start: 0. Size = Capacity of device.
 446      -
 447      -           See the NOTES section for usage of DKIOCSMBOOT when modifying
 448      -           Solaris partitions.
 449      -
 450      -
 451      -       DKIOCGETVOLCAP
 452      -
 453      -           This ioctl provides information and status of available
 454      -           capabilities.
 455      -
 456      -           vc_info is a bitmap and the valid flag values are:
 457      -
 458      -             DKV_ABR_CAP -  Capable of application-based recovery
 459      -             DKV_DMR_CAP -  Ability to read specific copy of data when
 460      -                            multiple copies exist. For example, in a two
 461      -                            way mirror, this ioctl is used to read each
 462      -                            side of the mirror.
 463      -
 464      -           vc_set is a bitmap and the valid flag values are:
 465      -
 466      -             DKV_ABR_CAP - This flag is set if ABR has been set on a device
 467      -                           that supports ABR functionality.
 468      -             DKV_DMR_CAP - Directed read has been enabled.
 469      -
 470      -           These capabilities are not required to be persistent across a
 471      -           system reboot and their persistence depends upon the
 472      -           implementation. For example, if the ABR capability for a DRL mirror
 473      -           simply clears the dirty-region list and subsequently stops updating
 474      -           this list, there is no reason for persistence because the VM
 475      -           recovery is a no-op. Conversely, if the ABR capability is applied
 476      -           to a non-DRL mirror to indicate that the VM should not perform a
 477      -           full recovery of the mirror following a system crash, the
 478      -           capability must be persistent so that the VM know whether or not to
 479      -           perform recovery.
 480      -
 481      -           Return Errors:
 482      -
 483      -           EINVAL
 484      -                      Invalid device for this operation.
 485      -
 486      -
 487      -           ENOTSUP
 488      -                      Functionality that is attempted to be set is not
 489      -                      supported.
 490      -
 491      -
 492      -
 493      -       DKIOCSETVOLCAP
 494      -
 495      -           This ioctl sets the available capabilities for the device. If a
 496      -           capability flag is not set in vc_set, that capability is cleared.
 497      -
 498      -           vc_info flags are ignored
 499      -
 500      -           vc_set valid flags are:
 501      -
 502      -             DKV_ABR_CAP - Flag to set application-based recovery. A device can
 503      -                           successfully support ABR only if it is capable.
 504      -             DKV_DMR_CAP - Flag to set directed read.
 505      -
 506      -
 507      -             int
 508      -             ioctl(int , DKIODMR, vol_directed_rd *);
 509      -
 510      -
 511      -
 512      -       DKIODMR
 513      -
 514      -           This ioctl allows highly available applications to perform round-
 515      -           robin reads from the underlying devices of a replicated device.
 516      -
 517      -             vdr_offset      - offset at which the read should occur.
 518      -             vdr_nbytes      - number of bytes to be read
 519      -             vdr_bytesread   - number of bytes successfully read by the kernel.
 520      -             vdr_data        - pointer to a user allocated buffer to return the
 521      -                               data read
 522      -             vdr_side        - side to be read. Initialized to DKV_SIDE_INIT
 523      -             vdr_side_name   - The volume name that has been read.
 524      -
 525      -             Valid vdr_flags are:
 526      -                   DKV_DMR_NEXT_SIDE (set by user)
 527      -                   DKV_DMR_DONE (return value)
 528      -                   DKV_DMR_ERROR (return value)
 529      -                   DKV_DMR_SUCCESS(return value)
 530      -                   DKV_DMR_SHORT(return value)
 531      -
 532      -           The calling sequence is as follows: The caller sets the vdr_flags
 533      -           to DK_DMR_NEXT_SIDE and vdr_side to DKV_SIDE_INIT at the start.
 534      -           Subsequent calls should be made without any changes to these
 535      -           values. If they are changed the results of the ioctl are
 536      -           indeterminate.
 537      -
 538      -           When DKV_SIDE_INIT is set, the call results in the kernel reading
 539      -           from the first side. The kernel updates vdr_side to indicate the
 540      -           side that was read, and vdr_side_name to contain the name of that
 541      -           side. vdr_data contains the data that was read. Therefore to
 542      -           perform a round-robin read all of the valid sides, there is no need
 543      -           for the caller to change the contents of vdr_side.
 544      -
 545      -           Subsequent ioctl calls result in reads from the next valid side
 546      -           until all valid sides have been read. On success, the kernel sets
 547      -           DKV_DMR_SUCCESS. The following table shows the values of vdr_flags
 548      -           that are returned when an error occurs:
 549      -
 550      -             vdr_flags    |   vdr_side        |       Notes
 551      -             -------------|-------------------|----------------------------
 552      -             DKV_DMR_ERROR|   DKV_SIDE_INIT   |   No valid side to read
 553      -             DKV_DMR_DONE |   Not Init side   |   All valid sides read
 554      -             DKV_DMR_SHORT|   Any value       |   Bytes requested cannot
 555      -                                                  be read. vdr_bytesread
 556      -                                                  set to bytes actually
 557      -                                                  read.
 558      -
 559      -
 560      -             Typical code fragment:
 561      -
 562      -             enable->vc_set |= DKV_ABR_SET;
 563      -             retval = ioctl(filedes, DKIOSETVOLCAP, enable);
 564      -             if (retval != EINVAL || retval != ENOTSUP) {
 565      -                     if (info->vc_set & DKV_DMR_SET) {
 566      -                             dr->vdr_flags |= DKV_DMR_NEXT_SIDE;
 567      -                             dr->vdr_side = DKV_SIDE_INIT;
 568      -                             dr->vdr_nbytes = 1024;
 569      -                             dr->vdr_offset = 0xff00;
 570      -                             do {
 571      -                                     rval =ioctl(fildes, DKIODMR, dr);
 572      -                                     if (rval != EINVAL) {
 573      -                                             /* Process data */
 574      -                                     }
 575      -                             } while (rval != EINVAL || dr->vdr_flags &
 576      -                                 (DKV_DMR_DONE | DKV_DMR_ERROR | DKV_DMR_SHORT)
 577      -                     }
 578      -             }
 579      -
 580      -
 581      -
 582  521     RETURN VALUES
 583      -       Upon successful completion, the value returned is 0. Otherwise, -1 is
 584      -       returned and errno is set to indicate the error.
      522 +     Upon successful completion, the value returned is 0.  Otherwise, -1 is
      523 +     returned and errno is set to indicate the error.
 585  524  
 586  525     x86 Only
 587      -       The following ioctl() requests set and/or retrieve the current disk
 588      -       controller, partitions, or geometry information on the x86
 589      -       architecture.
      526 +     The following ioctl(2) requests set and/or retrieve the current disk
      527 +     controller, partitions, or geometry information on the x86 architecture.
 590  528  
 591      -       DKIOCG_PHYGEOM
      529 +     DKIOCG_PHYGEOM
 592  530  
 593      -           The argument is a pointer to a dk_geom structure (described below).
 594      -           This ioctl() gets the driver's notion of the physical geometry of
 595      -           the disk drive. It is functionally identical to the DKIOCGGEOM
 596      -           ioctl().
      531 +        The argument is a pointer to a dk_geom structure (described below).
      532 +        This ioctl(2) gets the driver's notion of the physical geometry of the
      533 +        disk drive.  It is functionally identical to the DKIOCGGEOM ioctl(2).
 597  534  
      535 +     DKIOCG_VIRTGEOM
 598  536  
 599      -       DKIOCG_VIRTGEOM
      537 +        The argument is a pointer to a dk_geom structure (described below).
      538 +        This ioctl(2) gets the controller's (and hence the driver's) notion of
      539 +        the virtual geometry of the disk drive.  Virtual geometry is a view of
      540 +        the disk geometry maintained by the firmware in a host bus adapter or
      541 +        disk controller.  If the disk is larger than 8 Gbytes, this ioctl
      542 +        fails because a CHS-based geometry is not relevant or useful for this
      543 +        drive.
 600  544  
 601      -           The argument is a pointer to a dk_geom structure (described below).
 602      -           This ioctl() gets the controller's (and hence the driver's) notion
 603      -           of the virtual geometry of the disk drive. Virtual geometry is a
 604      -           view of the disk geometry maintained by the firmware in a host bus
 605      -           adapter or disk controller.  If the disk is larger than 8 Gbytes,
 606      -           this ioctl fails because a CHS-based geometry is not relevant or
 607      -           useful for this drive.
      545 +          /*
      546 +           * Definition of a disk's geometry
      547 +           */
      548 +          struct dk_geom {
      549 +              unsigned shor    dkg_ncyl;   /* # of data cylinders */
      550 +              unsigned shor    dkg_acyl;   /* # of alternate cylinders */
      551 +              unsigned short   dkg_bcyl;   /* cyl offset (for fixed head */
      552 +                                           /* area) */
      553 +              unsigned short   dkg_nhead;  /* # of heads */
      554 +              unsigned short   dkg_obs1;   /* obsolete */
      555 +              unsigned short   dkg_nsect;  /* # of sectors per track */
      556 +              unsigned short   dkg_intrlv; /* interleave factor */
      557 +              unsigned short   dkg_obs2;   /* obsolete */
      558 +              unsigned short   dkg_obs3;   /* obsolete */
      559 +              unsigned short   dkg_apc;    /* alternates per cylinder */
      560 +                                           /* (SCSI only) */
      561 +              unsigned short   dkg_rpm;    /* revolutions per min */
      562 +              unsigned short   dkg_pcyl;   /* # of physical cylinders */
      563 +              unsigned short   dkg_write_reinstruct; /* # sectors to skip, */
      564 +                                                     /* writes */
      565 +              unsigned short   dkg_read_reinstruct;  /* # sectors to skip ,*/
      566 +                                                     /* reads */
      567 +              unsigned short   dkg_extra[7]; /* for compatible expansion */
      568 +          };
 608  569  
      570 +     DKIOCADDBAD
 609  571  
 610      -         /*
 611      -         * Definition of a disk's geometry
 612      -         */
 613      -         */struct dk_geom {
 614      -         unsigned shor    dkg_ncyl;             /* # of data cylinders */
 615      -         unsigned shor    dkg_acyl;             /* # of alternate cylinders */
 616      -         unsigned short   dkg_bcyl;             /* cyl offset (for fixed head */
 617      -                                                /* area) */
 618      -         unsigned short   dkg_nhead;            /* # of heads */
 619      -         unsigned short   dkg_obs1;             /* obsolete */
 620      -         unsigned short   dkg_nsect;            /* # of sectors per track*/
 621      -         unsigned short   dkg_intrlv;           /* interleave factor */
 622      -         unsigned short   dkg_obs2;             /* obsolete */
 623      -         unsigned short   dkg_obs3;             /* obsolete */
 624      -         unsigned short   dkg_apc;              /* alternates per cylinder */
 625      -                                                /* (SCSI only) */
 626      -         unsigned short   dkg_rpm;              /* revolutions per min*/
 627      -         unsigned short   dkg_pcyl;             /* # of physical cylinders */
 628      -         unsigned short   dkg_write_reinstruct; /* # sectors to skip, writes*/
 629      -         unsigned short   dkg_read_reinstruct;  /* # sectors to skip, reads*/
 630      -         unsigned short   dkg_extra[7];         /* for compatible expansion*/
 631      -         };
      572 +        This ioctl(2) forces the driver to re-examine the alternates slice and
      573 +        rebuild the internal bad block map accordingly.  It should be used
      574 +        whenever the alternates slice is changed by any method other than the
      575 +        addbadsec(1M) or format(1M) utilities.  DKIOCADDBAD can only be used
      576 +        for software remapping on IDE drives; SCSI drives use hardware
      577 +        remapping of alternate sectors.
 632  578  
      579 +     DKIOCPARTINFO
 633  580  
 634      -       DKIOCADDBAD
      581 +        The argument is a pointer to a part_info structure (described below).
      582 +        This ioctl(2) gets the driver's notion of the size and extent of the
      583 +        partition or slice indicated by the file descriptor argument.
 635  584  
 636      -           This ioctl() forces the driver to re-examine the alternates slice
 637      -           and rebuild the internal bad block map accordingly. It should be
 638      -           used whenever the alternates slice is changed by any method other
 639      -           than the addbadsec(1M) or format(1M) utilities. DKIOCADDBAD can
 640      -           only be used for software remapping on  IDE drives; SCSI drives use
 641      -           hardware remapping of alternate sectors.
      585 +          /*
      586 +           * Used by applications to get partition or slice information
      587 +           */
      588 +          struct part_info {
      589 +              daddr_t    p_start;
      590 +              int        p_length;
      591 +          };
 642  592  
      593 +     DKIOCEXTPARTINFO
 643  594  
 644      -       DKIOCPARTINFO
      595 +        The argument is a pointer to an extpart_info structure (described
      596 +        below).  This ioctl gets the driver's notion of the size and extent of
      597 +        the partition or slice indicated by the file descriptor argument.  On
      598 +        disks larger than 1TB, this ioctl must be used instead of
      599 +        DKIOCPARTINFO.
 645  600  
 646      -           The argument is a pointer to a part_info structure (described
 647      -           below).  This ioctl() gets the driver's notion of the size and
 648      -           extent of the partition or slice indicated by the file descriptor
 649      -           argument.
      601 +          /*
      602 +           * Used by applications to get partition or slice information
      603 +           */
      604 +          struct extpart_info {
      605 +              diskkaddr_t      p_start;
      606 +              diskaddr_t       p_length;
      607 +          };
 650  608  
 651      -             /*
 652      -              * Used by applications to get partition or slice information
 653      -              */
 654      -             struct part_info {
 655      -             daddr_t    p_start;
 656      -             int        p_length;
 657      -                   };
      609 +     DKIOCSETEXTPART
 658  610  
      611 +        This ioctl is used to update the in-memory copy of the logical drive
      612 +        information maintained by the driver.  The ioctl takes no arguments.
      613 +        It causes a re-read of the partition information and recreation of
      614 +        minor nodes if required.  Prior to updating the data structures, the
      615 +        ioctl ensures that the partitions do not overlap.  Device nodes are
      616 +        created only for valid partition entries.  If there is any change in
      617 +        the partition offset, size or ID from the previous read, the partition
      618 +        is deemed to have been changed and hence the device nodes are
      619 +        recreated.  Any modification to any of the logical partitions results
      620 +        in the recreation of all logical device nodes.
 659  621  
 660      -
 661      -       DKIOCEXTPARTINFO
 662      -
 663      -           The argument is a pointer to an extpart_info structure (described
 664      -           below).  This ioctl gets the driver's notion of the size and extent
 665      -           of the partition or slice indicated by the file descriptor
 666      -           argument. On disks larger than 1TB, this ioctl must be used instead
 667      -           of DKIOCPARTINFO.
 668      -
 669      -             /*
 670      -             * Used by applications to get partition or slice information
 671      -             */
 672      -             struct extpart_info {
 673      -             diskkaddr_t      p_start;
 674      -             diskaddr_t       p_length;
 675      -             };
 676      -
 677      -
 678      -
 679      -       DKIOCSETEXTPART
 680      -
 681      -           This ioctl is used to update the in-memory copy of the logical
 682      -           drive information maintained by the driver. The ioctl takes no
 683      -           arguments. It causes a re-read of the partition information and
 684      -           recreation of minor nodes if required.  Prior to updating the data
 685      -           structures, the ioctl ensures that the partitions do not overlap.
 686      -           Device nodes are created only for valid partition entries. If there
 687      -           is any change in the partition offset, size or ID from the previous
 688      -           read, the partition is deemed to have been changed and hence the
 689      -           device nodes are recreated. Any modification to any of the logical
 690      -           partitions results in the recreation of all logical device nodes.
 691      -
 692      -
 693  622  SEE ALSO
 694      -       addbadsec(1M), fdisk(1M), format(1M), ioctl(2), cdio(7I), cmdk(7D),
 695      -       fdio(7I), hdio(7I), sd(7D)
      623 +     addbadsec(1M), fdisk(1M), format(1M), ioctl(2), cmdk(7D), sd(7D),
      624 +     cdio(7I), fdio(7I), hdio(7I)
 696  625  
 697  626  NOTES
 698      -       Blocksize information provided in DKIOCGMEDIAINFO is the size (in
 699      -       bytes) of the device's basic unit of operation and can differ from the
 700      -       blocksize that the Solaris operating environment exports to the user.
 701      -       Capacity information provided in the DKIOCGMEDIAINFO are for reference
 702      -       only and you are advised to use the values returned by DKIOCGGEOM or
 703      -       other appropriate ioctl for accessing data using the standard
 704      -       interfaces.
      627 +     Blocksize information provided in DKIOCGMEDIAINFO is the size (in bytes)
      628 +     of the device's basic unit of operation and can differ from the blocksize
      629 +     that the Solaris operating environment exports to the user.  Capacity
      630 +     information provided in the DKIOCGMEDIAINFO are for reference only and
      631 +     you are advised to use the values returned by DKIOCGGEOM or other
      632 +     appropriate ioctl(2) for accessing data using the standard interfaces.
 705  633  
      634 +     For x86 only: If the DKIOCSMBOOT command is used to modify the Solaris
      635 +     partitions, the VTOC information should also be set appropriately to
      636 +     reflect the changes to partition.  Failure to do so leads to unexpected
      637 +     results when the device is closed and reopened fresh at a later time.
      638 +     This is because a default VTOC is assumed by driver when a Solaris
      639 +     partition is changed.  The default VTOC persists until the ioctl
      640 +     DKIOCSVTOC is called to modify VTOC or the device is closed and reopened.
      641 +     At that point, the old valid VTOC is read from the disk if it is still
      642 +     available.
 706  643  
 707      -       For x86 only: If the DKIOCSMBOOT command is used to modify the Solaris
 708      -       partitions, the VTOC information should also be set appropriately to
 709      -       reflect the changes to partition. Failure to do so leads to unexpected
 710      -       results when the device is closed and reopened fresh at a later time.
 711      -       This is because a default VTOC is assumed by driver when a Solaris
 712      -       partition is changed. The default VTOC persists until the ioctl
 713      -       DKIOCSVTOC is called to modify VTOC or the device is closed and
 714      -       reopened. At that point, the old valid VTOC is read from the disk if it
 715      -       is still available.
 716      -
 717      -
 718      -
 719      -                                October 8, 2016                       DKIO(7I)
      644 +illumos                        October 23, 2017                        illumos
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX