#include <data.h>


Definition at line 128 of file data.h.
Public Types | |
| enum | Page_t { pg_DEVCFG = 0x10, pg_PART = 0x11, pg_ELEMADDR = 0x1D, pg_AITCFG = 0x31, pg_AIT_APPENDPART = 0x32, pg_COMPRESSION = 0x0F } |
| enum | MediumType_t { mt_HP_RW = 0x00, mt_HP_WORM = 0x01, mt_HP_CD_EMUL = 0x80, mt_IBM_ULTRIUM_3_WORM = 0x3C, mt_IBM_ULTRIUM_4_WORM = 0x4C } |
Public Member Functions | |
| data_Mode (Page_t a_what) | |
| virtual | ~data_Mode () |
| Page_t | GetPage () const |
| const data_Mode_t & | GetModeStruct () const |
| UInt8_t | GetPartCount () const |
| UInt32_t | GetPartSize (UInt8_t a_partNo) const |
| UInt8_t | GetCurPartNumber () const |
| UInt8_t | GetDensityCode () const |
| bool | IsMediumWORM () const |
| bool | GetCompressionStatus () const |
| void | SetCompressionStatus (bool a_compression) |
| void | SetPage (Page_t a_page) |
| void | SetPartitions (vector< UInt32_t > a_partSizes) |
| Prepare a tape partitioning MODE page (pg_PART) and appending partition (pg_AIT_APPENDPART). | |
| void | SetAITMode (Mode_t a_aitMode) |
| Set AIT tape mode. | |
| void | SetAITUnloadAtPBOT (bool a_status) |
| Set ulpbot bit. | |
Private Attributes | |
| log_CLASSID_m | |
| data_Mode_t | m_mode |
| enum data_Mode::Page_t |
| pg_DEVCFG | For tape drive. |
| pg_PART | For tape drive. |
| pg_ELEMADDR | For exchanger. |
| pg_AITCFG | AIT tape drive configuration. |
| pg_AIT_APPENDPART | AIT: Append partition. |
| pg_COMPRESSION | Compression. |
Definition at line 130 of file data.h.
00130 { 00132 pg_DEVCFG = 0x10, 00134 pg_PART = 0x11, 00136 pg_ELEMADDR = 0x1D, 00138 pg_AITCFG = 0x31, 00140 pg_AIT_APPENDPART = 0x32, 00142 pg_COMPRESSION = 0x0F 00143 } Page_t;
| mt_HP_RW | Read/write medium. |
| mt_HP_WORM | WORM medium. |
| mt_HP_CD_EMUL | CD emulation mode. |
| mt_IBM_ULTRIUM_3_WORM | See SCSI reference for IBM TotalStorage LTO Ultrium Tape Drive. |
| mt_IBM_ULTRIUM_4_WORM |
Definition at line 145 of file data.h.
00145 { 00147 mt_HP_RW = 0x00, 00149 mt_HP_WORM = 0x01, 00151 mt_HP_CD_EMUL = 0x80, 00152 00154 mt_IBM_ULTRIUM_3_WORM = 0x3C, 00155 mt_IBM_ULTRIUM_4_WORM = 0x4C 00156 00157 } MediumType_t;
| data_Mode::data_Mode | ( | Page_t | a_what | ) |
Definition at line 35 of file data_mode.cpp.
References data_ModePartitions_t::blkDesc, data_ModeHdr_t::blkDescLen, data_Mode_t::hdr, log_FUNC_m, m_mode, data_Mode_t::part, and SetPage().
00035 { 00036 log_FUNC_m(data_Mode); 00037 memset (&m_mode, 0, sizeof(m_mode)); 00038 00039 SetPage(a_what); 00040 00041 m_mode.hdr.blkDescLen = sizeof(m_mode.part.blkDesc); 00042 }

| data_Mode::~data_Mode | ( | ) | [virtual] |
| data_Mode::Page_t data_Mode::GetPage | ( | ) | const |
Definition at line 54 of file data_mode.cpp.
References data_ModePartitions_t::blkDesc, data_ModeHdr_t::blkDescLen, cmn_Num2Str(), data_ModePartPage_t::code, data_Mode_t::hdr, ie_INVALID_ARG, m_mode, data_Mode_t::part, and data_ModePartitions_t::partPage.
Referenced by cdb_ModeSense::cdb_ModeSense(), cdb_ModeSelect::GetBufferSize(), GetCurPartNumber(), GetDensityCode(), and IsMediumWORM().
00054 { 00055 if (m_mode.hdr.blkDescLen != sizeof(m_mode.part.blkDesc)) { 00056 throw ivd_InternalError( 00057 ie_INVALID_ARG, 00058 "BUG: MODE Block Descriptor should be " + 00059 cmn_Num2Str(sizeof(m_mode.part.blkDesc)) + 00060 " but is " + 00061 cmn_Num2Str(m_mode.hdr.blkDescLen) ); 00062 } 00063 return (Page_t)(m_mode.part.partPage.code); 00064 }


| const data_Mode_t & data_Mode::GetModeStruct | ( | ) | const |
Definition at line 66 of file data_mode.cpp.
References log_FUNC_m, and m_mode.
Referenced by Ait(), bea_MicMemory::Detect(), bea_TapeMedium::DetectAITWORM(), Ea(), cdb_ModeSense::GetBufferPointer(), cdb_ModeSelect::GetBufferPointer(), cdb_ModeSense::GetBufferSize(), cdb_ModeSelect::GetBufferSize(), Pi(), and la_SCSILibrary::ReadElementAssignment().
00066 { 00067 log_FUNC_m(GetModeStruct); 00068 return m_mode; 00069 }

| UInt8_t data_Mode::GetPartCount | ( | ) | const |
Definition at line 71 of file data_mode.cpp.
References data_ModePartPage_t::addPart, data_ModePartitions_t::blkDesc, data_ModeHdr_t::blkDescLen, cmn_Num2Str(), data_ModePartPage_t::code, data_Mode_t::hdr, ie_INVALID_ARG, log_FUNC_m, m_mode, data_ModePartPage_t::maxAddPart, data_Mode_t::part, data_ModePartitions_t::partPage, and pg_PART.
Referenced by Append(), Ci(), Fmt(), GetCapacityInfo(), ParseTapeMedium(), Pi(), and bea_TapeMedium::RefreshTapeInfo().
00071 { 00072 00073 if (m_mode.hdr.blkDescLen != sizeof(m_mode.part.blkDesc)) { 00074 log_FUNC_m(GetPartCount); 00075 throw ivd_InternalError( 00076 ie_INVALID_ARG, 00077 "BUG: MODE Block Descriptor should be " + 00078 cmn_Num2Str(sizeof(m_mode.part.blkDesc)) + 00079 " but is " + 00080 cmn_Num2Str(m_mode.hdr.blkDescLen) ); 00081 } 00082 00083 const data_ModePartPage_t &part = m_mode.part.partPage; 00084 00085 if ((Page_t)part.code != pg_PART) { 00086 return 0; 00087 } 00088 00089 if (part.maxAddPart == 0) { 00090 return 1; 00091 } 00092 00093 return part.addPart + 1; 00094 }


Definition at line 170 of file data_mode.cpp.
References data_ModePartitions_t::blkDesc, data_ModeHdr_t::blkDescLen, cmn_IntPow(), cmn_Num2Str(), data_ModePartPage_t::code, dbg_NORM, data_Mode_t::hdr, ie_INVALID_ARG, log_DBG_m, log_FUNC_m, m_mode, ntoh(), data_Mode_t::part, data_ModePartitions_t::partPage, data_ModePartPage_t::partUnits, pg_PART, data_ModePartPage_t::psum, data_ModePartitions_t::size, and size.
Referenced by Append(), Fmt(), ParseTapeMedium(), Pi(), and bea_TapeMedium::RefreshTapeInfo().
00170 { 00171 log_FUNC_m(GetPartSize); 00172 00173 if (m_mode.hdr.blkDescLen != sizeof(m_mode.part.blkDesc)) { 00174 throw ivd_InternalError( 00175 ie_INVALID_ARG, 00176 "BUG: MODE Block Descriptor should be " + 00177 cmn_Num2Str(sizeof(m_mode.part.blkDesc)) + 00178 " but is " + 00179 cmn_Num2Str(m_mode.hdr.blkDescLen) ); 00180 } 00181 00182 const data_ModePartitions_t &part = m_mode.part; 00183 00184 if ((Page_t)part.partPage.code != pg_PART) { 00185 return 0; 00186 } 00187 00188 UInt64_t m; 00189 scsi_Wrapper16 size(part.size[a_partNo]); 00190 00191 UInt64_t ps = UInt64_t(ntoh(size)); 00192 00193 switch (part.partPage.psum) { 00194 case 0: 00195 m = 1; 00196 log_DBG_m(dbg_NORM, "Size in bytes: " << ps); 00197 break; 00198 case 1: 00199 m = 1024; 00200 log_DBG_m(dbg_NORM, "Size in kiB: " << ps); 00201 break; 00202 case 2: 00203 m = (1024 * 1024); 00204 log_DBG_m(dbg_NORM, "Size in MiB: " << ps); 00205 break; 00206 case 3: 00207 m = cmn_IntPow(UInt32_t(10), UInt32_t(part.partPage.partUnits)); 00208 log_DBG_m(dbg_NORM, 00209 "Size in 10^" << UInt32_t(part.partPage.partUnits) << 00210 ": " << ps); 00211 break; 00212 default: m = 0; 00213 m = 0; 00214 log_DBG_m(dbg_NORM, "Unknown size unit!!"); 00215 break; 00216 } 00217 00218 // Convert to MB. 00219 return ( (m * ps) / (1024 * 1024) ); 00220 }


| UInt8_t data_Mode::GetCurPartNumber | ( | ) | const |
Definition at line 134 of file data_mode.cpp.
References data_ModeDevCfgPage_t::activePart, data_ModeDevConfig_t::cfgPage, data_Mode_t::devcfg, GetPage(), ie_INVALID_ARG, ivd_Error, log_FUNC_m, m_mode, and pg_DEVCFG.
Referenced by Pn(), and bea_TapeMedium::ReadCurrentVolume().
00134 { 00135 if (GetPage() != pg_DEVCFG) { 00136 log_FUNC_m(GetCurPartNumber); 00137 throw ivd_Error( 00138 ie_INVALID_ARG, 00139 "Expected page DEVINFO, but not found."); 00140 } 00141 return (m_mode.devcfg.cfgPage.activePart); 00142 }


| UInt8_t data_Mode::GetDensityCode | ( | ) | const |
Definition at line 144 of file data_mode.cpp.
References data_ModeDevConfig_t::blkDesc, data_ModeGenBlkDesc_t::densityCode, data_Mode_t::devcfg, GetPage(), ie_INVALID_ARG, ivd_Error, log_FUNC_m, m_mode, and pg_DEVCFG.
Referenced by bea_TapeMedium::RefreshTapeInfo().
00144 { 00145 if (GetPage() != pg_DEVCFG) { 00146 log_FUNC_m(GetDensityCode); 00147 throw ivd_Error( 00148 ie_INVALID_ARG, 00149 "Expected page DEVINFO, but not found."); 00150 } 00151 return (m_mode.devcfg.blkDesc.densityCode); 00152 }


| bool data_Mode::IsMediumWORM | ( | ) | const |
Definition at line 154 of file data_mode.cpp.
References GetPage(), data_Mode_t::hdr, ie_INVALID_ARG, ivd_Error, log_FUNC_m, m_mode, data_ModeHdr_t::medType, mt_HP_WORM, mt_IBM_ULTRIUM_3_WORM, mt_IBM_ULTRIUM_4_WORM, and pg_DEVCFG.
Referenced by bea_TapeMedium::DetectLTOWORM(), and Mamisworm().
00154 { 00155 if (GetPage() != pg_DEVCFG) { 00156 log_FUNC_m(IsMediumWorm); 00157 throw ivd_Error(ie_INVALID_ARG, 00158 "Expected page DEVINFO, but not found."); 00159 } 00160 00161 if ( (m_mode.hdr.medType == mt_HP_WORM) 00162 || (m_mode.hdr.medType == mt_IBM_ULTRIUM_3_WORM) 00163 || (m_mode.hdr.medType == mt_IBM_ULTRIUM_4_WORM) ) { 00164 return true; 00165 } 00166 00167 return false; 00168 }


| bool data_Mode::GetCompressionStatus | ( | ) | const |
Definition at line 96 of file data_mode.cpp.
References data_ModeCompress_t::blkDesc, data_ModeHdr_t::blkDescLen, cmn_Num2Str(), data_Mode_t::compress, data_ModeCompress_t::compressPage, data_ModeCompressPage_t::dce, data_Mode_t::hdr, ie_INVALID_ARG, log_FUNC_m, and m_mode.
Referenced by Compression(), and bea_TapeMedium::RefreshCompressionState().
00096 { 00097 if (m_mode.hdr.blkDescLen != sizeof(m_mode.compress.blkDesc)) { 00098 log_FUNC_m(GetCompressionStatus); 00099 throw ivd_InternalError( 00100 ie_INVALID_ARG, 00101 "BUG: MODE Block Descriptor should be " + 00102 cmn_Num2Str(sizeof(m_mode.compress.blkDesc)) + 00103 " but is " + 00104 cmn_Num2Str(m_mode.hdr.blkDescLen) ); 00105 } 00106 if (m_mode.compress.compressPage.dce) { 00107 return true; 00108 } 00109 else { 00110 return false; 00111 } 00112 }


| void data_Mode::SetCompressionStatus | ( | bool | a_compression | ) |
Definition at line 114 of file data_mode.cpp.
References data_ModeCompress_t::blkDesc, data_ModeHdr_t::blkDescLen, cmn_Num2Str(), data_Mode_t::compress, data_ModeCompress_t::compressPage, data_ModeCompressPage_t::dce, data_Mode_t::hdr, ie_INVALID_ARG, log_FUNC_m, m_mode, and data_ModeHdr_t::modeLen.
Referenced by Compression(), and bea_TapeMedium::RefreshCompressionState().
00114 { //compress true <=> ON , false <=> OFF 00115 log_FUNC_m(SetCompressionStatus); 00116 if (m_mode.hdr.blkDescLen != sizeof(m_mode.compress.blkDesc)) { 00117 throw ivd_InternalError( 00118 ie_INVALID_ARG, 00119 "BUG: MODE Block Descriptor should be " + 00120 cmn_Num2Str(sizeof(m_mode.compress.blkDesc)) + 00121 " but is " + 00122 cmn_Num2Str(m_mode.hdr.blkDescLen) ); 00123 } 00124 if (a_compression) { 00125 m_mode.compress.compressPage.dce = 1; 00126 } 00127 else { 00128 m_mode.compress.compressPage.dce = 0; 00129 } 00130 // needs to be set to 0, but log select sets it to 0x1B 00131 m_mode.hdr.modeLen = 0; 00132 }


| void data_Mode::SetPage | ( | data_Mode::Page_t | a_page | ) |
Definition at line 48 of file data_mode.cpp.
References data_ModePartPage_t::code, m_mode, data_Mode_t::part, and data_ModePartitions_t::partPage.
Referenced by Append(), bea_TapeMedium::AppendVolume(), and data_Mode().
00048 { 00049 // First part of the union overlaps. It does not matter, 00050 // whether we use part or ait to set values. 00051 m_mode.part.partPage.code = static_cast<UInt8_t>(a_page); 00052 }

Prepare a tape partitioning MODE page (pg_PART) and appending partition (pg_AIT_APPENDPART).
Values passed are in MB.
Definition at line 228 of file data_mode.cpp.
References data_ModePartPage_t::addp, data_ModePartPage_t::addPart, data_ModePartitions_t::blkDesc, data_ModeHdr_t::blkDescLen, data_ModePartPage_t::clear, cmn_Num2Str(), data_ModePartPage_t::code, dbg_LOW, dbg_NORM, data_ModePartPage_t::fdp, data_ModePartPage_t::fmtRec, data_Mode_t::hdr, hton(), data_ModePartPage_t::idp, ie_INVALID_ARG, ivd_Error, log_DBG_m, log_FUNC_m, log_WRN_m, m_mode, data_ModePartPage_t::maxAddPart, data_ModeHdr_t::medType, data_ModeHdr_t::modeLen, data_ModePartPage_t::pageLen, data_Mode_t::part, data_ModePartitions_t::partPage, data_ModePartPage_t::partUnits, pg_AIT_APPENDPART, pg_PART, data_ModePartPage_t::pofm, data_ModePartPage_t::psum, data_ModePartPage_t::sdp, size, and data_ModePartitions_t::size.
Referenced by Append(), bea_TapeMedium::AppendVolume(), Fmt(), and bea_TapeMedium::Format().
00228 { 00229 log_FUNC_m(SetPartitions); 00230 00231 if (m_mode.hdr.blkDescLen != sizeof(m_mode.part.blkDesc)) { 00232 throw ivd_InternalError( 00233 ie_INVALID_ARG, 00234 "BUG: MODE Block Descriptor should be " + 00235 cmn_Num2Str(sizeof(m_mode.part.blkDesc)) + 00236 " but is " + 00237 cmn_Num2Str(m_mode.hdr.blkDescLen) ); 00238 } 00239 00240 data_ModePartitions_t &part = m_mode.part; 00241 00242 if (static_cast<Page_t>(part.partPage.code) == pg_AIT_APPENDPART) { 00243 if (a_partSizes.size() != 1) { 00244 throw ivd_Error( 00245 ie_INVALID_ARG, 00246 "Page pg_AIT_APPENDPART expects exactly one partition size."); 00247 } 00248 } 00249 else if ((Page_t)part.partPage.code != pg_PART) { 00250 log_WRN_m( 00251 "Mode page is " << static_cast<int>(part.partPage.code) << 00252 ". Expected " << static_cast<int>(pg_PART) ); 00253 part.partPage.code = pg_PART; 00254 } 00255 00256 // ****************************************************************** 00257 // Check for the unit that must be used to format this medium 00258 // AIT default units: MB 00259 // If any of the partitions exceeds 2^16-1 then a bigger unit must 00260 // be used. 00261 UInt16_t delimiter(1); 00262 UInt8_t unit(0); 00263 static const UInt32_t mbLimit(0xFFFF); 00264 00265 // Find the maximum values for the delimiter and unit 00266 for (UInt32_t i = 0; i < a_partSizes.size() ; i++) { 00267 if (a_partSizes[i] > mbLimit) { 00268 UInt16_t d = a_partSizes[i]/mbLimit; 00269 UInt16_t u(0); 00270 00271 if (d < 10) { d = 10, u = 7; } 00272 else if(d < 100) { d = 100, u = 8; } 00273 else { d = 1000, u = 9; } 00274 00275 if (d > delimiter) { 00276 delimiter = d, unit = u; 00277 } 00278 } 00279 }; 00280 00281 log_DBG_m(dbg_LOW, 00282 "Size delimiter: " << delimiter << 00283 ", unit: " << int(unit) ); 00284 00285 if (delimiter > 1) { 00286 part.partPage.psum = 3; 00287 } 00288 else { 00289 part.partPage.psum = 2; 00290 }; 00291 part.partPage.partUnits = unit; 00292 // ****************************************************************** 00293 00294 if (a_partSizes.size() <= 1) { 00295 log_DBG_m(dbg_NORM, "Number of additional partitions: 0" ); 00296 part.partPage.addPart = 0; 00297 scsi_Wrapper16 sizeW(part.size[0]); 00298 sizeW = 0; 00299 } 00300 else { 00301 part.partPage.addPart = a_partSizes.size() - 1; 00302 log_DBG_m(dbg_NORM, 00303 "Number of additional partitions: " << 00304 (int)(part.partPage.addPart)); 00305 } 00306 00307 if ( a_partSizes.size() > 1 00308 || static_cast<Page_t>(part.partPage.code) == pg_AIT_APPENDPART) { 00309 00310 for (UInt32_t i = 0; i < a_partSizes.size() ; i++) { 00311 // Convert the sizes as determined above 00312 UInt16_t size = a_partSizes[i]/delimiter; 00313 UInt16_t netSize (hton(size)); 00314 00315 scsi_Wrapper16 sizeW(part.size[i]); 00316 sizeW = netSize; 00317 00318 log_DBG_m(dbg_NORM, (i+1) << ". volume: " << size); 00319 } 00320 } 00321 00322 // These two bytes are reserved (and must be 0) for MODE SELECT. 00323 m_mode.hdr.modeLen = 0; 00324 m_mode.hdr.medType = 0; 00325 00326 if ( static_cast<Page_t>(part.partPage.code) == pg_AIT_APPENDPART ) { 00327 // Reset reserved fields for appending partition 00328 part.partPage.maxAddPart = 0; 00329 part.partPage.addp = 0; 00330 part.partPage.clear = 0; 00331 part.partPage.pofm = 0; 00332 part.partPage.idp = 0; 00333 part.partPage.sdp = 0; 00334 part.partPage.fdp = 0; 00335 part.partPage.fmtRec = 0; 00336 } 00337 else { 00338 part.partPage.idp = 1; 00339 } 00340 00341 // pageLen means the amount of data that follows pageLen field. 00342 // Therefore the "- 2". 00343 part.partPage.pageLen = 00344 sizeof(part.partPage) - 2 + 00345 (part.partPage.addPart+1) * sizeof(UInt16_t); 00346 }


| void data_Mode::SetAITMode | ( | Mode_t | a_aitMode | ) |
Set AIT tape mode.
Definition at line 351 of file data_mode.cpp.
References data_ModeAITConfigPage_t::abs, data_ModeAITConfigPage_t::ait, data_Mode_t::ait, data_ModeAIT_t::aitPage, data_ModePartitions_t::blkDesc, data_ModeHdr_t::blkDescLen, cmn_Num2Str(), data_ModeAITConfigPage_t::code, data_ModeAITConfigPage_t::device, data_Mode_t::hdr, ie_INVALID_ARG, log_FUNC_m, log_WRN_m, m_mode, data_ModeHdr_t::medType, mode_DDS, data_ModeHdr_t::modeLen, data_Mode_t::part, pg_AITCFG, data_ModeAITConfigPage_t::span, data_ModeAITConfigPage_t::sysLogAlive, and data_ModeAITConfigPage_t::ulpbot.
Referenced by Fmt(), and bea_TapeMedium::Format().
00351 { 00352 log_FUNC_m(SetAITMode); 00353 00354 if (m_mode.hdr.blkDescLen != sizeof(m_mode.part.blkDesc)) { 00355 throw ivd_InternalError( 00356 ie_INVALID_ARG, 00357 "BUG: MODE Block Descriptor should be " + 00358 cmn_Num2Str(sizeof(m_mode.part.blkDesc)) + 00359 " but is " + 00360 cmn_Num2Str(m_mode.hdr.blkDescLen) ); 00361 } 00362 00363 data_ModeAITConfigPage_t &ait = m_mode.ait.aitPage; 00364 00365 if ((Page_t)ait.code != pg_AITCFG) { 00366 log_WRN_m( 00367 "Mode page is " << ait.code << 00368 ". Expected " << pg_AITCFG); 00369 ait.code = pg_AITCFG; 00370 } 00371 00372 // These two bytes are reserved (and must be 0) for MODE SELECT. 00373 m_mode.hdr.modeLen = 0; 00374 m_mode.hdr.medType = 0; 00375 00376 if (a_aitMode == mode_DDS) { 00377 // AIT in DDS mode: AIT must be 0, DEVICE 0 and ULPBOT 1 00378 ait.ait = 0; 00379 ait.device = 0; // Do not create optional device area 00380 ait.ulpbot = 1; // Load/unload must be performed at 00381 // the device area located at PBOT, 00382 // even if there is an Optional Device Area. 00383 } 00384 else { 00385 //AIT in AIT mode: AIT must be 1, DEVICE 1 and ULPBOT 0 00386 ait.ait = 1; 00387 ait.device = 1; // Create optional device area 00388 ait.ulpbot = 0; // Load/unload is performed at the Optional Device Area, 00389 // except for partition 0, not in the beginning of tape 00390 } 00391 00392 ait.abs = 1; 00393 ait.sysLogAlive = 3; // BIN: 11 00394 ait.span = 0x0a; 00395 }


| void data_Mode::SetAITUnloadAtPBOT | ( | bool | a_status | ) |
Set ulpbot bit.
Definition at line 400 of file data_mode.cpp.
References data_Mode_t::ait, data_ModeAIT_t::aitPage, log_FUNC_m, m_mode, and data_ModeAITConfigPage_t::ulpbot.
Referenced by bea_TapeMedium::Format().
00400 { 00401 log_FUNC_m(SetAITUnloadAtPBOT); 00402 m_mode.ait.aitPage.ulpbot = a_status; 00403 }

data_Mode::log_CLASSID_m [private] |
data_Mode_t data_Mode::m_mode [private] |
Definition at line 182 of file data.h.
Referenced by data_Mode(), GetCompressionStatus(), GetCurPartNumber(), GetDensityCode(), GetModeStruct(), GetPage(), GetPartCount(), GetPartSize(), IsMediumWORM(), SetAITMode(), SetAITUnloadAtPBOT(), SetCompressionStatus(), SetPage(), and SetPartitions().
1.5.6