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