manageiq-smartstate 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +15 -0
- data/.rspec +4 -0
- data/.rspec_ci +4 -0
- data/.travis.yml +15 -0
- data/Gemfile +9 -0
- data/LICENSE.txt +202 -0
- data/README.md +45 -0
- data/Rakefile +23 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/lib/MiqContainerGroup/MiqContainerGroup.rb +31 -0
- data/lib/MiqVm/MiqLocalVm.rb +50 -0
- data/lib/MiqVm/MiqRhevmVm.rb +179 -0
- data/lib/MiqVm/MiqVm.rb +355 -0
- data/lib/MiqVm/miq_azure_vm.rb +96 -0
- data/lib/MiqVm/miq_scvmm_vm.rb +38 -0
- data/lib/MiqVm/test/camcorder_fleece_test.rb +60 -0
- data/lib/MiqVm/test/localVm.rb +45 -0
- data/lib/MiqVm/test/partitionAlignmentCheck.rb +76 -0
- data/lib/MiqVm/test/remoteVm.rb +65 -0
- data/lib/MiqVm/test/rhevmNfsTest.rb +62 -0
- data/lib/MiqVm/test/rhevmNfsTest2.rb +66 -0
- data/lib/MiqVm/test/rhevmTest.rb +70 -0
- data/lib/OpenStackExtract/MiqOpenStackVm/MiqOpenStackCommon.rb +107 -0
- data/lib/OpenStackExtract/MiqOpenStackVm/MiqOpenStackImage.rb +67 -0
- data/lib/OpenStackExtract/MiqOpenStackVm/MiqOpenStackInstance.rb +182 -0
- data/lib/Scvmm/miq_hyperv_disk.rb +273 -0
- data/lib/Scvmm/miq_scvmm_parse_powershell.rb +75 -0
- data/lib/Scvmm/miq_scvmm_vm_ssa_info.rb +135 -0
- data/lib/Scvmm/test/miq_hyperv_disk_test.rb +33 -0
- data/lib/Scvmm/test/miq_scvmm_vm_ssa_info_test.rb +41 -0
- data/lib/VmLocalDiskAccess/test/localCfg.rb +97 -0
- data/lib/VolumeManager/LVM/logical_volume.rb +75 -0
- data/lib/VolumeManager/LVM/lv_segment.rb +43 -0
- data/lib/VolumeManager/LVM/lvm2disk.rb +158 -0
- data/lib/VolumeManager/LVM/parser.rb +138 -0
- data/lib/VolumeManager/LVM/physical_volume.rb +19 -0
- data/lib/VolumeManager/LVM/scanner.rb +156 -0
- data/lib/VolumeManager/LVM/thin/btree.rb +83 -0
- data/lib/VolumeManager/LVM/thin/constants.rb +86 -0
- data/lib/VolumeManager/LVM/thin/data_map.rb +44 -0
- data/lib/VolumeManager/LVM/thin/mapping_tree.rb +19 -0
- data/lib/VolumeManager/LVM/thin/space_maps.rb +58 -0
- data/lib/VolumeManager/LVM/thin/superblock.rb +136 -0
- data/lib/VolumeManager/LVM/thin.rb +6 -0
- data/lib/VolumeManager/LVM/volume_group.rb +97 -0
- data/lib/VolumeManager/LVM.rb +8 -0
- data/lib/VolumeManager/MiqLdm.rb +546 -0
- data/lib/VolumeManager/MiqLvm.rb +17 -0
- data/lib/VolumeManager/MiqNativeVolumeManager.rb +150 -0
- data/lib/VolumeManager/MiqVolumeManager.rb +277 -0
- data/lib/VolumeManager/VolMgrPlatformSupport.rb +18 -0
- data/lib/VolumeManager/VolMgrPlatformSupportLinux.rb +77 -0
- data/lib/VolumeManager/VolMgrPlatformSupportWin.rb +17 -0
- data/lib/VolumeManager/test/blockDevTest.rb +40 -0
- data/lib/VolumeManager/test/ldm.rb +97 -0
- data/lib/blackbox/VmBlackBox.rb +103 -0
- data/lib/blackbox/xmlStorage.rb +180 -0
- data/lib/db/MiqBdb/MiqBdb.rb +309 -0
- data/lib/db/MiqBdb/MiqBdbBtree.rb +219 -0
- data/lib/db/MiqBdb/MiqBdbHash.rb +199 -0
- data/lib/db/MiqBdb/MiqBdbPage.rb +159 -0
- data/lib/db/MiqBdb/MiqBdbUtil.rb +18 -0
- data/lib/db/MiqSqlite/MiqSqlite3.rb +330 -0
- data/lib/db/MiqSqlite/MiqSqlite3Cell.rb +167 -0
- data/lib/db/MiqSqlite/MiqSqlite3Page.rb +151 -0
- data/lib/db/MiqSqlite/MiqSqlite3Table.rb +124 -0
- data/lib/db/MiqSqlite/MiqSqlite3Util.rb +32 -0
- data/lib/disk/DiskProbe.rb +68 -0
- data/lib/disk/MiqDisk.rb +317 -0
- data/lib/disk/camcorder_test.rb +90 -0
- data/lib/disk/dos_mbr.img +0 -0
- data/lib/disk/modules/AzureBlobDisk.rb +101 -0
- data/lib/disk/modules/LocalDevMod.rb +47 -0
- data/lib/disk/modules/LocalDevProbe.rb +6 -0
- data/lib/disk/modules/MSCommon.rb +352 -0
- data/lib/disk/modules/MSVSDiffDisk.rb +91 -0
- data/lib/disk/modules/MSVSDiskProbe.rb +61 -0
- data/lib/disk/modules/MSVSDynamicDisk.rb +42 -0
- data/lib/disk/modules/MSVSFixedDisk.rb +45 -0
- data/lib/disk/modules/MiqLargeFile.rb +63 -0
- data/lib/disk/modules/MiqLargeFileWin32.rb +107 -0
- data/lib/disk/modules/QcowDisk.rb +692 -0
- data/lib/disk/modules/QcowDiskProbe.rb +34 -0
- data/lib/disk/modules/RawBlockIO.rb +116 -0
- data/lib/disk/modules/RawDisk.rb +45 -0
- data/lib/disk/modules/RawDiskProbe.rb +7 -0
- data/lib/disk/modules/RhevmDescriptor.rb +167 -0
- data/lib/disk/modules/RhevmDiskProbe.rb +52 -0
- data/lib/disk/modules/VMWareCowdDisk.rb +207 -0
- data/lib/disk/modules/VMWareDescriptor.rb +214 -0
- data/lib/disk/modules/VMWareDiskProbe.rb +74 -0
- data/lib/disk/modules/VMWareSparseDisk.rb +189 -0
- data/lib/disk/modules/VhdxDisk.rb +625 -0
- data/lib/disk/modules/VhdxDiskProbe.rb +46 -0
- data/lib/disk/modules/VixDiskMod.rb +54 -0
- data/lib/disk/modules/VixDiskProbe.rb +6 -0
- data/lib/disk/modules/miq_disk_cache.rb +135 -0
- data/lib/disk/modules/miq_dummy_disk.rb +41 -0
- data/lib/disk/modules/vhdx_bat_entry.rb +10 -0
- data/lib/disk/test.rb +66 -0
- data/lib/fs/MetakitFS/MetakitFS.rb +530 -0
- data/lib/fs/MetakitFS/test/Makefile +14 -0
- data/lib/fs/MetakitFS/test/MkCollectFiles.rb +165 -0
- data/lib/fs/MetakitFS/test/MkSelectFiles.rb +30 -0
- data/lib/fs/MetakitFS/test/collect_files.yaml +70 -0
- data/lib/fs/MetakitFS/test/init.rb +3 -0
- data/lib/fs/MetakitFS/test/mk2vmdk.rb +64 -0
- data/lib/fs/MetakitFS/test/mk4test.c +92 -0
- data/lib/fs/MetakitFS/test/mkFsTest.rb +113 -0
- data/lib/fs/MetakitFS/test/proto.rb +97 -0
- data/lib/fs/MiqFS/FsProbe.rb +39 -0
- data/lib/fs/MiqFS/MiqFS.rb +515 -0
- data/lib/fs/MiqFS/modules/AUFSProbe.rb +26 -0
- data/lib/fs/MiqFS/modules/Ext3.rb +305 -0
- data/lib/fs/MiqFS/modules/Ext3Probe.rb +25 -0
- data/lib/fs/MiqFS/modules/Ext4.rb +304 -0
- data/lib/fs/MiqFS/modules/Ext4Probe.rb +25 -0
- data/lib/fs/MiqFS/modules/Fat32.rb +318 -0
- data/lib/fs/MiqFS/modules/Fat32Probe.rb +30 -0
- data/lib/fs/MiqFS/modules/HFSProbe.rb +18 -0
- data/lib/fs/MiqFS/modules/Iso9660.rb +293 -0
- data/lib/fs/MiqFS/modules/Iso9660Probe.rb +18 -0
- data/lib/fs/MiqFS/modules/LocalFS.rb +105 -0
- data/lib/fs/MiqFS/modules/NTFS.rb +287 -0
- data/lib/fs/MiqFS/modules/NTFSProbe.rb +21 -0
- data/lib/fs/MiqFS/modules/NativeFS.rb +155 -0
- data/lib/fs/MiqFS/modules/ReFSProbe.rb +17 -0
- data/lib/fs/MiqFS/modules/RealFS.rb +79 -0
- data/lib/fs/MiqFS/modules/RealFSProbe.rb +6 -0
- data/lib/fs/MiqFS/modules/Reiser4Probe.rb +18 -0
- data/lib/fs/MiqFS/modules/ReiserFS.rb +315 -0
- data/lib/fs/MiqFS/modules/ReiserFSProbe.rb +42 -0
- data/lib/fs/MiqFS/modules/UnionFSProbe.rb +18 -0
- data/lib/fs/MiqFS/modules/WebDAV.rb +127 -0
- data/lib/fs/MiqFS/modules/WebDAVFile.rb +68 -0
- data/lib/fs/MiqFS/modules/XFS.rb +300 -0
- data/lib/fs/MiqFS/modules/XFSProbe.rb +26 -0
- data/lib/fs/MiqFS/modules/ZFSProbe.rb +18 -0
- data/lib/fs/MiqFS/test.rb +59 -0
- data/lib/fs/MiqFsUtil.rb +383 -0
- data/lib/fs/MiqMountManager.rb +209 -0
- data/lib/fs/MiqNativeMountManager.rb +101 -0
- data/lib/fs/MountManagerProbe.rb +29 -0
- data/lib/fs/ReiserFS/block.rb +209 -0
- data/lib/fs/ReiserFS/directory.rb +136 -0
- data/lib/fs/ReiserFS/directory_entry.rb +140 -0
- data/lib/fs/ReiserFS/file_data.rb +111 -0
- data/lib/fs/ReiserFS/superblock.rb +140 -0
- data/lib/fs/ReiserFS/utils.rb +95 -0
- data/lib/fs/VimDatastoreFS/VimDatastoreFS.rb +192 -0
- data/lib/fs/ext3/alloc_bitmap.rb +38 -0
- data/lib/fs/ext3/block_pointers_path.rb +130 -0
- data/lib/fs/ext3/directory.rb +51 -0
- data/lib/fs/ext3/directory_entry.rb +67 -0
- data/lib/fs/ext3/ex_attrib_header.rb +14 -0
- data/lib/fs/ext3/ex_attrib_name.rb +23 -0
- data/lib/fs/ext3/file_data.rb +130 -0
- data/lib/fs/ext3/group_descriptor_entry.rb +65 -0
- data/lib/fs/ext3/group_descriptor_table.rb +54 -0
- data/lib/fs/ext3/hash_tree_entry.rb +18 -0
- data/lib/fs/ext3/hash_tree_header.rb +15 -0
- data/lib/fs/ext3/inode.rb +228 -0
- data/lib/fs/ext3/posix_acl_entry.rb +29 -0
- data/lib/fs/ext3/posix_acl_header.rb +11 -0
- data/lib/fs/ext3/superblock.rb +406 -0
- data/lib/fs/ext3/test/tc_Ext3BlockPointersPath.rb +74 -0
- data/lib/fs/ext4/alloc_bitmap.rb +38 -0
- data/lib/fs/ext4/directory.rb +87 -0
- data/lib/fs/ext4/directory_entry.rb +77 -0
- data/lib/fs/ext4/ex_attrib_header.rb +14 -0
- data/lib/fs/ext4/ex_attrib_name.rb +23 -0
- data/lib/fs/ext4/extent.rb +35 -0
- data/lib/fs/ext4/extent_header.rb +40 -0
- data/lib/fs/ext4/extent_index.rb +33 -0
- data/lib/fs/ext4/group_descriptor_entry.rb +69 -0
- data/lib/fs/ext4/group_descriptor_table.rb +54 -0
- data/lib/fs/ext4/hash_tree_entry.rb +58 -0
- data/lib/fs/ext4/hash_tree_header.rb +35 -0
- data/lib/fs/ext4/inode.rb +465 -0
- data/lib/fs/ext4/posix_acl_entry.rb +29 -0
- data/lib/fs/ext4/posix_acl_header.rb +11 -0
- data/lib/fs/ext4/superblock.rb +412 -0
- data/lib/fs/fat32/boot_sect.rb +379 -0
- data/lib/fs/fat32/directory.rb +222 -0
- data/lib/fs/fat32/directory_entry.rb +540 -0
- data/lib/fs/fat32/file_data.rb +128 -0
- data/lib/fs/iso9660/boot_sector.rb +170 -0
- data/lib/fs/iso9660/directory.rb +90 -0
- data/lib/fs/iso9660/directory_entry.rb +147 -0
- data/lib/fs/iso9660/file_data.rb +78 -0
- data/lib/fs/iso9660/rock_ridge.rb +329 -0
- data/lib/fs/iso9660/util.rb +57 -0
- data/lib/fs/modules/LinuxMount.rb +300 -0
- data/lib/fs/modules/LinuxMountProbe.rb +29 -0
- data/lib/fs/modules/WinMount.rb +97 -0
- data/lib/fs/modules/WinMountProbe.rb +24 -0
- data/lib/fs/ntfs/attrib_attribute_list.rb +131 -0
- data/lib/fs/ntfs/attrib_bitmap.rb +26 -0
- data/lib/fs/ntfs/attrib_data.rb +74 -0
- data/lib/fs/ntfs/attrib_file_name.rb +110 -0
- data/lib/fs/ntfs/attrib_header.rb +194 -0
- data/lib/fs/ntfs/attrib_index_allocation.rb +19 -0
- data/lib/fs/ntfs/attrib_index_root.rb +247 -0
- data/lib/fs/ntfs/attrib_object_id.rb +40 -0
- data/lib/fs/ntfs/attrib_standard_information.rb +107 -0
- data/lib/fs/ntfs/attrib_type.rb +49 -0
- data/lib/fs/ntfs/attrib_volume_information.rb +53 -0
- data/lib/fs/ntfs/attrib_volume_name.rb +31 -0
- data/lib/fs/ntfs/boot_sect.rb +253 -0
- data/lib/fs/ntfs/data_run.rb +358 -0
- data/lib/fs/ntfs/directory_index_node.rb +114 -0
- data/lib/fs/ntfs/index_node_header.rb +69 -0
- data/lib/fs/ntfs/index_record_header.rb +85 -0
- data/lib/fs/ntfs/mft_entry.rb +288 -0
- data/lib/fs/ntfs/utils.rb +43 -0
- data/lib/fs/test/camcorder_fs_test.rb +108 -0
- data/lib/fs/test/collect_files_direct.yaml +22 -0
- data/lib/fs/test/collect_files_in.yaml +24 -0
- data/lib/fs/test/collect_files_in_nc.yaml +22 -0
- data/lib/fs/test/collect_files_out.yaml +6 -0
- data/lib/fs/test/collect_files_rm.yaml +6 -0
- data/lib/fs/test/copyTest.rb +126 -0
- data/lib/fs/test/fsTest.rb +87 -0
- data/lib/fs/test/updateTest.rb +184 -0
- data/lib/fs/xfs/allocation_group.rb +160 -0
- data/lib/fs/xfs/bmap_btree_block.rb +125 -0
- data/lib/fs/xfs/bmap_btree_record.rb +80 -0
- data/lib/fs/xfs/bmap_btree_root_node.rb +72 -0
- data/lib/fs/xfs/directory.rb +133 -0
- data/lib/fs/xfs/directory2_data_header.rb +27 -0
- data/lib/fs/xfs/directory3_data_header.rb +34 -0
- data/lib/fs/xfs/directory_block_tail.rb +22 -0
- data/lib/fs/xfs/directory_data_header.rb +46 -0
- data/lib/fs/xfs/directory_entry.rb +106 -0
- data/lib/fs/xfs/inode.rb +532 -0
- data/lib/fs/xfs/inode_map.rb +100 -0
- data/lib/fs/xfs/short_form_directory_entry.rb +91 -0
- data/lib/fs/xfs/short_form_header.rb +44 -0
- data/lib/fs/xfs/superblock.rb +556 -0
- data/lib/lib/tasks/azure.rake +52 -0
- data/lib/manageiq/smartstate/version.rb +5 -0
- data/lib/manageiq/smartstate.rb +7 -0
- data/lib/manageiq-smartstate.rb +1 -0
- data/lib/metadata/MIQExtract/MIQExtract.rb +297 -0
- data/lib/metadata/MIQExtract/test/extractTest.rb +41 -0
- data/lib/metadata/MIQExtract/test/full_extract_test.rb +68 -0
- data/lib/metadata/ScanProfile/HostScanItem.rb +4 -0
- data/lib/metadata/ScanProfile/HostScanProfile.rb +4 -0
- data/lib/metadata/ScanProfile/HostScanProfiles.rb +41 -0
- data/lib/metadata/ScanProfile/ScanItemBase.rb +63 -0
- data/lib/metadata/ScanProfile/ScanProfileBase.rb +51 -0
- data/lib/metadata/ScanProfile/ScanProfilesBase.rb +60 -0
- data/lib/metadata/ScanProfile/VmScanItem.rb +4 -0
- data/lib/metadata/ScanProfile/VmScanProfile.rb +4 -0
- data/lib/metadata/ScanProfile/VmScanProfiles.rb +38 -0
- data/lib/metadata/ScanProfile/modules/HostScanItemFile.rb +51 -0
- data/lib/metadata/ScanProfile/modules/HostScanItemNteventlog.rb +84 -0
- data/lib/metadata/ScanProfile/modules/VmScanItemFile.rb +39 -0
- data/lib/metadata/ScanProfile/modules/VmScanItemNteventlog.rb +34 -0
- data/lib/metadata/ScanProfile/modules/VmScanItemRegistry.rb +64 -0
- data/lib/metadata/VMMount/VMMount.rb +81 -0
- data/lib/metadata/VMMount/VMPlatformMount.rb +18 -0
- data/lib/metadata/VMMount/VMPlatformMountLinux.rb +75 -0
- data/lib/metadata/VMMount/VMPlatformMountWin.rb +13 -0
- data/lib/metadata/VmConfig/GetNativeCfg.rb +45 -0
- data/lib/metadata/VmConfig/VmConfig.rb +947 -0
- data/lib/metadata/VmConfig/cfgConfig.rb +45 -0
- data/lib/metadata/VmConfig/ovfConfig.rb +99 -0
- data/lib/metadata/VmConfig/test/GetVMwareCfgTest.rb +40 -0
- data/lib/metadata/VmConfig/vmcConfig.rb +116 -0
- data/lib/metadata/VmConfig/vmtxConfig.rb +4 -0
- data/lib/metadata/VmConfig/vmxConfig.rb +162 -0
- data/lib/metadata/VmConfig/xmlConfig.rb +79 -0
- data/lib/metadata/VmConfig/xmlMsHyperVConfig.rb +41 -0
- data/lib/metadata/linux/InitProcHash.rb +632 -0
- data/lib/metadata/linux/LinuxInitProcs.rb +142 -0
- data/lib/metadata/linux/LinuxOSInfo.rb +237 -0
- data/lib/metadata/linux/LinuxPackages.rb +209 -0
- data/lib/metadata/linux/LinuxSystemd.rb +130 -0
- data/lib/metadata/linux/LinuxUsers.rb +289 -0
- data/lib/metadata/linux/LinuxUtils.rb +197 -0
- data/lib/metadata/linux/MiqConaryPackages.rb +41 -0
- data/lib/metadata/linux/MiqRpmPackages.rb +160 -0
- data/lib/metadata/linux/test/Name +0 -0
- data/lib/metadata/linux/test/Packages +0 -0
- data/lib/metadata/linux/test/rpoTest.rb +5 -0
- data/lib/metadata/linux/test/tc_LinuxUtils.rb +4157 -0
- data/lib/metadata/util/event_log_filter.rb +61 -0
- data/lib/metadata/util/md5deep.rb +280 -0
- data/lib/metadata/util/win32/Win32Accounts.rb +764 -0
- data/lib/metadata/util/win32/Win32EventLog.rb +743 -0
- data/lib/metadata/util/win32/Win32Services.rb +86 -0
- data/lib/metadata/util/win32/Win32Software.rb +326 -0
- data/lib/metadata/util/win32/Win32System.rb +333 -0
- data/lib/metadata/util/win32/boot_info_win.rb +59 -0
- data/lib/metadata/util/win32/fleece_hives.rb +220 -0
- data/lib/metadata/util/win32/ms-registry.rb +650 -0
- data/lib/metadata/util/win32/peheader.rb +868 -0
- data/lib/metadata/util/win32/remote-registry.rb +142 -0
- data/lib/metadata/util/win32/system_path_win.rb +103 -0
- data/lib/metadata/util/win32/versioninfo.rb +17 -0
- data/manageiq-smartstate.gemspec +35 -0
- metadata +486 -0
@@ -0,0 +1,556 @@
|
|
1
|
+
# encoding: US-ASCII
|
2
|
+
|
3
|
+
require 'binary_struct'
|
4
|
+
require 'util/miq-uuid'
|
5
|
+
require 'stringio'
|
6
|
+
require 'memory_buffer'
|
7
|
+
require 'fs/xfs/allocation_group'
|
8
|
+
require 'fs/xfs/inode_map'
|
9
|
+
require 'fs/xfs/inode'
|
10
|
+
|
11
|
+
require 'rufus/lru'
|
12
|
+
|
13
|
+
module XFS
|
14
|
+
# ////////////////////////////////////////////////////////////////////////////
|
15
|
+
# // Data definitions. Linux 2.6.2 from Fedora Core 6.
|
16
|
+
|
17
|
+
SUPERBLOCK = BinaryStruct.new([
|
18
|
+
'L>', 'magic_num', # magic number of the filesystem
|
19
|
+
'L>', 'block_size', # size of a basic unit of space allocation in bytes
|
20
|
+
'Q>', 'data_blocks', # total Number of blocks available for data and metadata
|
21
|
+
'Q>', 'realtime_blocks', # number of blocks on the real-time disk device
|
22
|
+
'Q>', 'realtime_extents', # Number of extents on the real-time disk device
|
23
|
+
'a16', 'uuid', # UUID for the filesystem
|
24
|
+
'Q>', 'log_start', # first block for the journal log if internal (0 if external)
|
25
|
+
'Q>', 'root_inode_num', # root inode number for the filesystem
|
26
|
+
'Q>', 'bitmap_inode_num', # bitmap inode number for real-time extents
|
27
|
+
'Q>', 'summary_inode_num', # summary inode number for real-time bitmap
|
28
|
+
'L>', 'realtime_ext_size', # real-time extent size in blocks
|
29
|
+
'L>', 'ag_blocks', # size of each allocation group in blocks
|
30
|
+
'L>', 'ag_count', # number of allocation groups in the filesystem
|
31
|
+
'L>', 'bitmap_blocks', # number of real-time bitmap blocks
|
32
|
+
'L>', 'log_blocks', # number of blocks for the journaling log
|
33
|
+
'S>', 'version_number', # Filesystem version number
|
34
|
+
'S>', 'sector_size', # underlying disk sector size in bytes
|
35
|
+
'S>', 'inode_size', # size of the inode in bytes
|
36
|
+
'S>', 'inodes_per_blk', # number of inodes per block
|
37
|
+
'a12', 'fs_name', # name for the filesystem
|
38
|
+
'C', 'block_size_log', # log base 2 of block_size
|
39
|
+
'C', 'sector_size_log', # log base 2 of sector_size
|
40
|
+
'C', 'inode_size_log', # log base 2 of inode_size
|
41
|
+
'C', 'inodes_per_blk_log', # log base 2 of inodes_per_blk
|
42
|
+
'C', 'ag_blocks_log', # log base 2 of ag_blocks (rounded up)
|
43
|
+
'C', 'rt_ext_size_log', # log base 2 of realtime_ext_size
|
44
|
+
'C', 'in_progress', # flag specifying that the filesystem is being created
|
45
|
+
'C', 'inode_max_pct', # maximum percentage of filesystem space that can be used for inodes
|
46
|
+
'Q>', 'inode_count', # global count for number of inodes allocated on the filesystem
|
47
|
+
'Q>', 'inode_free_count', # global count of free inodes on the filesystem.
|
48
|
+
'Q>', 'free_data_blocks', # global count of free data blocks on the filesystem
|
49
|
+
'Q>', 'free_rt_extents', # global count of free real-time extents on the filesystem
|
50
|
+
'Q>', 'user_quota_ino', # inode number for user quotas
|
51
|
+
'Q>', 'group_quota_ino', # inode number for group quotas
|
52
|
+
'S>', 'quota_flags', # quota flags
|
53
|
+
'C', 'misc_flags', # miscellaneous flags
|
54
|
+
'C', 'shared_vers_no', # shared version number
|
55
|
+
'L>', 'inode_alignment', # inode chunk alignment in blocks
|
56
|
+
'L>', 'stripe_unit', # underlying stripe or raid unit in blocks
|
57
|
+
'L>', 'stripe_width', # underlying stripe or raid width in blocks
|
58
|
+
'C', 'dir_block_log', # log base 2 multiplier that determines the
|
59
|
+
# granularity of directory block allocations in fsblocks
|
60
|
+
'C', 'log_sect_size_log', # log base 2 of the log subvolume's sector size
|
61
|
+
'S>', 'log_sector_size', # the log's sector size in bytes if the filesystem uses an external log device
|
62
|
+
'L>', 'log_stripe_unit_sz', # the log device's stripe or raid unit size.
|
63
|
+
'L>', 'features_2', # add'l version flags if XFS_SUPERBLOCK_VERSION_MOREBITSBIT is set in version_number
|
64
|
+
# version 5 superblock fields start here
|
65
|
+
'L>', 'features_compat',
|
66
|
+
'L>', 'features_ro_compat',
|
67
|
+
'L>', 'features_incompat',
|
68
|
+
'L>', 'features_log_incompat',
|
69
|
+
'L>', 'superblock_crc', # superblock crc
|
70
|
+
'L>', 'padding',
|
71
|
+
'Q>', 'proj_quota_ino', # inode number for project quotas
|
72
|
+
'q>', 'last_write_seq', # last write sequence
|
73
|
+
])
|
74
|
+
|
75
|
+
SUPERBLOCK_SIZE = 512
|
76
|
+
|
77
|
+
# ////////////////////////////////////////////////////////////////////////////
|
78
|
+
# // Class.
|
79
|
+
|
80
|
+
class Superblock
|
81
|
+
#
|
82
|
+
# Block I/O parameterization. A basic block (BB) is the lowest size of
|
83
|
+
# filesystem allocation, and must equal 512. Length units given to bio
|
84
|
+
# routines are in BB's.
|
85
|
+
#
|
86
|
+
BBSHIFT = 9
|
87
|
+
BBSIZE = 1 << BBSHIFT
|
88
|
+
XFS_INODE_BIG_CLUSTER_SIZE = 8192
|
89
|
+
XFS_NBBY = 8 # number of bits in a byte
|
90
|
+
XFS_INODES_PER_CHUNK = XFS_NBBY * 8
|
91
|
+
XFS_DINODE_MIN_LOG = 8
|
92
|
+
XFS_DINODE_MIN_SIZE = 1 << XFS_DINODE_MIN_LOG
|
93
|
+
DEF_BLOCK_CACHE_SIZE = 500
|
94
|
+
DEF_CLUSTER_CACHE_SIZE = 500
|
95
|
+
DEF_INODE_CACHE_SIZE = 500
|
96
|
+
DEF_AG_CACHE_SIZE = 10
|
97
|
+
XFS_SUPERBLOCK_MAGIC = 0x58465342
|
98
|
+
XFS_SUPERBLOCK_VERSION_1 = 1 # 5.3, 6.0.1, 6.1 */
|
99
|
+
XFS_SUPERBLOCK_VERSION_2 = 2 # 6.2 - attributes */
|
100
|
+
XFS_SUPERBLOCK_VERSION_3 = 3 # 6.2 - new inode version */
|
101
|
+
XFS_SUPERBLOCK_VERSION_4 = 4 # 6.2+ - bitmask version */
|
102
|
+
XFS_SUPERBLOCK_VERSION_5 = 5 # CRC enabled filesystem */
|
103
|
+
XFS_SUPERBLOCK_VERSION_NUMBITS = 0x000f
|
104
|
+
XFS_SUPERBLOCK_VERSION_ALLFBITS = 0xfff0
|
105
|
+
XFS_SUPERBLOCK_VERSION_SASHFBITS = 0xf000
|
106
|
+
XFS_SUPERBLOCK_VERSION_REALFBITS = 0x0ff0
|
107
|
+
XFS_SUPERBLOCK_VERSION_ATTRBIT = 0x0010
|
108
|
+
XFS_SUPERBLOCK_VERSION_NLINKBIT = 0x0020
|
109
|
+
XFS_SUPERBLOCK_VERSION_QUOTABIT = 0x0040
|
110
|
+
XFS_SUPERBLOCK_VERSION_ALIGNBIT = 0x0080
|
111
|
+
XFS_SUPERBLOCK_VERSION_DALIGNBIT = 0x0100
|
112
|
+
XFS_SUPERBLOCK_VERSION_SHAREDBIT = 0x0200
|
113
|
+
XFS_SUPERBLOCK_VERSION_LOGV2BIT = 0x0400
|
114
|
+
XFS_SUPERBLOCK_VERSION_SECTORBIT = 0x0800
|
115
|
+
XFS_SUPERBLOCK_VERSION_EXTFLGBIT = 0x1000
|
116
|
+
XFS_SUPERBLOCK_VERSION_DIRV2BIT = 0x2000
|
117
|
+
XFS_SUPERBLOCK_VERSION_BORGBIT = 0x4000 # ASCII only case-insens. */
|
118
|
+
XFS_SUPERBLOCK_VERSION_MOREBITSBIT = 0x8000
|
119
|
+
|
120
|
+
XFS_SUPERBLOCK_VERSION_OKSASHFBITS = XFS_SUPERBLOCK_VERSION_EXTFLGBIT | XFS_SUPERBLOCK_VERSION_DIRV2BIT | XFS_SUPERBLOCK_VERSION_BORGBIT
|
121
|
+
|
122
|
+
XFS_SUPERBLOCK_VERSION_OKREALFBITS = XFS_SUPERBLOCK_VERSION_ATTRBIT | XFS_SUPERBLOCK_VERSION_NLINKBIT | XFS_SUPERBLOCK_VERSION_QUOTABIT | XFS_SUPERBLOCK_VERSION_ALIGNBIT | XFS_SUPERBLOCK_VERSION_DALIGNBIT | XFS_SUPERBLOCK_VERSION_SHAREDBIT | XFS_SUPERBLOCK_VERSION_LOGV2BIT | XFS_SUPERBLOCK_VERSION_SECTORBIT | XFS_SUPERBLOCK_VERSION_MOREBITSBIT
|
123
|
+
|
124
|
+
XFS_SUPERBLOCK_VERSION_OKREALBITS = XFS_SUPERBLOCK_VERSION_NUMBITS | XFS_SUPERBLOCK_VERSION_OKREALFBITS |
|
125
|
+
XFS_SUPERBLOCK_VERSION_OKSASHFBITS
|
126
|
+
|
127
|
+
#
|
128
|
+
# There are two words to hold XFS "feature" bits: the original
|
129
|
+
# word, version_number, and features2. Whenever a bit is set in
|
130
|
+
# features2, the feature bit XFS_SUPERBLOCK_VERSION_MOREBITSBIT must be set.
|
131
|
+
#
|
132
|
+
# These defines represent bits in sb_features2.
|
133
|
+
#
|
134
|
+
XFS_SUPERBLOCK_VERSION2_REALFBITS = 0x00ffffff # Mask: features */
|
135
|
+
XFS_SUPERBLOCK_VERSION2_RESERVED1BIT = 0x00000001
|
136
|
+
XFS_SUPERBLOCK_VERSION2_LAZYSBCOUNTBIT = 0x00000002 # Superblk counters */
|
137
|
+
XFS_SUPERBLOCK_VERSION2_RESERVED4BIT = 0x00000004
|
138
|
+
XFS_SUPERBLOCK_VERSION2_ATTR2BIT = 0x00000008 # Inline attr rework */
|
139
|
+
XFS_SUPERBLOCK_VERSION2_PARENTBIT = 0x00000010 # parent pointers */
|
140
|
+
XFS_SUPERBLOCK_VERSION2_PROJID32BIT = 0x00000080 # 32 bit project id */
|
141
|
+
XFS_SUPERBLOCK_VERSION2_CRCBIT = 0x00000100 # metadata CRCs */
|
142
|
+
XFS_SUPERBLOCK_VERSION2_FTYPE = 0x00000200 # inode type in dir */
|
143
|
+
|
144
|
+
XFS_SUPERBLOCK_VERSION2_OKREALFBITS = XFS_SUPERBLOCK_VERSION2_LAZYSBCOUNTBIT |
|
145
|
+
XFS_SUPERBLOCK_VERSION2_ATTR2BIT | XFS_SUPERBLOCK_VERSION2_PROJID32BIT | XFS_SUPERBLOCK_VERSION2_FTYPE
|
146
|
+
XFS_SUPERBLOCK_VERSION2_OKSASHFBITS = 0
|
147
|
+
XFS_SUPERBLOCK_VERSION2_OKREALBITS = XFS_SUPERBLOCK_VERSION2_OKREALFBITS | XFS_SUPERBLOCK_VERSION2_OKSASHFBITS
|
148
|
+
|
149
|
+
XFS_SB_FEAT_INCOMPAT_FTYPE = 1
|
150
|
+
|
151
|
+
# /////////////////////////////////////////////////////////////////////////
|
152
|
+
# // initialize
|
153
|
+
attr_reader :groups_count, :filesystem_id, :stream, :block_count, :inode_count, :volume_name
|
154
|
+
attr_reader :sector_size, :block_size, :root_inode, :inode_size, :sb
|
155
|
+
attr_reader :ialloc_inos, :ialloc_blks, :agno, :agino, :agbno, :allocation_group_count
|
156
|
+
|
157
|
+
def validate_sb(agno)
|
158
|
+
# Grab some quick facts & make sure there's nothing wrong. Tight qualification.
|
159
|
+
if @sb['magic_num'] != XFS_SUPERBLOCK_MAGIC
|
160
|
+
raise "XFS::Superblock.initialize: Invalid magic number=[#{@sb['magic_num']}] in AG #{agno}"
|
161
|
+
end
|
162
|
+
unless good_version?
|
163
|
+
$log.warn "XFS::Superblock.initialize: Bad Superblock version # #{@sb['version_number']} in AG #{agno}"
|
164
|
+
$log.warn "Attempting to access filesystem"
|
165
|
+
end
|
166
|
+
if agno == 0 && @sb['in_progress'] != 0
|
167
|
+
$log.warn "XFS::Superblock.initialize: mkfs not completed successfully. Attempting to access filesystem"
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
def initialize(stream, agno = 0)
|
172
|
+
raise "XFS::Superblock.initialize: Nil stream" if stream.nil?
|
173
|
+
@stream = stream
|
174
|
+
|
175
|
+
#
|
176
|
+
# Seek, read & decode the superblock structure
|
177
|
+
# TODO: FIGURE OUT OFFSET OF SUPERBLOCK for the specified AG number.
|
178
|
+
# TODO: @stream.seek(SUPERBLOCK_OFFSET)
|
179
|
+
#
|
180
|
+
@sb = SUPERBLOCK.decode(@stream.read(SUPERBLOCK_SIZE))
|
181
|
+
validate_sb(agno)
|
182
|
+
|
183
|
+
@block_size = @sb['block_size']
|
184
|
+
|
185
|
+
@block_cache = LruHash.new(DEF_BLOCK_CACHE_SIZE)
|
186
|
+
@cluster_cache = LruHash.new(DEF_CLUSTER_CACHE_SIZE)
|
187
|
+
@inode_cache = LruHash.new(DEF_INODE_CACHE_SIZE)
|
188
|
+
@allocation_group_cache = LruHash.new(DEF_AG_CACHE_SIZE)
|
189
|
+
|
190
|
+
# expose for testing.
|
191
|
+
@block_count = @sb['data_blocks']
|
192
|
+
@inode_count = @sb['inode_count']
|
193
|
+
@inode_size = @sb['inode_size']
|
194
|
+
@root_inode = @sb['root_inode_num']
|
195
|
+
|
196
|
+
# Inode file size members can't be trusted, so use sector count instead.
|
197
|
+
# MiqDisk exposes block_size, which for our purposes is sector_size.
|
198
|
+
@sector_size = @stream.blockSize
|
199
|
+
|
200
|
+
# Preprocess some members.
|
201
|
+
@sb['fs_name'].delete!("\000")
|
202
|
+
@allocation_group_count = @sb['ag_count']
|
203
|
+
@allocation_group_blocks = @sb['ag_blocks']
|
204
|
+
@groups_count, @last_group_blocks = @sb['data_blocks'].divmod(@allocation_group_blocks)
|
205
|
+
@groups_count += 1 if @last_group_blocks > 0
|
206
|
+
@filesystem_id = UUIDTools::UUID.parse_raw(@sb['uuid'])
|
207
|
+
@volume_name = @sb['fs_name']
|
208
|
+
@ialloc_inos = (@sb['inodes_per_blk']..XFS_INODES_PER_CHUNK).max
|
209
|
+
@ialloc_blks = @ialloc_inos >> @sb['inodes_per_blk_log']
|
210
|
+
end
|
211
|
+
|
212
|
+
# ////////////////////////////////////////////////////////////////////////////
|
213
|
+
# // Class helpers & accessors.
|
214
|
+
|
215
|
+
def b_to_bb(bytes)
|
216
|
+
(bytes + BBSIZE - 1) >> BBSHIFT
|
217
|
+
end
|
218
|
+
|
219
|
+
def b_to_bbt(bytes)
|
220
|
+
bytes >> BBSHIFT
|
221
|
+
end
|
222
|
+
|
223
|
+
def bb_to_b(bbs)
|
224
|
+
bbs << BBSHIFT
|
225
|
+
end
|
226
|
+
|
227
|
+
def sb_version_num
|
228
|
+
@sb['version_number'] & XFS_SUPERBLOCK_VERSION_NUMBITS
|
229
|
+
end
|
230
|
+
|
231
|
+
def incompatible_feature?(feature)
|
232
|
+
(@sb['features_incompat'] & feature) != 0
|
233
|
+
end
|
234
|
+
|
235
|
+
def version_has_more_bits?
|
236
|
+
version_has_crc? || (@sb['version_number'] & XFS_SUPERBLOCK_VERSION_MOREBITSBIT != 0)
|
237
|
+
end
|
238
|
+
|
239
|
+
def version_has_ftype?
|
240
|
+
(version_has_crc? && incompatible_feature?(XFS_SB_FEAT_INCOMPAT_FTYPE)) ||
|
241
|
+
(version_has_more_bits? && ((@sb['features_2'] & XFS_SUPERBLOCK_VERSION2_FTYPE) != 0))
|
242
|
+
end
|
243
|
+
|
244
|
+
def version_has_crc?
|
245
|
+
sb_version_num == XFS_SUPERBLOCK_VERSION_5
|
246
|
+
end
|
247
|
+
|
248
|
+
def fragment_size
|
249
|
+
1024 << @sb['fragment_size']
|
250
|
+
end
|
251
|
+
|
252
|
+
def inode_size
|
253
|
+
@sb['inode_size']
|
254
|
+
end
|
255
|
+
|
256
|
+
def free_bytes
|
257
|
+
@sb['free_data_blocks'] * @block_size
|
258
|
+
end
|
259
|
+
|
260
|
+
def ino_mask(k)
|
261
|
+
((1 << k) - 1) & 0xffffffff
|
262
|
+
end
|
263
|
+
|
264
|
+
def mask32lo(n)
|
265
|
+
(((1 << n) & 0xffffffff) - 1) & 0xffffffff
|
266
|
+
end
|
267
|
+
|
268
|
+
def fsb_to_b(fsbno)
|
269
|
+
fsbno << @sb['block_size_log']
|
270
|
+
end
|
271
|
+
|
272
|
+
def fsb_to_bb(fsbno)
|
273
|
+
fsbno << (@sb['block_size_log'] - BBSHIFT)
|
274
|
+
end
|
275
|
+
|
276
|
+
def fsb_to_agno(fsbno)
|
277
|
+
fsbno >> @sb['ag_blocks_log']
|
278
|
+
end
|
279
|
+
|
280
|
+
def fsb_to_agbno(fsbno)
|
281
|
+
fsbno & mask32lo(@sb['ag_blocks_log'])
|
282
|
+
end
|
283
|
+
|
284
|
+
def fsb_to_daddr(fsbno)
|
285
|
+
agb_to_daddr(fsb_to_agno(fsbno), fsb_to_agbno(fsbno))
|
286
|
+
end
|
287
|
+
|
288
|
+
def fss_to_bb(sectno)
|
289
|
+
sectno << (@sb['sector_size_log'] - BBSHIFT)
|
290
|
+
end
|
291
|
+
|
292
|
+
def b_to_fsbt(byte)
|
293
|
+
byte >> @sb['block_size_log']
|
294
|
+
end
|
295
|
+
|
296
|
+
def ino_to_agno(inode)
|
297
|
+
inode >> ino_agino_bits
|
298
|
+
end
|
299
|
+
|
300
|
+
def ino_to_agino(inode)
|
301
|
+
inode & ino_mask(ino_agino_bits)
|
302
|
+
end
|
303
|
+
|
304
|
+
def ino_to_agbno(inode)
|
305
|
+
inode >> ino_offset_bits & ino_mask(ino_agbno_bits)
|
306
|
+
end
|
307
|
+
|
308
|
+
def ino_to_offset(inode)
|
309
|
+
inode & ino_mask(ino_offset_bits)
|
310
|
+
end
|
311
|
+
|
312
|
+
def agb_to_fsb(agno, agbno)
|
313
|
+
agno << @sb['ag_blocks_log'] | agbno
|
314
|
+
end
|
315
|
+
|
316
|
+
def agbno_to_real_block(agno, agbno)
|
317
|
+
agno * @allocation_group_blocks + agbno
|
318
|
+
end
|
319
|
+
|
320
|
+
def agb_to_daddr(agno, agbno)
|
321
|
+
fsb_to_bb(agno * @allocation_group_blocks + agbno)
|
322
|
+
end
|
323
|
+
|
324
|
+
def agf_daddr
|
325
|
+
1 << (@sb['sector_size_log'] - BBSHIFT)
|
326
|
+
end
|
327
|
+
|
328
|
+
def agi_daddr
|
329
|
+
2 << (@sb['sector_size_log'] - BBSHIFT)
|
330
|
+
end
|
331
|
+
|
332
|
+
def agfl_daddr
|
333
|
+
3 << (@sb['sector_size_log'] - BBSHIFT)
|
334
|
+
end
|
335
|
+
|
336
|
+
def ag_daddr(agno, d)
|
337
|
+
agb_to_daddr(agno, 0) + d
|
338
|
+
end
|
339
|
+
|
340
|
+
def ino_to_fsb(inode)
|
341
|
+
agb_to_fsb(ino_to_agno(inode), ino_to_agbno(inode))
|
342
|
+
end
|
343
|
+
|
344
|
+
def agino_to_ino(agno, inode)
|
345
|
+
agno << ino_agino_bits | inode
|
346
|
+
end
|
347
|
+
|
348
|
+
def agino_to_agbno(inode)
|
349
|
+
inode >> ino_offset_bits
|
350
|
+
end
|
351
|
+
|
352
|
+
def agino_to_offset(inode)
|
353
|
+
inode & ino_mask(ino_offset_bits)
|
354
|
+
end
|
355
|
+
|
356
|
+
def ino_offset_bits
|
357
|
+
@sb['inodes_per_blk_log']
|
358
|
+
end
|
359
|
+
|
360
|
+
def ino_agbno_bits
|
361
|
+
@sb['ag_blocks_log']
|
362
|
+
end
|
363
|
+
|
364
|
+
def ino_agino_bits
|
365
|
+
@sb['inodes_per_blk_log'] + @sb['ag_blocks_log']
|
366
|
+
end
|
367
|
+
|
368
|
+
def offbno_to_agino(block, offset)
|
369
|
+
(block << @sb['inodes_per_blk_log']) | offset
|
370
|
+
end
|
371
|
+
|
372
|
+
def version_has_align?
|
373
|
+
(sb_version_num == XFS_SUPERBLOCK_VERSION_5) ||
|
374
|
+
((sb_version_num >= XFS_SUPERBLOCK_VERSION_4) &&
|
375
|
+
((@sb['version_number'] & XFS_SUPERBLOCK_VERSION_ALIGNBIT) != 0))
|
376
|
+
end
|
377
|
+
|
378
|
+
def inode_align_mask
|
379
|
+
if version_has_align? &&
|
380
|
+
@sb['inode_alignment'] >> b_to_fsbt(XFS_INODE_BIG_CLUSTER_SIZE)
|
381
|
+
return @sb['inode_alignment']
|
382
|
+
else
|
383
|
+
return 0
|
384
|
+
end
|
385
|
+
end
|
386
|
+
|
387
|
+
def good_version_4?(sb)
|
388
|
+
if (sb['version_number'] & ~XFS_SUPERBLOCK_VERSION_OKREALBITS) ||
|
389
|
+
((sb['version_number'] & XFS_SUPERBLOCK_VERSION_MOREBITSBIT) &&
|
390
|
+
(sb['features_2'] & ~XFS_SUPERBLOCK_VERSION2_OKREALBITS))
|
391
|
+
return 0
|
392
|
+
end
|
393
|
+
return 0 if sb['shared_vers_no'] > XFS_SB_MAX_SHARED_VN
|
394
|
+
1
|
395
|
+
end
|
396
|
+
|
397
|
+
def good_version?
|
398
|
+
#
|
399
|
+
# We always support version 1-3
|
400
|
+
#
|
401
|
+
if sb_version_num >= XFS_SUPERBLOCK_VERSION_1 &&
|
402
|
+
sb_version_num <= XFS_SUPERBLOCK_VERSION_3
|
403
|
+
return 1
|
404
|
+
end
|
405
|
+
#
|
406
|
+
# We support version 4 if all feature bits are supported
|
407
|
+
#
|
408
|
+
if sb_version_num == XFS_SUPERBLOCK_VERSION_4
|
409
|
+
return good_version_4?(@sb)
|
410
|
+
end
|
411
|
+
return 1 if sb_version_num == XFS_SUPERBLOCK_VERSION_5
|
412
|
+
end
|
413
|
+
|
414
|
+
def inode_cluster_size
|
415
|
+
cluster_size = XFS_INODE_BIG_CLUSTER_SIZE
|
416
|
+
if version_has_crc?
|
417
|
+
new_size = cluster_size
|
418
|
+
new_size *= inode_size / XFS_DINODE_MIN_SIZE
|
419
|
+
if @sb['inode_alignment'] >= b_to_fsbt(new_size)
|
420
|
+
cluster_size = new_size
|
421
|
+
end
|
422
|
+
end
|
423
|
+
cluster_size
|
424
|
+
end
|
425
|
+
|
426
|
+
def icluster_size_fsb
|
427
|
+
cluster_size = inode_cluster_size
|
428
|
+
return 1 if @block_size > cluster_size
|
429
|
+
cluster_size >> @sb['block_size_log']
|
430
|
+
end
|
431
|
+
|
432
|
+
def get_ag(agno)
|
433
|
+
unless @allocation_group_cache.key?(agno)
|
434
|
+
blk_num = ag_daddr(agno, agf_daddr)
|
435
|
+
@stream.seek(fsb_to_b(blk_num))
|
436
|
+
@allocation_group_cache[agno] = AllocationGroup.new(@stream, agno, @sb)
|
437
|
+
end
|
438
|
+
@allocation_group_cache[agno]
|
439
|
+
end
|
440
|
+
|
441
|
+
def get_agi(agno)
|
442
|
+
get_ag(agno).agi
|
443
|
+
end
|
444
|
+
|
445
|
+
def get_agf(agno)
|
446
|
+
get_ag(agno).agf
|
447
|
+
end
|
448
|
+
|
449
|
+
def get_agblock(agno)
|
450
|
+
get_ag(agno).agblock
|
451
|
+
end
|
452
|
+
|
453
|
+
def inode_btree_record
|
454
|
+
InodeBtreeRecord.new(cursor)
|
455
|
+
end
|
456
|
+
|
457
|
+
def get_inode(inode)
|
458
|
+
unless @inode_cache.key?(inode)
|
459
|
+
inode_map = InodeMap.new(inode, self)
|
460
|
+
if icluster_size_fsb == 1
|
461
|
+
buf = get_block(inode_map.inode_blkno)
|
462
|
+
else
|
463
|
+
buf = get_cluster(inode_map.inode_blkno)
|
464
|
+
end
|
465
|
+
@inode_cache[inode] = Inode.new(buf, inode_map.inode_boffset, self, inode)
|
466
|
+
end
|
467
|
+
|
468
|
+
@inode_cache[inode]
|
469
|
+
end
|
470
|
+
|
471
|
+
def get_cluster(block)
|
472
|
+
raise "XFS::Superblock.get_cluster: block is nil" if block.nil?
|
473
|
+
@cluster_cache[block] = MemoryBuffer.create(@block_size * icluster_size_fsb) if block == 0
|
474
|
+
unless @cluster_cache.key?(block)
|
475
|
+
@stream.seek(fsb_to_b(block))
|
476
|
+
@cluster_cache[block] = @stream.read(@block_size * icluster_size_fsb)
|
477
|
+
end
|
478
|
+
@cluster_cache[block]
|
479
|
+
end
|
480
|
+
|
481
|
+
def get_block(block)
|
482
|
+
raise "XFS::Superblock.get_block: block is nil" if block.nil?
|
483
|
+
@block_cache[block] = MemoryBuffer.create(@block_size) if block == 0
|
484
|
+
unless @block_cache.key?(block)
|
485
|
+
@stream.seek(fsb_to_b(block))
|
486
|
+
@block_cache[block] = @stream.read(@block_size)
|
487
|
+
end
|
488
|
+
@block_cache[block]
|
489
|
+
end
|
490
|
+
|
491
|
+
# ////////////////////////////////////////////////////////////////////////////
|
492
|
+
# // Utility functions.
|
493
|
+
|
494
|
+
def got_bit?(field, bit)
|
495
|
+
field & bit == bit
|
496
|
+
end
|
497
|
+
|
498
|
+
# Dump object.
|
499
|
+
def dump
|
500
|
+
out = "\#<#{self.class}:0x#{format('%08x', object_id)}>\n"
|
501
|
+
out << "Magic number : #{format('%0x', @sb['magic_num'])}\n"
|
502
|
+
out << "Block size : #{@sb['block_size']} (#{@block_size} bytes)\n"
|
503
|
+
out << "Number of blocks : #{@sb['data_blocks']}\n"
|
504
|
+
out << "Real-time blocks : #{@sb['realtime_blocks']}\n"
|
505
|
+
out << "Real-time extents : #{@sb['realtime_extents']}\n"
|
506
|
+
out << "UUID : #{@filesystem_id}\n"
|
507
|
+
out << "Journal Log Start block : #{@sb['log_start']}\n"
|
508
|
+
out << "Root Inode # : #{@sb['root_inode_num']}\n"
|
509
|
+
out << "RealTime Bitmap Inode# : #{@sb['bitmap_inode_num']}\n"
|
510
|
+
out << "RealTime Summary Inode# : #{@sb['summary_inode_num']}\n"
|
511
|
+
out << "RT Extent Size (Blocks) : #{@sb['realtime_ext_size']}\n"
|
512
|
+
out << "Alloc Group Size : #{@sb['ag_blocks']}\n"
|
513
|
+
out << "# of Alloc Groups : #{@sb['ag_count']}\n"
|
514
|
+
out << "# of RT Bitmap Blocks : #{@sb['bitmap_blocks']}\n"
|
515
|
+
out << "# of Journal Log Blocks : #{@sb['log_blocks']}\n"
|
516
|
+
out << "Filesystem Version # : #{sb_version_num}\n"
|
517
|
+
out << "Disk Sector Size : #{@sb['sector_size']} bytes\n"
|
518
|
+
out << "Inode Size : #{@sb['inode_size']} bytes\n"
|
519
|
+
out << "Inodes Per Block : #{@sb['inodes_per_blk']}\n"
|
520
|
+
out << "Filesystem Name : #{@sb['fs_name']}\n"
|
521
|
+
out << "Log Base2 of Block size : #{@sb['block_size_log']}\n"
|
522
|
+
out << "Log Base2 of Sector size : #{@sb['sector_size_log']}\n"
|
523
|
+
out << "Log Base2 of Inode size : #{@sb['inode_size_log']}\n"
|
524
|
+
out << "Log Base2 of Inodes/Blk : #{@sb['inodes_per_blk_log']}\n"
|
525
|
+
out << "Log Base2 AllocGrp size : #{@sb['ag_blocks_log']}\n"
|
526
|
+
out << "Log Base2 RT Extent sz : #{@sb['rt_ext_size_log']}\n"
|
527
|
+
out << "In Progress Flag : #{@sb['in_progress']}\n"
|
528
|
+
out << "Inode Space Max Percent : #{@sb['inode_max_pct']}\n"
|
529
|
+
out << "Inodes Allocated on FS : #{@sb['inode_count']}\n"
|
530
|
+
out << "Free Inodes on FS : #{@sb['inode_free_count']}\n"
|
531
|
+
out << "Free Data Blocks on FS : #{@sb['free_data_blocks']}\n"
|
532
|
+
out << "Free RT Extents on FS : #{@sb['free_rt_extents']}\n"
|
533
|
+
out << "Inode # for User Quotas : #{@sb['user_quota_ino']}\n"
|
534
|
+
out << "Inode # for Grp Quotas : #{@sb['group_quota_ino']}\n"
|
535
|
+
out << "Quota Flags : #{@sb['quota_flags']}\n"
|
536
|
+
out << "Miscellaneous Flags : #{@sb['misc_flags']}\n"
|
537
|
+
out << "Shared Version # : #{@sb['shared_vers_no']}\n"
|
538
|
+
out << "Inode Chunk Alignment : #{@sb['inode_alignment']}\n"
|
539
|
+
out << "Stripe or Raid Unit : #{@sb['stripe_unit']}\n"
|
540
|
+
out << "Stripe or Raid Width : #{@sb['stripe_width']}\n"
|
541
|
+
out << "Log Base2 Dir Block : #{@sb['dir_block_log']}\n"
|
542
|
+
out << "Log Base2 Log Sect Size : #{@sb['log_sect_size_log']}\n"
|
543
|
+
out << "External Log Sect Size : #{@sb['log_sector_size']}\n"
|
544
|
+
out << "Log Device Stripe Size : #{@sb['log_stripe_unit_sz']}\n"
|
545
|
+
out << "Additional Version Flgs : #{@sb['features_2']}\n"
|
546
|
+
out << "Compat Features : #{@sb['features_compat']}\n"
|
547
|
+
out << "R/O Compat Features : #{@sb['features_ro_compat']}\n"
|
548
|
+
out << "Incompat Features : #{@sb['features_incompat']}\n"
|
549
|
+
out << "Log Incompat Features : #{@sb['features_log_incompat']}\n"
|
550
|
+
out << "Superblock CRC : #{@sb['superblock_crc']}\n"
|
551
|
+
out << "Inode # Project Quotas : #{@sb['proj_quota_ino']}\n"
|
552
|
+
out << "Last Write Sequence : #{@sb['last_write_seq']}\n"
|
553
|
+
out
|
554
|
+
end
|
555
|
+
end # class Superblock
|
556
|
+
end # module XFS
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'rake'
|
2
|
+
|
3
|
+
# Tasks for regenerating cassettes and running tests for the Azure
|
4
|
+
# solid state stuff. You should run these while in the gems/pending
|
5
|
+
# subdirectory.
|
6
|
+
#
|
7
|
+
# The tasks that regenerate cassettes assume that you have cloned the
|
8
|
+
# gems-pending-config project to your $HOME/Dev directory.
|
9
|
+
|
10
|
+
namespace 'azure' do
|
11
|
+
namespace 'record' do
|
12
|
+
env_dir = File.join(Dir.home, 'Dev', 'gems-pending-config')
|
13
|
+
|
14
|
+
desc 'Recreate the Azure blob disk cassettes'
|
15
|
+
task :disk do
|
16
|
+
yaml_dir = File.join(Rake.original_dir, 'spec/recordings/disk/modules/azure_blob_disk_spec')
|
17
|
+
Dir["#{yaml_dir}/*.yml"].each { |f| FileUtils.rm_rf(f) }
|
18
|
+
sh "TEST_ENV_DIR=#{env_dir} bundle exec rspec spec/disk/modules/azure_blob_disk_spec.rb"
|
19
|
+
end
|
20
|
+
|
21
|
+
desc 'Recreate the Azure VM image cassettes'
|
22
|
+
task :vm_image do
|
23
|
+
yaml_dir = File.join(Rake.original_dir, 'spec/recordings/miq_vm/miq_azure_vm_image_spec')
|
24
|
+
Dir["#{yaml_dir}/*.yml"].each { |f| FileUtils.rm_rf(f) }
|
25
|
+
sh "TEST_ENV_DIR=#{env_dir} bundle exec rspec spec/miq_vm/miq_azure_vm_image_spec.rb"
|
26
|
+
end
|
27
|
+
|
28
|
+
desc 'Recreate the Azure VM instance cassettes'
|
29
|
+
task :vm_instance do
|
30
|
+
yaml_dir = File.join(Rake.original_dir, 'spec/recordings/miq_vm/miq_azure_vm_instance_spec')
|
31
|
+
Dir["#{yaml_dir}/*.yml"].each { |f| FileUtils.rm_rf(f) }
|
32
|
+
sh "TEST_ENV_DIR=#{env_dir} bundle exec rspec spec/miq_vm/miq_azure_vm_instance_spec.rb"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
namespace 'spec' do
|
37
|
+
desc 'Run blob disk specs without regenerating cassettes'
|
38
|
+
task 'disk' do
|
39
|
+
sh "bundle exec rspec spec/disk/modules/azure_blob_disk_spec.rb"
|
40
|
+
end
|
41
|
+
|
42
|
+
desc 'Run VM image specs without regenerating cassettes'
|
43
|
+
task 'vm_image' do
|
44
|
+
sh "bundle exec rspec spec/miq_vm/miq_azure_vm_image_spec.rb"
|
45
|
+
end
|
46
|
+
|
47
|
+
desc 'Run VM instance specs without regenerating cassettes'
|
48
|
+
task 'vm_instance' do
|
49
|
+
sh "bundle exec rspec spec/miq_vm/miq_azure_vm_instance_spec.rb"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'manageiq/smartstate'
|