summaryrefslogtreecommitdiff
path: root/usr/src/man/man4i/dkio.4i
blob: 89d8204e03070652966de4e6fa06269d6d2c609f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
.\"
.\" The contents of this file are subject to the terms of the
.\" Common Development and Distribution License (the "License").
.\" You may not use this file except in compliance with the License.
.\"
.\" You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
.\" or http://www.opensolaris.org/os/licensing.
.\" See the License for the specific language governing permissions
.\" and limitations under the License.
.\"
.\" When distributing Covered Code, include this CDDL HEADER in each
.\" file and include the License file at usr/src/OPENSOLARIS.LICENSE.
.\" If applicable, add the following below this CDDL HEADER, with the
.\" fields enclosed by brackets "[]" replaced with your own identifying
.\" information: Portions Copyright [yyyy] [name of copyright owner]
.\"
.\"
.\" Copyright (c) 2009 Sun Microsystems, Inc. All Rights Reserved.
.\" Copyright 2016 Nexenta Systems, Inc.
.\" Copyright (c) 2017, Joyent, Inc.
.\"
.Dd March 13, 2022
.Dt DKIO 4I
.Os
.Sh NAME
.Nm dkio
.Nd disk control operations
.Sh SYNOPSIS
.In sys/dkio.h
.In sys/vtoc.h
.Sh DESCRIPTION
Disk drivers support a set of
.Xr ioctl 2
requests for disk controller, geometry, and partition information.
Basic to these
.Xr ioctl 2
requests are the definitions in
.In sys/dkio.h .
.Sh IOCTLS
The following
.Xr ioctl 2
requests set and/or retrieve the current disk
controller, partitions, or geometry information on all architectures:
.Bl -tag -width 1n
.It Dv DKIOCINFO
.Pp
The argument is a pointer to a
.Vt dk_cinfo
structure (described below).
This structure contains the controller-type and attributes regarding bad-block
processing done on the controller.
.Bd -literal -offset 2n
/*
 * Structures and definitions for disk I/O control commands
 */
#define DK_DEVLEN 16   /* device name max length, */
                       /* including unit # and NULL */

/* Used for controller info */
struct dk_cinfo {
     char      dki_cname[DK_DEVLEN];    /* controller name */
                                        /* (no unit #) */
     ushort_t  dki_ctype;               /* controller type */
     ushort_t  dki_flags;               /* flags */
     ushort_t  dki_cnum;                /* controller number */
     uint_t    dki_addr;                /* controller address */
     uint_t    dki_space;               /* controller bus type */
     uint_t    dki_prio;                /* interrupt priority */
     uint_t    dki_vec;                 /* interrupt vector */
     char      dki_dname[DK_DEVLEN];    /* drive name (no unit #) */
     uint_t    dki_unit;                /* unit number */
     uint_t    dki_slave;               /* slave number */
     ushort_t  dki_partition;           /* partition number */
     ushort_t  dki_maxtransfer;         /* maximum transfer size */
                                        /* in DEV_BSIZE */
     };

     /*
      * Controller types
      */
     #define DKC_UNKNOWN      0
     #define DKC_CDROM        1         /* CD-ROM, SCSI or other */
     #define DKC_WDC2880      2
     #define DKC_XXX_0        3         /* unassigned */
     #define DKC_XXX_1        4         /* unassigned */
     #define DKC_DSD5215      5
     #define DKC_ACB4000      7
     #define DKC_XXX_2        9         /* unassigned */
     #define DKC_NCRFLOPPY    10
     #define DKC_SMSFLOPPY    12
     #define DKC_SCSI_CCS     13        /* SCSI CCS compatible */
     #define DKC_INTEL82072   14        /* native floppy chip */
     #define DKC_INTEL82077   19        /* 82077 floppy disk */
                                        /* controller */
     #define DKC_DIRECT       20        /* Intel direct attached */
                                        /* device (IDE) */
     #define DKC_PCMCIA_MEM   21        /* PCMCIA memory disk-like */
                                        /* type */
     #define DKC_PCMCIA_ATA   22        /* PCMCIA AT Attached type */

     /*
      * Sun reserves up through 1023
      */

     #define DKC_CUSTOMER_BASE  1024

     /*
      * Flags
      */
     #define DKI_BAD144       0x01          /* use  DEC  std  144  */
                                            /* bad  sector fwding */
     #define DKI_MAPTRK       0x02          /* controller does */
                                            /* track mapping */
     #define DKI_FMTTRK       0x04          /* formats only  full
                                            /* track at a time */
     #define DKI_FMTVOL       0x08          /* formats only full */
                                            /* volume at a time */
     #define DKI_FMTCYL       0x10          /* formats only full */
                                            /* cylinders at a time */
     #define DKI_HEXUNIT      0x20          /* unit number printed */
                                            /* as 3 hexdigits */
     #define DKI_PCMCIA_PFD   0x40          /* PCMCIA pseudo-floppy */
                                            /* memory card */
.Ed
.It Dv DKIOCGAPART
.Pp
The argument is a pointer to a
.Vt dk_allmap
structure (described below).
This
.Xr ioctl 2
gets the controller's notion of the current partition table
for disk drive.
.It Dv DKIOCSAPART
.Pp
The argument is a pointer to a
.Vt dk_allmap
structure (described below).
This
.Xr ioctl 2
sets the controller's notion of the partition table without
changing the disk itself.
.Bd -literal -offset 2n
/*
 * Partition map (part of dk_label)
 */
struct dk_map {
     daddr_t dkl_cylno;     /* starting cylinder */
     daddr_t dkl_nblk;      /* number of blocks */
};

/*
 * Used for all partitions
 */
struct dk_allmap {
    struct dk_map    dka_map[NDKMAP];
};
.Ed
.It Dv DKIOCGGEOM
.Pp
The argument is a pointer to a
.Vt dk_geom
structure (described below).
This
.Xr ioctl 2
gets the controller's notion of the current geometry of the disk drive.
.It Dv DKIOCSGEOM
.Pp
The argument is a pointer to a
.Vt dk_geom
structure (described below).
This
.Xr ioctl 2
sets the controller's notion of the geometry without changing the disk itself.
.It Dv DKIOCGVTOC
.Pp
The argument is a pointer to a
.Vt vtoc
structure (described below).
This
.Xr ioctl 2
returns the device's current volume table of contents (VTOC).
For disks larger than 1TB,
.Dv DKIOCGEXTVTOC
must be used instead.
.It Dv DKIOCSVTOC
.Pp
The argument is a pointer to a
.Vt vtoc
structure (described below).
This
.Xr ioctl 2
changes the VTOC associated with the device.
For disks larger than 1TB,
.Dv DKIOCSEXTVTOC
must be used instead.
.Bd -literal -offset 2n
struct partition {
    ushort_t      p_tag;         /* ID tag of partition */
    ushort_t      p_flag;        /* permission flags */
    daddr_t       p_start;       /* start sector of partition */
    long          p_size;        /* # of blocks in partition */
};
.Ed
.Pp
If
.Dv DKIOCSVTOC
is used with a floppy diskette, the
.Fa p_start
field must be the first sector of a cylinder.
To compute the number of sectors per
cylinder, multiply the number of heads by the number of sectors per track.
.Bd -literal -offset 2n
struct vtoc {
    unsigned long     v_bootinfo[3];        /* info needed by mboot */
                                            /* (unsupported) */
    unsigned long     v_sanity;             /* to verify vtoc */
                                            /* sanity */
    unsigned long     v_version;            /* layout version */
    char              v_volume[LEN_DKL_VVOL]; /* volume name */
    ushort_t          v_sectorsz;           /* sector size in bytes */
    ushort_t          v_nparts;             /* number of partitions */
    unsigned long     v_reserved[10];       /* free space */
    struct partition  v_part[V_NUMPAR];     /* partition headers */
    time_t            timestamp[V_NUMPAR];  /* partition timestamp */
                                            /* (unsupported) */
    char              v_asciilabel[LEN_DKL_ASCII]; /* compatibility */
};

/*
 * Partition permission flags
 */
#define V_UNMNT      0x01    /* Unmountable partition */
#define V_RONLY      0x10    /* Read only */

/*
 * Partition identification tags
 */
#define V_UNASSIGNED   0x00  /* unassigned partition */
#define V_BOOT         0x01  /* Boot partition */
#define V_ROOT         0x02  /* Root filesystem */
#define V_SWAP         0x03  /* Swap filesystem */
#define V_USR          0x04  /* Usr filesystem */
#define V_BACKUP       0x05  /* full disk */
#define V_VAR          0x07  /* Var partition */
#define V_HOME         0x08  /* Home partition */
#define V_ALTSCTR      0x09  /* Alternate sector partition */
.Ed
.It Dv DKIOCGEXTVTOC
.Pp
The argument is a pointer to an
.Vt extvtoc
structure (described below).
This ioctl returns the device's current volume table of contents (VTOC).
VTOC is extended to support a disk up to 2TB in size.
For disks larger than 1TB this ioctl must be used instead of
.Dv DKIOCGVTOC .
.It Dv DKIOCSEXTVTOC
.Pp
The argument is a pointer to an
.Vt extvtoc
structure (described below).
This ioctl changes the VTOC associated with the device.
VTOC is extended to support a disk up to 2TB in size.
For disks larger than 1TB this ioctl must be used instead of
.Vt DKIOCSVTOC .
.Bd -literal -offset 2n
struct extpartition {
    ushort_t p_tag;         /* ID tag of partition */
    ushort_t p_flag;        /* permission flags */
    ushort_t p_pad[2];      /* reserved */
    diskaddr_t p_start;     /* start sector no of partition */
    diskaddr_t p_size;      /* # of blocks in partition */
};

struct extvtoc {
    uint64_t   v_bootinfo[3]; /* info needed by mboot (unsupported) */
    uint64_t   v_sanity;      /* to verify vtoc sanity */
    uint64_t   v_version;     /* layout version */
    char    v_volume[LEN_DKL_VVOL]; /* volume name */
    ushort_t   v_sectorsz;    /* sector size in bytes */
    ushort_t   v_nparts;      /* number of partitions */
    ushort_t   pad[2];
    uint64_t   v_reserved[10];
    struct extpartition v_part[V_NUMPAR]; /* partition headers */
    uint64_t timestamp[V_NUMPAR]; /* partition timestamp */
                                  /* (unsupported) */
    char    v_asciilabel[LEN_DKL_ASCII];    /* for compatibility */
};
.Ed
.Pp
Partition permissions flags and identification tags
are defined the same as vtoc structure.
.It Dv DKIOCEJECT
.Pp
If the drive supports removable media, this
.Xr ioctl 2
requests the disk drive to eject its disk.
.It Dv DKIOCREMOVABLE
.Pp
The argument to this
.Xr ioctl 2
is an integer.
After successful completion, this
.Xr ioctl 2
sets that integer to a non-zero value if the drive in
question has removable media.
If the media is not removable, the integer is set to
.Sy 0 .
.It Dv DKIOCHOTPLUGGABLE
.Pp
The argument to this
.Xr ioctl 2
is an integer.
After successful completion, this
.Xr ioctl 2
sets that integer to a non-zero value if the drive in question is hotpluggable.
If the media is not hotpluggable, the integer is set to 0.
.It Dv DKIOCSTATE
.Pp
This
.Xr ioctl 2
blocks until the state of the drive, inserted or ejected, is changed.
The argument is a pointer to a
.Vt dkio_state ,
enum, whose possible enumerations are listed below.
The initial value should be either the last
reported state of the drive, or
.Dv DKIO_NONE .
Upon return, the enum pointed
to by the argument is updated with the current state of the drive.
.Bd -literal -offset 2n
enum dkio_state {
    DKIO_NONE,          /* Return disk's current state */
    DKIO_EJECTED,       /* Disk state is 'ejected' */
    DKIO_INSERTED       /* Disk state is 'inserted' */
};
.Ed
.It Dv DKIOCLOCK
.Pp
For devices with removable media, this
.Xr ioctl 2
requests the disk drive to lock the door.
.It Dv DKIOCUNLOCK
.Pp
For devices with removable media, this
.Xr ioctl 2
requests the disk drive to unlock the door.
.It Dv DKIOCGMEDIAINFO
.Pp
The argument to this
.Xr ioctl 2
is a pointer to a
.Vt dk_minfo
structure.
The structure indicates the type of media or the command set profile used by
the drive to operate on the media.
The
.Vt dk_minfo
structure also indicates the logical media block size the drive uses as the
basic unit block size of operation and the raw formatted capacity of the media
in number of logical blocks.
.It Dv DKIOCGMEDIAINFOEXT
.Pp
The argument to this
.Xr ioctl 2
is a pointer to a
.Vt dk_minfo_ext
structure.
The structure indicates the type of media or the command set profile
used by the drive to operate on the media.
The
.Vt dk_minfo_ext
structure
also indicates the logical media block size the drive uses as the basic unit
block size of operation, the raw formatted capacity of the media in number of
logical blocks and the physical block size of the media.
.Bd -literal -offset 2n
/*
 * Used for media info or profile info
 */
struct dk_minfo {
    uint_t dki_media_type;   /* Media type or profile info */
    uint_t dki_lbsize;       /* Logical blocksize of media */
    diskaddr_t dki_capacity; /* Capacity as # of dki_lbsize blks */
};

/*
 * Used for media info or profile info and physical blocksize
 */
struct dk_minfo_ext {
    uint_t dki_media_type; /* Media type or profile info */
    uint_t dki_lbsize; /* Logical blocksize of media */
    diskaddr_t dki_capacity; /* Capacity as # of dki_lbsize blks */
    uint_t dki_pbsize; /* Physical blocksize of media */
};


/*
 * Media types or profiles known
 */
#define DK_UNKNOWN         0x00    /* Media inserted - type unknown */

/*
 * SFF 8090 Specification Version 3, media types 0x01 - 0xfffe are
 * retained to maintain compatibility with SFF8090.  The following
 * define the optical media type.
 */
#define DK_MO_ERASABLE     0x03 /* MO Erasable */
#define DK_MO_WRITEONCE    0x04 /* MO Write once */
#define DK_AS_MO           0x05 /* AS MO */
#define DK_CDROM           0x08 /* CDROM */
#define DK_CDR             0x09 /* CD-R */
#define DK_CDRW            0x0A /* CD-RW */
#define DK_DVDROM          0x10 /* DVD-ROM */
#define DK_DVDR            0x11 /* DVD-R */
#define DK_DVDRAM          0x12 /* DVD_RAM or DVD-RW */

/*
 * Media types for other rewritable magnetic media
 */
#define DK_FIXED_DISK      0x10001 /* Fixed disk SCSI or otherwise */
#define DK_FLOPPY          0x10002 /* Floppy media */
#define DK_ZIP             0x10003 /* IOMEGA ZIP media */
#define DK_JAZ             0x10004 /* IOMEGA JAZ media */
.Ed
.Pp
If the media exists and the host can obtain a current profile list, the command
succeeds and returns the
.Vt dk_minfo
structure with data representing that media.
.Pp
If there is no media in the drive, the command fails and the host returns an
.Er ENXIO
error, indicating that it cannot gather the information requested.
.Pp
If the profile list is not available, the host attempts to identify the
media-type based on the available information.
.Pp
If identification is not possible, the host returns media type
.Dv DK_UNKNOWN .
See
.Sx NOTES
for blocksize usage and capacity information.
.It Dv DKIOCSMBOOT
.Pp
The argument is a pointer to struct
.Vt mboot .
.Pp
Copies the
.Vt mboot
information supplied in the argument to the absolute sector 0 of the device.
Prior to copying the information, this
.Xr ioctl 2
performs the following checks on the
.Vt mboot
data:
.Bl -bullet -offset indent
.It
Ensures that the signature field is set to 0xAA55.
.It
Ensures that partitions do not overlap.
.It
On SPARC platforms, determines if the device is a removable media.
.El
.Pp
If the above verification fails,
.Va errno
is set to
.Er EINVAL
and the
.Xr ioctl 2
command fails.
.Pp
x86 Platforms \(em Upon successful write of
.Vt mboot ,
the partition map structure maintained in the driver is updated.
If the new Solaris partition is
different from the previous one, the internal VTOC table maintained in the
driver is set as follows:
.Pp
If
.Dv _SUNOS_VTOC_8
is defined:
.Bd -unfilled -offset 4n
Partition: 0 Start: 0 Capacity = Capacity of device.
Partition: 2 Start: 0 Capacity = Capacity of device.
.Ed
.Pp
If
.Dv _SUNOS_VTOC_16
is defined:
.Bd -unfilled -offset 4n
Partition: 2 Start: 0 Size = Size specified in mboot - 2 cylinders.
Partition: 8 Start: 0 Size = Sectors/cylinder.
Partition: 9 Start: Sectors/cylinder  Size = 2 * sectors/cylinder
.Ed
.Pp
To determine if the Solaris partition has changed:
.Bd -offset 4n -ragged
If either offset or the size of the Solaris partition is different from the
previous one then it shall be deemed to have changed.
In all other cases, the
internal VTOC info remains as before.
.Ed
.Pp
SPARC Platforms \(em The VTOC label and
.Vt mboot
both occupy the same location, namely sector 0.
As a result, following the successful write of
.Vt mboot
info, the internal VTOC table maintained in the driver is set as follows:
.Bd -unfilled -offset 4n
Partition: 0  Start: 0  Size = Capacity of device.
Partition: 2  Start: 0  Size = Capacity of device.
.Ed
.Pp
See the
.Sx NOTES
section for usage of
.Dv DKIOCSMBOOT
when modifying Solaris partitions.
.It Dv DKIOCGETVOLCAP
.Pp
This ioctl provides information and status of available capabilities.
.Fa vc_info
is a bitmap and the valid flag values are:
.Pp
.Bl -tag -width DKV_ABR_CAP -compact -offset 2n
.It Dv DKV_ABR_CAP
Capable of application-based recovery
.It Dv DKV_DMR_CAP
Ability to read specific copy of data when multiple copies exist.
For example, in a two way mirror, this ioctl is used to read each
side of the mirror.
.El
.Pp
.Fa vc_set
is a bitmap and the valid flag values are:
.Pp
.Bl -tag -width DKV_ABR_CAP -compact -offset 2n
.It Dv DKV_ABR_CAP
This flag is set if ABR has been set on a device that supports ABR functionality.
.It Dv DKV_DMR_CAP
Directed read has been enabled.
.El
.Pp
These capabilities are not required to be persistent across a system reboot and
their persistence depends upon the implementation.
For example, if the ABR
capability for a DRL mirror simply clears the dirty-region list and
subsequently stops updating this list, there is no reason for persistence
because the VM recovery is a no-op.
Conversely, if the ABR capability is
applied to a non-DRL mirror to indicate that the VM should not perform a full
recovery of the mirror following a system crash, the capability must be
persistent so that the VM know whether or not to perform recovery.
.Pp
Return Errors:
.Pp
.Bl -tag -width ENOTSUP -compact -offset 2n
.It Er EINVAL
Invalid device for this operation.
.It Er ENOTSUP
Functionality that is attempted to be set is not supported.
.El
.It Dv DKIOCSETVOLCAP
.Pp
This ioctl sets the available capabilities for the device.
If a capability flag
is not set in
.Fa vc_set ,
that capability is cleared.
.Pp
.Fa vc_info
flags are ignored.
.Pp
.Fa vc_set
valid flags are:
.Pp
.Bl -tag -width DKV_ABR_CAP -compact -offset 2n
.It Dv DKV_ABR_CAP
Flag to set application-based recovery.
A device can successfully support ABR only if it is capable.
.It Dv DKV_DMR_CAP
Flag to set directed read.
.El
.It Dv DKIODMR
.Pp
.Ft int
.Fo ioctl
.Fa int ,
.\" This could be .Fa as well -- but mandoc doesn't seem to allow both
.Dv DKIODMR ,
.Fa "vol_directed_rd *"
.Fc
.Pp
This ioctl allows highly available applications to perform round-robin reads
from the underlying devices of a replicated device.
.Pp
.Bl -tag -width vdr_bytesread -offset 2n -compact
.It Fa vdr_offset
Offset at which the read should occur.
.It Fa vdr_nbytes
Number of bytes to be read
.It Fa vdr_bytesread
Number of bytes successfully read by the kernel.
.It Fa vdr_data
Pointer to a user allocated buffer to return the data read
.It Fa vdr_side
Side to be read.
Initialized to
.Dv DKV_SIDE_INIT
.It Fa vdr_side_name
The volume name that has been read.
.El
.Pp
Valid
.Fa vdr_flags
are:
.Pp
.Bl -tag -width DKV_DMR_NEXT_SIDE -offset 2n -compact
.It Dv DKV_DMR_NEXT_SIDE
Set by user
.It Dv DKV_DMR_DONE
Return value
.It Dv DKV_DMR_ERROR
Return value
.It Dv DKV_DMR_SUCCESS
Return value
.It Dv DKV_DMR_SHORT
Return value
.El
.Pp
The calling sequence is as follows: The caller sets the
.Fa vdr_flags
to
.Dv DK_DMR_NEXT_SIDE
and
.Fa vdr_side
to
.Dv DKV_SIDE_INIT
at the start.
Subsequent calls should be made without any changes to these values.
If they are changed the results of the ioctl are indeterminate.
.Pp
When
.Dv DKV_SIDE_INIT
is set, the call results in the kernel reading from the first side.
The kernel updates
.Fa vdr_side
to indicate the side that was read, and
.Fa vdr_side_name
to contain the name of that side.
.Fa vdr_data
contains the data that was read.
Therefore to perform a round-robin read all of
the valid sides, there is no need for the caller to change the contents of
.Fa vdr_side .
.Pp
Subsequent
.Xr ioctl 2
calls result in reads from the next valid side until all valid
sides have been read.
On success, the kernel sets
.Dv DKV_DMR_SUCCESS .
The following table shows the values of
.Fa vdr_flags
that are returned when an error occurs:
.Bl -column DKV_DMR_SHORT DKV_SIDE_INIT "Bytes requested cannot" -offset 2n
.It Fa vda_flags Ta Fa vdr_side Ta Notes
.It Dv DKV_DMR_ERROR Ta Dv DKV_SIDE_INIT Ta \&No valid side to read
.It Dv DKV_DMR_DONE Ta Not Init side Ta All valid sides read
.It Dv DKV_DMR_SHORT Ta Any value Ta Bytes requested cannot be read Fa vdr_bytesread No set to bytes actually read
.El
Typical code fragment:
.Bd -literal -offset 2n
enable->vc_set |= DKV_ABR_SET;
retval = ioctl(filedes, DKIOSETVOLCAP, enable);
if (retval != EINVAL || retval != ENOTSUP) {
        if (info->vc_set & DKV_DMR_SET) {
                dr->vdr_flags |= DKV_DMR_NEXT_SIDE;
                dr->vdr_side = DKV_SIDE_INIT;
                dr->vdr_nbytes = 1024;
                dr->vdr_offset = 0xff00;
                do {
                        rval = ioctl(fildes, DKIODMR, dr);
                        if (rval != EINVAL) {
                                /* Process data */
                        }
                } while (rval != EINVAL || dr->vdr_flags &
                    (DKV_DMR_DONE | DKV_DMR_ERROR | DKV_DMR_SHORT)
        }
}
.Ed
.El
.Ss "RETURN VALUES"
Upon successful completion, the value returned is
.Sy 0 .
Otherwise,
.Sy -1
is returned and
.Va errno
is set to indicate the error.
.Ss "x86 Only"
The following
.Xr ioctl 2
requests set and/or retrieve the current disk
controller, partitions, or geometry information on the x86 architecture.
.Bl -tag -width 1n
.It Dv DKIOCG_PHYGEOM
.Pp
The argument is a pointer to a
.Vt dk_geom
structure (described below).
This
.Xr ioctl 2
gets the driver's notion of the physical geometry of the disk drive.
It is functionally identical to the
.Dv DKIOCGGEOM
.Xr ioctl 2 .
.It Dv DKIOCG_VIRTGEOM
.Pp
The argument is a pointer to a
.Vt dk_geom
structure (described below).
This
.Xr ioctl 2
gets the controller's (and hence the driver's) notion of the
virtual geometry of the disk drive.
Virtual geometry is a view of the disk
geometry maintained by the firmware in a host bus adapter or disk controller.
If the disk is larger than 8 Gbytes, this ioctl fails because a CHS-based
geometry is not relevant or useful for this drive.
.Bd -literal -offset 2n
/*
 * Definition of a disk's geometry
 */
struct dk_geom {
    unsigned shor    dkg_ncyl;   /* # of data cylinders */
    unsigned shor    dkg_acyl;   /* # of alternate cylinders */
    unsigned short   dkg_bcyl;   /* cyl offset (for fixed head */
                                 /* area) */
    unsigned short   dkg_nhead;  /* # of heads */
    unsigned short   dkg_obs1;   /* obsolete */
    unsigned short   dkg_nsect;  /* # of sectors per track */
    unsigned short   dkg_intrlv; /* interleave factor */
    unsigned short   dkg_obs2;   /* obsolete */
    unsigned short   dkg_obs3;   /* obsolete */
    unsigned short   dkg_apc;    /* alternates per cylinder */
                                 /* (SCSI only) */
    unsigned short   dkg_rpm;    /* revolutions per min */
    unsigned short   dkg_pcyl;   /* # of physical cylinders */
    unsigned short   dkg_write_reinstruct; /* # sectors to skip, */
                                           /* writes */
    unsigned short   dkg_read_reinstruct;  /* # sectors to skip ,*/
                                           /* reads */
    unsigned short   dkg_extra[7]; /* for compatible expansion */
};
.Ed
.It Dv DKIOCADDBAD
.Pp
This
.Xr ioctl 2
forces the driver to re-examine the alternates slice and
rebuild the internal bad block map accordingly.
It should be used whenever the
alternates slice is changed by any method other than the
.Xr addbadsec 8
or
.Xr format 8
utilities.
.Dv DKIOCADDBAD
can only be used for software
remapping on
.Sy IDE
drives;
.Sy SCSI
drives use hardware remapping of alternate sectors.
.It Dv DKIOCPARTINFO
.Pp
The argument is a pointer to a
.Vt part_info
structure (described below).
This
.Xr ioctl 2
gets the driver's notion of the size and extent of the
partition or slice indicated by the file descriptor argument.
.Bd -literal -offset 2n
/*
 * Used by applications to get partition or slice information
 */
struct part_info {
    daddr_t    p_start;
    int        p_length;
};
.Ed
.It Dv DKIOCEXTPARTINFO
.Pp
The argument is a pointer to an
.Vt extpart_info
structure (described below).
This ioctl gets the driver's notion of the size and extent of the partition or
slice indicated by the file descriptor argument.
On disks larger than 1TB, this ioctl must be used instead of
.Dv DKIOCPARTINFO .
.Bd -literal -offset 2n
/*
 * Used by applications to get partition or slice information
 */
struct extpart_info {
    diskaddr_t       p_start;
    diskaddr_t       p_length;
};
.Ed
.It Dv DKIOCSETEXTPART
.Pp
This ioctl is used to update the in-memory copy of the logical drive
information maintained by the driver.
The ioctl takes no arguments.
It causes a re-read of the partition information and recreation of minor nodes
if required.
Prior to updating the data structures, the ioctl ensures that the partitions do
not overlap.
Device nodes are created only for valid partition entries.
If there is any change in the partition offset, size or ID from the previous
read, the partition is deemed to have been changed and hence the device nodes
are recreated.
Any modification to any of the logical partitions results in the
recreation of all logical device nodes.
.El
.Sh SEE ALSO
.Xr ioctl 2 ,
.Xr cmdk 4D ,
.Xr sd 4D ,
.Xr cdio 4I ,
.Xr fdio 4I ,
.Xr hdio 4I ,
.Xr addbadsec 8 ,
.Xr fdisk 8 ,
.Xr format 8
.Sh NOTES
Blocksize information provided in
.Dv DKIOCGMEDIAINFO
is the size (in bytes) of the device's basic unit of operation and can differ
from the blocksize that the Solaris operating environment exports to the user.
Capacity information provided in the
.Dv DKIOCGMEDIAINFO
are for reference only and you are advised to use the values returned by
.Dv DKIOCGGEOM
or other appropriate
.Xr ioctl 2
for accessing data using the standard interfaces.
.Pp
For x86 only: If the
.Dv DKIOCSMBOOT
command is used to modify the Solaris partitions, the VTOC information should
also be set appropriately to reflect the changes to partition.
Failure to do so leads to unexpected results when the
device is closed and reopened fresh at a later time.
This is because a default VTOC is assumed by driver when a Solaris partition
is changed.
The default VTOC persists until the ioctl
.Dv DKIOCSVTOC
is called to modify VTOC or the device is closed and reopened.
At that point, the old valid VTOC is read from
the disk if it is still available.