VirtualBox

source: vbox/trunk/src/VBox/Devices/Storage/VSCSI/VSCSIInternal.h@ 64412

Last change on this file since 64412 was 64412, checked in by vboxsync, 8 years ago

VSCSI: Start on support for SCSI_MAINTENANCE_IN_REPORT_SUPP_OPC, work in progress not enabled

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 19.7 KB
Line 
1/* $Id: VSCSIInternal.h 64412 2016-10-25 11:57:44Z vboxsync $ */
2/** @file
3 * Virtual SCSI driver: Internal defines
4 */
5
6/*
7 * Copyright (C) 2006-2016 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 */
17#ifndef ___VSCSIInternal_h
18#define ___VSCSIInternal_h
19
20#include <VBox/vscsi.h>
21#include <VBox/scsi.h>
22#include <iprt/memcache.h>
23#include <iprt/sg.h>
24#include <iprt/list.h>
25
26#include "VSCSIInline.h"
27#include "VSCSIVpdPages.h"
28
29/** Pointer to an internal virtual SCSI device. */
30typedef VSCSIDEVICEINT *PVSCSIDEVICEINT;
31/** Pointer to an internal virtual SCSI device LUN. */
32typedef VSCSILUNINT *PVSCSILUNINT;
33/** Pointer to an internal virtual SCSI device LUN pointer. */
34typedef PVSCSILUNINT *PPVSCSILUNINT;
35/** Pointer to a virtual SCSI LUN descriptor. */
36typedef struct VSCSILUNDESC *PVSCSILUNDESC;
37/** Pointer to a virtual SCSI request. */
38typedef VSCSIREQINT *PVSCSIREQINT;
39/** Pointer to a virtual SCSI I/O request. */
40typedef VSCSIIOREQINT *PVSCSIIOREQINT;
41/** Pointer to virtual SCSI sense data state. */
42typedef struct VSCSISENSE *PVSCSISENSE;
43
44/**
45 * Virtual SCSI sense data handling.
46 */
47typedef struct VSCSISENSE
48{
49 /** Buffer holding the sense data. */
50 uint8_t abSenseBuf[32];
51} VSCSISENSE;
52
53/**
54 * Virtual SCSI device.
55 */
56typedef struct VSCSIDEVICEINT
57{
58 /** Request completion callback */
59 PFNVSCSIREQCOMPLETED pfnVScsiReqCompleted;
60 /** Opaque user data. */
61 void *pvVScsiDeviceUser;
62 /** Number of LUNs currently attached. */
63 uint32_t cLunsAttached;
64 /** How many LUNs are fitting in the array. */
65 uint32_t cLunsMax;
66 /** Request cache */
67 RTMEMCACHE hCacheReq;
68 /** Sense data handling. */
69 VSCSISENSE VScsiSense;
70 /** Pointer to the array of LUN handles.
71 * The index is the LUN id. */
72 PPVSCSILUNINT papVScsiLun;
73} VSCSIDEVICEINT;
74
75/**
76 * Virtual SCSI device LUN.
77 */
78typedef struct VSCSILUNINT
79{
80 /** Pointer to the parent SCSI device. */
81 PVSCSIDEVICEINT pVScsiDevice;
82 /** Opaque user data */
83 void *pvVScsiLunUser;
84 /** I/O callback table */
85 PVSCSILUNIOCALLBACKS pVScsiLunIoCallbacks;
86 /** Pointer to the LUN type descriptor. */
87 PVSCSILUNDESC pVScsiLunDesc;
88 /** Flag indicating whether LUN is ready. */
89 bool fReady;
90 /** Flag indicating media presence in LUN. */
91 bool fMediaPresent;
92 /** Flags of supported features. */
93 uint64_t fFeatures;
94 /** I/O request processing data */
95 struct
96 {
97 /** Number of outstanding tasks on this LUN. */
98 volatile uint32_t cReqOutstanding;
99 } IoReq;
100} VSCSILUNINT;
101
102/**
103 * Virtual SCSI request.
104 */
105typedef struct VSCSIREQINT
106{
107 /** The LUN the request is for. */
108 uint32_t iLun;
109 /** The CDB */
110 uint8_t *pbCDB;
111 /** Size of the CDB */
112 size_t cbCDB;
113 /** S/G buffer. */
114 RTSGBUF SgBuf;
115 /** Pointer to the sense buffer. */
116 uint8_t *pbSense;
117 /** Size of the sense buffer */
118 size_t cbSense;
119 /** Opaque user data associated with this request */
120 void *pvVScsiReqUser;
121} VSCSIREQINT;
122
123/**
124 * Virtual SCSI I/O request.
125 */
126typedef struct VSCSIIOREQINT
127{
128 /** The associated request. */
129 PVSCSIREQINT pVScsiReq;
130 /** Lun for this I/O request. */
131 PVSCSILUNINT pVScsiLun;
132 /** Transfer direction */
133 VSCSIIOREQTXDIR enmTxDir;
134 /** Direction dependent data. */
135 union
136 {
137 /** Read/Write request. */
138 struct
139 {
140 /** Start offset */
141 uint64_t uOffset;
142 /** Number of bytes to transfer */
143 size_t cbTransfer;
144 /** Number of bytes the S/G list holds */
145 size_t cbSeg;
146 /** Number of segments. */
147 unsigned cSeg;
148 /** Segment array. */
149 PCRTSGSEG paSeg;
150 } Io;
151 /** Unmape request. */
152 struct
153 {
154 /** Array of ranges to unmap. */
155 PRTRANGE paRanges;
156 /** Number of ranges. */
157 unsigned cRanges;
158 } Unmap;
159 } u;
160} VSCSIIOREQINT;
161
162/**
163 * VPD page pool.
164 */
165typedef struct VSCSIVPDPOOL
166{
167 /** List of registered pages (VSCSIVPDPAGE). */
168 RTLISTANCHOR ListPages;
169} VSCSIVPDPOOL;
170/** Pointer to the VSCSI VPD page pool. */
171typedef VSCSIVPDPOOL *PVSCSIVPDPOOL;
172
173/**
174 * Supported operation code information entry.
175 */
176typedef struct VSCSILUNSUPOPC
177{
178 /** The operation code. */
179 uint8_t u8Opc;
180 /** Service action code if required as indicated by
181 * VSCSI_LUN_SUP_OPC_SVC_ACTION_REQUIRED */
182 uint16_t u16SvcAction;
183 /** Flags. */
184 uint32_t fFlags;
185 /** Readable description for the op code. */
186 const char *pszOpc;
187 /** The length of the CDB for this operation code. */
188 uint8_t cbCdb;
189 /** Pointer to the CDB usage data. */
190 uint8_t *pbCdbUsage;
191 /* The operation specific valuefor the timeout descriptor. */
192 uint8_t u8OpcTimeoutSpec;
193 /** The nominal processing timeout in seconds. */
194 uint16_t cNominalProcessingTimeout;
195 /** The recommend timeout in seconds. */
196 uint16_t cRecommendTimeout;
197} VSCSILUNSUPOPC;
198/** Pointer to a operation code information entry. */
199typedef VSCSILUNSUPOPC *PVSCSILUNSUPOPC;
200/** Pointer to a const operation code information entry. */
201typedef const VSCSILUNSUPOPC *PCVSCSILUNSUPOPC;
202
203/** @name Flags for the supported operation code infromation entries.
204 * @{ */
205/** Flag indicating wheter the service action member is valid and should be
206 * evaluated to find the desired opcode information. */
207#define VSCSI_LUN_SUP_OPC_SVC_ACTION_REQUIRED RT_BIT_32(0)
208/** Flag whether the values for the timeout descriptor are valid. */
209#define VSCSI_LUN_SUP_OPC_TIMEOUT_DESC_VALID RT_BIT_32(1)
210/** @} */
211
212/** @name Support macros to create supported operation code information entries.
213 * @{ */
214#define VSCSI_LUN_SUP_OPC(a_u8Opc, a_pszOpc, a_cbCdb, a_pbCdbUsage) \
215 { a_u8Opc, 0, 0, a_pszOpc, a_cbCdb, a_pbCdbUsage, 0, 0, 0}
216#define VSCSI_LUN_SUP_OPC_SVC(a_u8Opc, a_u16SvcAction, a_pszOpc, a_cbCdb, a_pbCdbUsage) \
217 { a_u8Opc, a_u16SvcAction, VSCSI_LUN_SUP_OPC_SVC_ACTION_REQUIRED, a_pszOpc, a_cbCdb, a_pbCdbUsage, 0, 0, 0}
218/** @} */
219
220/**
221 * Virtual SCSI LUN descriptor.
222 */
223typedef struct VSCSILUNDESC
224{
225 /** Device type this descriptor emulates. */
226 VSCSILUNTYPE enmLunType;
227 /** Descriptor name */
228 const char *pcszDescName;
229 /** LUN type size */
230 size_t cbLun;
231 /** Number of entries in the supported operation codes array. */
232 uint32_t cSupOpcInfo;
233 /** Pointer to the array of supported operation codes for the
234 * REPORT RUPPORTED OPERATION CODES command handled by the generic
235 * device driver - optional.
236 */
237 PCVSCSILUNSUPOPC paSupOpcInfo;
238
239 /**
240 * Initialise a Lun instance.
241 *
242 * @returns VBox status code.
243 * @param pVScsiLun The SCSI LUN instance.
244 */
245 DECLR3CALLBACKMEMBER(int, pfnVScsiLunInit, (PVSCSILUNINT pVScsiLun));
246
247 /**
248 * Destroy a Lun instance.
249 *
250 * @returns VBox status code.
251 * @param pVScsiLun The SCSI LUN instance.
252 */
253 DECLR3CALLBACKMEMBER(int, pfnVScsiLunDestroy, (PVSCSILUNINT pVScsiLun));
254
255 /**
256 * Processes a SCSI request.
257 *
258 * @returns VBox status code.
259 * @param pVScsiLun The SCSI LUN instance.
260 * @param pVScsiReq The SCSi request to process.
261 */
262 DECLR3CALLBACKMEMBER(int, pfnVScsiLunReqProcess, (PVSCSILUNINT pVScsiLun, PVSCSIREQINT pVScsiReq));
263
264 /**
265 * Informs about a medium being inserted - optional.
266 *
267 * @returns VBox status code.
268 * @param pVScsiLun The SCSI LUN instance.
269 */
270 DECLR3CALLBACKMEMBER(int, pfnVScsiLunMediumInserted, (PVSCSILUNINT pVScsiLun));
271
272 /**
273 * Informs about a medium being removed - optional.
274 *
275 * @returns VBox status code.
276 * @param pVScsiLun The SCSI LUN instance.
277 */
278 DECLR3CALLBACKMEMBER(int, pfnVScsiLunMediumRemoved, (PVSCSILUNINT pVScsiLun));
279
280} VSCSILUNDESC;
281
282/** Maximum number of LUNs a device can have. */
283#define VSCSI_DEVICE_LUN_MAX 128
284
285/**
286 * Completes a SCSI request and calls the completion handler.
287 *
288 * @returns nothing.
289 * @param pVScsiDevice The virtual SCSI device.
290 * @param pVScsiReq The request which completed.
291 * @param rcScsiCode The status code
292 * One of the SCSI_STATUS_* #defines.
293 * @param fRedoPossible Flag whether redo is possible.
294 * @param rcReq Informational return code of the request.
295 */
296void vscsiDeviceReqComplete(PVSCSIDEVICEINT pVScsiDevice, PVSCSIREQINT pVScsiReq,
297 int rcScsiCode, bool fRedoPossible, int rcReq);
298
299/**
300 * Init the sense data state.
301 *
302 * @returns nothing.
303 * @param pVScsiSense The SCSI sense data state to init.
304 */
305void vscsiSenseInit(PVSCSISENSE pVScsiSense);
306
307/**
308 * Sets a ok sense code.
309 *
310 * @returns SCSI status code.
311 * @param pVScsiSense The SCSI sense state to use.
312 * @param pVScsiReq The SCSI request.
313 */
314int vscsiReqSenseOkSet(PVSCSISENSE pVScsiSense, PVSCSIREQINT pVScsiReq);
315
316/**
317 * Sets an error sense code.
318 *
319 * @returns SCSI status code.
320 * @param pVScsiSense The SCSI sense state to use.
321 * @param pVScsiReq The SCSI request.
322 * @param uSCSISenseKey The SCSI sense key to set.
323 * @param uSCSIASC The ASC value.
324 * @param uSCSIASC The ASCQ value.
325 */
326int vscsiReqSenseErrorSet(PVSCSISENSE pVScsiSense, PVSCSIREQINT pVScsiReq, uint8_t uSCSISenseKey,
327 uint8_t uSCSIASC, uint8_t uSCSIASCQ);
328
329/**
330 * Sets an error sense code with additional information.
331 *
332 * @returns SCSI status code.
333 * @param pVScsiSense The SCSI sense state to use.
334 * @param pVScsiReq The SCSI request.
335 * @param uSCSISenseKey The SCSI sense key to set.
336 * @param uSCSIASC The ASC value.
337 * @param uSCSIASC The ASCQ value.
338 * @param uInfo The 32-bit sense information.
339 */
340int vscsiReqSenseErrorInfoSet(PVSCSISENSE pVScsiSense, PVSCSIREQINT pVScsiReq, uint8_t uSCSISenseKey,
341 uint8_t uSCSIASC, uint8_t uSCSIASCQ, uint32_t uInfo);
342
343/**
344 * Process a request sense command.
345 *
346 * @returns SCSI status code.
347 * @param pVScsiSense The SCSI sense state to use.
348 * @param pVScsiReq The SCSI request.
349 */
350int vscsiReqSenseCmd(PVSCSISENSE pVScsiSense, PVSCSIREQINT pVScsiReq);
351
352/**
353 * Inits the VPD page pool.
354 *
355 * @returns VBox status code.
356 * @param pVScsiVpdPool The VPD page pool to initialize.
357 */
358int vscsiVpdPagePoolInit(PVSCSIVPDPOOL pVScsiVpdPool);
359
360/**
361 * Destroys the given VPD page pool freeing all pages in it.
362 *
363 * @returns nothing.
364 * @param pVScsiVpdPool The VPD page pool to destroy.
365 */
366void vscsiVpdPagePoolDestroy(PVSCSIVPDPOOL pVScsiVpdPool);
367
368/**
369 * Allocates a new page in the VPD page pool with the given number.
370 *
371 * @returns VBox status code.
372 * @retval VERR_ALREADY_EXIST if the page number is in use.
373 * @param pVScsiVpdPool The VPD page pool the page will belong to.
374 * @param uPage The page number, must be unique.
375 * @param cbPage Size of the page in bytes.
376 * @param ppbPage Where to store the pointer to the raw page data on success.
377 */
378int vscsiVpdPagePoolAllocNewPage(PVSCSIVPDPOOL pVScsiVpdPool, uint8_t uPage, size_t cbPage, uint8_t **ppbPage);
379
380/**
381 * Queries the given page from the pool and cpies it to the buffer given
382 * by the SCSI request.
383 *
384 * @returns VBox status code.
385 * @retval VERR_NOT_FOUND if the page is not in the pool.
386 * @param pVScsiVpdPool The VPD page pool to use.
387 * @param pVScsiReq The SCSI request.
388 * @param uPage Page to query.
389 */
390int vscsiVpdPagePoolQueryPage(PVSCSIVPDPOOL pVScsiVpdPool, PVSCSIREQINT pVScsiReq, uint8_t uPage);
391
392/**
393 * Inits the I/O request related state for the LUN.
394 *
395 * @returns VBox status code.
396 * @param pVScsiLun The LUN instance.
397 */
398int vscsiIoReqInit(PVSCSILUNINT pVScsiLun);
399
400/**
401 * Enqueues a new flush request
402 *
403 * @returns VBox status code.
404 * @param pVScsiLun The LUN instance which issued the request.
405 * @param pVScsiReq The virtual SCSI request associated with the flush.
406 */
407int vscsiIoReqFlushEnqueue(PVSCSILUNINT pVScsiLun, PVSCSIREQINT pVScsiReq);
408
409/**
410 * Enqueue a new data transfer request.
411 *
412 * @returns VBox status code.
413 * @param pVScsiLun The LUN instance which issued the request.
414 * @param pVScsiReq The virtual SCSI request associated with the transfer.
415 * @param enmTxDir Transfer direction.
416 * @param uOffset Start offset of the transfer.
417 * @param cbTransfer Number of bytes to transfer.
418 */
419int vscsiIoReqTransferEnqueue(PVSCSILUNINT pVScsiLun, PVSCSIREQINT pVScsiReq,
420 VSCSIIOREQTXDIR enmTxDir, uint64_t uOffset,
421 size_t cbTransfer);
422
423/**
424 * Enqueue a new unmap request.
425 *
426 * @returns VBox status code.
427 * @param pVScsiLun The LUN instance which issued the request.
428 * @param pVScsiReq The virtual SCSI request associated with the transfer.
429 * @param paRanges The array of ranges to unmap.
430 * @param cRanges Number of ranges in the array.
431 */
432int vscsiIoReqUnmapEnqueue(PVSCSILUNINT pVScsiLun, PVSCSIREQINT pVScsiReq,
433 PRTRANGE paRanges, unsigned cRanges);
434
435/**
436 * Returns the current number of outstanding tasks on the given LUN.
437 *
438 * @returns Number of outstanding tasks.
439 * @param pVScsiLun The LUN to check.
440 */
441uint32_t vscsiIoReqOutstandingCountGet(PVSCSILUNINT pVScsiLun);
442
443/**
444 * Wrapper for the set I/O request allocation size I/O callback.
445 *
446 * @returns VBox status code.
447 * @param pVScsiLun The LUN.
448 * @param cbVScsiIoReqAlloc The additional size for the request to allocate.
449 */
450DECLINLINE(int) vscsiLunReqAllocSizeSet(PVSCSILUNINT pVScsiLun, size_t cbVScsiIoReqAlloc)
451{
452 return pVScsiLun->pVScsiLunIoCallbacks->pfnVScsiLunReqAllocSizeSet(pVScsiLun,
453 pVScsiLun->pvVScsiLunUser,
454 cbVScsiIoReqAlloc);
455}
456
457/**
458 * Wrapper for the allocate I/O request I/O callback.
459 *
460 * @returns VBox status code.
461 * @param pVScsiLun The LUN.
462 * @param u64Tag A unique tag to assign to the request.
463 * @param ppVScsiIoReq Where to store the pointer to the request on success.
464 */
465DECLINLINE(int) vscsiLunReqAlloc(PVSCSILUNINT pVScsiLun, uint64_t u64Tag, PVSCSIIOREQINT *ppVScsiIoReq)
466{
467 return pVScsiLun->pVScsiLunIoCallbacks->pfnVScsiLunReqAlloc(pVScsiLun,
468 pVScsiLun->pvVScsiLunUser,
469 u64Tag, ppVScsiIoReq);
470}
471
472/**
473 * Wrapper for the free I/O request I/O callback.
474 *
475 * @returns VBox status code.
476 * @param pVScsiLun The LUN.
477 * @param pVScsiIoReq The request to free.
478 */
479DECLINLINE(int) vscsiLunReqFree(PVSCSILUNINT pVScsiLun, PVSCSIIOREQINT pVScsiIoReq)
480{
481 return pVScsiLun->pVScsiLunIoCallbacks->pfnVScsiLunReqFree(pVScsiLun,
482 pVScsiLun->pvVScsiLunUser,
483 pVScsiIoReq);
484}
485
486/**
487 * Wrapper for the get medium size I/O callback.
488 *
489 * @returns VBox status code.
490 * @param pVScsiLun The LUN.
491 * @param pcbSize Where to store the size on success.
492 */
493DECLINLINE(int) vscsiLunMediumGetSize(PVSCSILUNINT pVScsiLun, uint64_t *pcbSize)
494{
495 return pVScsiLun->pVScsiLunIoCallbacks->pfnVScsiLunMediumGetSize(pVScsiLun,
496 pVScsiLun->pvVScsiLunUser,
497 pcbSize);
498}
499
500/**
501 * Wrapper for the get medium sector size I/O callback.
502 *
503 * @returns VBox status code.
504 * @param pVScsiLun The LUN.
505 * @param pcbSectorSize Where to store the sector size on success.
506 */
507DECLINLINE(int) vscsiLunMediumGetSectorSize(PVSCSILUNINT pVScsiLun, uint32_t *pcbSectorSize)
508{
509 return pVScsiLun->pVScsiLunIoCallbacks->pfnVScsiLunMediumGetSectorSize(pVScsiLun,
510 pVScsiLun->pvVScsiLunUser,
511 pcbSectorSize);
512}
513
514/**
515 * Wrapper for the get medium lock/unlock I/O callback.
516 *
517 * @returns VBox status code.
518 * @param pVScsiLun The LUN.
519 * @param bool The new medium lock state.
520 */
521DECLINLINE(int) vscsiLunMediumSetLock(PVSCSILUNINT pVScsiLun, bool fLocked)
522{
523 return pVScsiLun->pVScsiLunIoCallbacks->pfnVScsiLunMediumSetLock(pVScsiLun,
524 pVScsiLun->pvVScsiLunUser,
525 fLocked);
526}
527
528/**
529 * Wrapper for the eject medium I/O callback.
530 *
531 * @returns VBox status code.
532 * @param pVScsiLun The LUN.
533 */
534DECLINLINE(int) vscsiLunMediumEject(PVSCSILUNINT pVScsiLun)
535{
536 return pVScsiLun->pVScsiLunIoCallbacks->pfnVScsiLunMediumEject(pVScsiLun,
537 pVScsiLun->pvVScsiLunUser);
538}
539
540/**
541 * Wrapper for the I/O request enqueue I/O callback.
542 *
543 * @returns VBox status code.
544 * @param pVScsiLun The LUN.
545 * @param pVScsiIoReq The I/O request to enqueue.
546 */
547DECLINLINE(int) vscsiLunReqTransferEnqueue(PVSCSILUNINT pVScsiLun, PVSCSIIOREQINT pVScsiIoReq)
548{
549 return pVScsiLun->pVScsiLunIoCallbacks->pfnVScsiLunReqTransferEnqueue(pVScsiLun,
550 pVScsiLun->pvVScsiLunUser,
551 pVScsiIoReq);
552}
553
554/**
555 * Wrapper for the get feature flags I/O callback.
556 *
557 * @returns VBox status code.
558 * @param pVScsiLun The LUN.
559 * @param pVScsiIoReq The I/O request to enqueue.
560 */
561DECLINLINE(int) vscsiLunGetFeatureFlags(PVSCSILUNINT pVScsiLun, uint64_t *pfFeatures)
562{
563 return pVScsiLun->pVScsiLunIoCallbacks->pfnVScsiLunGetFeatureFlags(pVScsiLun,
564 pVScsiLun->pvVScsiLunUser,
565 pfFeatures);
566}
567
568/**
569 * Wrapper around vscsiReqSenseOkSet()
570 */
571DECLINLINE(int) vscsiLunReqSenseOkSet(PVSCSILUNINT pVScsiLun, PVSCSIREQINT pVScsiReq)
572{
573 return vscsiReqSenseOkSet(&pVScsiLun->pVScsiDevice->VScsiSense, pVScsiReq);
574}
575
576/**
577 * Wrapper around vscsiReqSenseErrorSet()
578 */
579DECLINLINE(int) vscsiLunReqSenseErrorSet(PVSCSILUNINT pVScsiLun, PVSCSIREQINT pVScsiReq, uint8_t uSCSISenseKey, uint8_t uSCSIASC, uint8_t uSCSIASCQ)
580{
581 return vscsiReqSenseErrorSet(&pVScsiLun->pVScsiDevice->VScsiSense, pVScsiReq, uSCSISenseKey, uSCSIASC, uSCSIASCQ);
582}
583
584/**
585 * Wrapper around vscsiReqSenseErrorInfoSet()
586 */
587DECLINLINE(int) vscsiLunReqSenseErrorInfoSet(PVSCSILUNINT pVScsiLun, PVSCSIREQINT pVScsiReq, uint8_t uSCSISenseKey, uint8_t uSCSIASC, uint8_t uSCSIASCQ, uint32_t uInfo)
588{
589 return vscsiReqSenseErrorInfoSet(&pVScsiLun->pVScsiDevice->VScsiSense, pVScsiReq, uSCSISenseKey, uSCSIASC, uSCSIASCQ, uInfo);
590}
591
592#endif /* ___VSCSIInternal_h */
593
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette