fsck.ocfs2.checks(8)
๐ฆ fsck.ocfs2.checks โ OCFS2 Manual Pages, section 8 ๐ฆ
okay bestie, listen up ๐ this is the fsck.ocfs2.checks(8) page and it's literally the gossip column of your OCFS2 file system: every problem fsck.ocfs2(8) might clock, and every glow-up it's willing to perform on the spot. no cap.
โจ NAME โจ
fsck.ocfs2.checks โ the consistency checks that fsck.ocfs2(8) performs, plus the ways it fixes the inconsistencies it finds. it's giving "diagnosis + treatment plan" energy ๐ฉบโจ
๐ธ DESCRIPTION ๐ธ
fsck.ocfs2(8) is the tool you run to check an OCFS2 file system. it does so many consistency checks, and when it catches a fault it will offer to fix it. this man page is basically the master list of every problem it might find, with a full breakdown of each fix.
the problems are indexed by the error number that fsck.ocfs2(8) emits when it describes the problem and asks whether it should fix it. so like, each heading down there is a little name tag for a specific error ๐
and here's the important vibe check about the prompts: they're constructed so that answering 'no' results in no changes to the file system. which sounds safe, sure, but it may result in errors later on that stop fsck.ocfs2(8) from proceeding. so no, you can't just say no to everything and expect to coast through ๐
๐ฅ CHECKS ๐ฅ
๐ EB_BLKNO
extent blocks carry a little receipt: a record of the disk block where they're located. well, one was found at a block that didn't match its recorded location. awkward ๐
answering yes updates the data structure in the extent block to reflect its real location on disk.
๐ EB_GEN
extent blocks are created with a generation number that matches the generation number of the volume at the time of creation. an extent block was found with a generation number that just... doesn't match.
answering yes implies the generation number is correct and that the extent block is from a previous file system. the extent block will be ignored, and the file that contains it will lose the data it referenced. ๐ญ
๐ EB_GEN_FIX
same setup, bestie: extent blocks are created with a generation number matching the volume's generation number at creation time, and an extent block was found whose generation number doesn't match.
answering yes implies the opposite of the last one โ that the generation number in the extent block is the incorrect one and the extent block itself is valid. the generation number in the block gets updated to match the generation number in the volume. ๐
๐ EXTENT_MARKED_UNWRITTEN
an extent record has the UNWRITTEN flag set, but the filesystem feature set does not include unwritten extents.
answering yes clears the UNWRITTEN flag. this is safe to do โ the feature is disabled anyway. ๐ซถ
๐ EXTENT_MARKED_REFCOUNTED
an extent record has the REFCOUNTED flag set, but neither the filesystem nor the file has the REFCOUNTED flag set.
answering yes clears the REFCOUNTED flag.
๐ EXTENT_BLKNO_UNALIGNED
the block that marks the start of an extent should always fall on the start of a cluster. an extent was found that starts part-way into a cluster. like, half a step into the doorway ๐ช
answering yes moves the start of the extent back to the start of the addressed cluster. heads up: this may add data to the middle of the file that contains this extent.
๐ EXTENT_CLUSTERS_OVERRUN
an extent was found claiming to contain clusters that are beyond the end of the volume. bold. ๐
answering yes clamps the extent to the end of the volume. this may result in a reduced file size for the file that contains the extent โ but fr, it couldn't have addressed those final clusters anyway. one can imagine this problem arising if there are problems shrinking a volume.
๐ EXTENT_EB_INVALID
deep extent trees are built by forming a tree out of extent blocks. an extent tree references an invalid extent block.
answering yes stops the tree from referencing the invalid extent block. this may truncate data from the file which contains the tree. ๐ฌ
๐ EXTENT_LIST_DEPTH
extent lists keep a record of their depth in the tree. an extent list was found whose recorded depth doesn't match the position it actually has in the tree.
answering yes updates the depth field in the list to match the tree on disk.
๐ EXTENT_LIST_COUNT
the number of entries in an extent list is bounded by either the size of the inode or the size of the block that contains it. an extent list was found claiming to have more entries than would fit in its container. it's giving overpacked suitcase ๐งณ
answering yes updates the count field in the extent list to match the container. answering no to this one may stop further fixes from being done, because the count value can not be trusted. ๐
๐ EXTENT_LIST_FREE
the number of free entries in an extent list must be less than the total number of entries in the list. a list was found claiming to have more free entries than possible entries. math is not mathing ๐
answering yes sets the number of free entries in the list equal to the total possible entries.
๐ EXTENT_BLKNO_RANGE
an extent record was found referencing a block that can not be referenced by an extent. the referenced block is either very early in the volume, and thus reserved, or beyond the end of the volume.
answering yes removes this extent record from the tree. this may remove data from the file which owns the tree โ but any such data was inaccessible anyway. ๐ซ
๐ CHAIN_CPG
the bitmap inode indicates a different clusters per group than the group descriptor. this value is typically static, and it's only modified by tunefs during volume resize โ and that too only on volumes having only one cluster group.
answering yes updates the clusters per group on the bitmap inode to the corresponding value in the group descriptor.
๐ SUPERBLOCK_CLUSTERS
the super block indicates a different total clusters value than the global bitmap. this is only possible due to a failed volume resize operation. ๐
answering yes updates the total clusters in the super block to the value specified in the global bitmap.
๐ FIXED_CHAIN_CLUSTERS
the global bitmap inode was repaired, resulting in a change to the total cluster count of the filesystem.
answering yes updates the total clusters in the super block to the value specified in the global bitmap.
๐ GROUP_UNEXPECTED_DESC
the group descriptors that make up the global bitmap chain allocator live at predictable locations on disk. a group descriptor was found in the global bitmap allocator which isn't at one of these locations โ so it shouldn't be in the allocator at all. uninvited guest energy ๐ซ
answering yes removes this descriptor from the global bitmap allocator.
๐ GROUP_EXPECTED_DESC
same lore: the group descriptors making up the global bitmap chain allocator reside at predictable locations on disk. a group descriptor at one of these locations was not linked into the global bitmap allocator. it was supposed to be at the party and never showed ๐ญ
answering yes will relink this group into the allocator.
๐ GROUP_GEN
a group descriptor was found with a generation number that doesn't match the generation number of the volume.
answering yes sets the group descriptor's generation equal to the generation number in the volume.
๐ GROUP_PARENT
group descriptors contain a pointer to the allocator inode that contains the chain they belong to. a group descriptor was found in an allocator inode that doesn't match the descriptor's parent pointer. who's your parent?? ๐
answering yes updates the group descriptor's parent pointer to match the inode it resides in.
๐ GROUP_DUPLICATE
group descriptors contain a pointer to the allocator inode that contains the chain they belong to. a group descriptor was found in two allocator inodes, so it may be duplicated. two places at once, main character behaviour โจ
answering yes removes the group descriptor from the current allocator inode.
๐ GROUP_BLKNO
group descriptors have a field recording their block location on disk. a group descriptor was found at a given location but is recorded as being somewhere else.
answering yes updates the group descriptor's recorded location to match where it actually is found on disk.
๐ GROUP_CHAIN
group descriptors are found in a number of different singly-linked chains in an allocator inode. a group descriptor records the chain number it's linked in. a group descriptor was found whose chain field doesn't match the chain it was found in.
answering yes sets the group descriptor's chain field to match the chain it is found in.
๐ GROUP_FREE_BITS
a group descriptor records the number of bits in its bitmap that are free. a group descriptor was found claiming to have more free bits than are valid in its bitmap. delulu ๐
answering yes decreases the number of recorded free bits so that it equals the total number of bits in the group descriptor's bitmap.
๐ GROUP_CHAIN_LOOP
a chain may loop if the next field of the group descriptor points to one of the previous group descriptors in the chain. this causes the ocfs2 code โ both user space and kernel module โ to loop forever. ๐๐ yeah, that's the bad one.
answering yes breaks the loop at an optimum location so that all the existing group descriptors are in the chain. however, it cannot re-connect stray group descriptors and must rely on the rest of the fsck code to fix it.
๐ CHAIN_COUNT
the chain list embedded in an inode is limited by the block size and the number of bytes consumed by the rest of the inode. a chain list header was found claiming there are more entries in the list than could fit in the inode.
answering yes resets the header's cl_count member to the maximum size allowed by the block size after accounting for the space consumed by the inode.
๐ CHAIN_NEXT_FREE
this is identical to CHAIN_COUNT except that it's testing and fixing the pointer to the next free list entry recorded in the cl_next_free_rec member, instead of the total number of entries. same vibe, different field ๐
๐ CHAIN_EMPTY
chain entries need to be packed such that there are no chains without descriptors found before the chain that is marked as free by the chain header. a chain without descriptors was found before the chain that was marked free. gap in the lineup ๐
answering yes will remove the unused chain and shift the remaining chains forward in the list.
๐ CHAIN_I_CLUSTERS
chain allocator inodes have an i_clusters value representing the number of clusters used by the allocator. an inode was found whose i_clusters value doesn't match the number of clusters its chains cover.
answering yes updates i_clusters in the inode to reflect what was actually found by walking the chain.
๐ CHAIN_I_SIZE
chain allocator inodes multiply the number of bytes per cluster by their i_clusters value and store it in i_size. an inode was found which didn't have the correct value in its i_size.
answering yes updates i_size to be the product of i_clusters and the cluster size. nothing else uses this value, and previous versions of tools didn't calculate it properly, so don't be too worried if this error appears. ๐ซถ chill.
๐ CHAIN_GROUP_BITS
the inode that contains an embedded chain list has fields recording the total number of bits covered by the chain as well as the amount free. these fields didn't match what was found in the chain.
answering yes updates the fields in the inode to reflect what was actually found by walking the chain.
๐ CHAIN_HEAD_LINK_RANGE
the header that starts a chain tried to reference a group descriptor at a block number that couldn't be valid.
answering yes will clear the reference to this invalid block and truncate the chain that it started.
okay we're not done yet bestie, there's more coming ๐โจ
๐ซ CHAIN_LINK_GEN
Somebody pointed at a group descriptor whose generation number does not match the generation number of the volume. Rude.
- Say yes and it means that group descriptor is straight-up invalid, and the chain gets truncated right at the spot where it referred to this bogus descriptor.
- Say no and the group descriptor gets treated as valid, and its generation may be fixed.
๐ CHAIN_LINK_MAGIC
Chains are built out of chain headers and group descriptors, all linked together by block references. Someone made a reference to a group descriptor at a given block, but when we looked at that block there was no valid group descriptor signature there. It's giving "fake".
- Say yes and the reference to that invalid block gets cleared, and the chain gets truncated right at the point of the reference.
๐ฆ CHAIN_LINK_RANGE
Chains = chain headers + group descriptors, linked together by block references. We found a reference to a block that cannot possibly be valid, because it was either too small or it extended past the end of the volume.
- Say yes and the chain in question gets truncated by zeroing out that invalid block reference. Heads up: this shortens the chain, and it could mean more fixes later if the part of the chain that couldn't be referenced was valid at some point. ๐
โจ CHAIN_BITS
A chain's header has members that record the total number of bits in the chain, plus how many of those bits are free. After walking through a chain, the number of bits recorded in the header turned out to not match what we got by totalling up the group descriptors.
- Say yes and it updates the
c_totalandc_freemembers of the header to reflect what was actually found in the group descriptors in the chain.
๐ DISCONTIG_BG_DEPTH
A discontiguous block group has an extent list that records all the clusters allocated to it. Discontiguous block groups only support extent lists with a tree depth of 0. This one claims to have a tree depth greater than 0. Not allowed, bestie.
- Say yes and it sets the tree depth of the extent list to
0.
๐ DISCONTIG_BG_COUNT
A discontiguous block group has an extent list recording all the clusters allocated to it. A block group claims to have more records than can actually fit. Math is not mathing.
- Say yes and it sets the record count to the maximum possible.
๐ธ DISCONTIG_BG_REC_RANGE
Block groups set aside clusters to be used for metadata. A discontiguous block group claims to contain clusters beyond the end of the volume. Ma'am, there is no volume there.
- Say yes and it removes the block group.
๐ DISCONTIG_BG_CORRUPT_LEAVES
A discontiguous block group has an extent list recording all the clusters allocated to it. A group has more than one extent claiming to have an impossible number of clusters.
- Say yes and it removes the block group.
๐ฅ DISCONTIG_BG_CLUSTERS
Extent records in a discontiguous block group were found having more clusters allocated than a block group can have.
- Say yes and it removes the block group.
๐ง DISCONTIG_BG_LESS_CLUSTERS
Extent records in a discontiguous block group were found having less clusters allocated than a block group can have.
- Say yes and it removes the block group.
โญ DISCONTIG_BG_NEXT_FREE_REC
A discontiguous block group has an extent list recording all the clusters allocated to it. A group was found with fewer filled-in extents than it claims to have, and the filled-in extents describe a complete and correct group. So likeโฆ the truth is right there.
- Say yes and it sets the used extent count to the number of filled extents.
๐ DISCONTIG_BG_LIST_CORRUPT
A discontiguous block group has an extent list recording all the clusters allocated to it. The group claims to have more extents than is possible, and the existing extents contain errors. Double trouble.
- Say yes and it removes the block group.
๐ DISCONTIG_BG_REC_CORRUPT
A discontiguous block group has an extent list recording all the clusters allocated to it. A group was found with one extent claiming too many clusters, but the sum of the remaining extents is equal to the total clusters a group must have.
- Say yes and it removes the block group.
๐ซถ DISCONTIG_BG_LEAF_CLUSTERS
A discontiguous block group has an extent list recording all the clusters allocated to it. A group was found with one extent claiming too many clusters, but the remaining extents are correct.
- Say yes and it sets the number of clusters on the broken extent to the difference between the total clusters a group must have and the sum of the remaining extents.
๐ INODE_ALLOC_REPAIR
The inode allocator did not accurately reflect the set of inodes that are free and in use in the volume. It lied, basically.
- Say yes and it updates the inode allocator bitmaps. Every bit that doesn't match the state of its inode gets inverted. ๐
๐ INODE_SUBALLOC
Each inode records which node's allocator is responsible for it. An inode was found in a given node's allocator, but the inode itself claimed to belong to a different node. Identity crisis.
- Say yes and it corrects the inode to point to the node's allocator that it actually belongs to.
โจ LALLOC_SIZE
Each node has a local allocator contained in a block, used to allocate clusters in batches. A node's local allocator claims to reflect more bytes than are possible for the volume's block size.
- Say yes and it decreases the local allocator's size to reflect the volume's block size.
๐ฆ LALLOC_NZ_USED
A given node's local allocator isn't in use, but it claims to have bits in use in its bitmap. Contradictory queen.
- Say yes and it zeros this used field.
๐ LALLOC_NZ_BM
A given node's local allocator isn't in use, but it has a field which records the bitmap as starting at a non-zero cluster offset.
- Say yes and it zeros the
bm_offfield.
๐ธ LALLOC_BM_OVERRUN
Each local allocator contains a reference to the first cluster that its bitmap addresses. A given local allocator was found referencing a starting cluster that is beyond the end of the volume.
- Say yes and it resets the given local allocator. Good news: no allocated data will be lost. ๐
๐ LALLOC_BM_SIZE
The given local allocator claims to cover more bits than are possible for the size in bytes of its bitmap.
- Say yes and it decreases the number of bits the allocator covers to reflect the size in bytes of the bitmap, and resets the allocator. No allocated data will be lost.
๐ฅ LALLOC_BM_STRADDLE
The given local allocator claims to cover a region of clusters which extends beyond the end of the volume.
- Say yes and it resets the given local allocator. No allocated data will be lost.
๐ง LALLOC_USED_OVERRUN
The given local allocator claims to have more bits in use than it has total bits in its bitmap. That's not a thing.
- Say yes and it decreases the number of bits used so that it equals the total number of available bits.
โญ LALLOC_CLEAR
A local allocator inode was found to have problems. This gives the operator a chance to justโฆ reset the local allocator inode. Fresh start energy. โจ
- Say yes and it clears the local allocator. No information is lost, but heads up: the global bitmap allocator may need to be updated to reflect clusters that were reserved for the local allocator but were actually free.
๐ DEALLOC_COUNT
The given truncate log inode contains a count that is greater than the value that is possible given the size of the inode.
- Say yes and it resets the count value to the possible maximum.
๐ DEALLOC_USED
The given truncate log inode claims to have more records in use than it is possible to store in the inode.
- Say yes and it resets the record of the number used to the maximum value possible.
๐ซถ TRUNCATE_REC_START_RANGE
A truncate record was found which claims to start at a cluster that is beyond the number of clusters in the volume.
- Say yes and it will clear the truncate record. This may result in previously freed space being marked as allocated โ but don't panic, that gets fixed up later as the allocator is updated to match what is used by the file system. ๐ ๏ธ
๐ TRUNCATE_REC_WRAP
Clusters are recorded as 32bit values. A truncate record was found which claims to have enough clusters to cause this value to wrap. That could never be the case and is a sure sign of corruption. ๐ฉ
- Say yes and it will clear the truncate record. This may result in previously freed space being marked as allocated โ fixed up later as the allocator is updated to match what is used by the file system.
๐ TRUNCATE_REC_RANGE
A truncate record was found which claims to reference a region of clusters that partially extends beyond the number of clusters in the volume.
- Say yes and it will clear the truncate record. This may result in previously freed space being marked as allocated โ fixed up later as the allocator is updated to match what is used by the file system.
โจ INODE_GEN
Inodes are created with a generation number to match the generation number of the volume at the time of creation. An inode was found which contains a generation number that doesn't match.
- Say yes and it implies the generation number is correct and that the inode is from a previous file system. The inode will be recorded as free.
๐ฆ INODE_GEN_FIX
Inodes are created with a generation number to match the generation number of the volume at the time of creation. An inode was found which contains a generation number that doesn't match.
- Say yes and it implies the generation number in the inode is incorrect and that the inode is valid. The generation number in the inode gets updated to match the generation number in the volume.
๐ INODE_BLKNO
Inodes contain a field that must match the block that they reside in. An inode was found at a block that doesn't match the field in the inode.
- Say yes and it updates the field to match the inode's position on disk.
๐ธ ROOT_NOTDIR
The super block contains a reference to the inode that contains the root directory. This block was found to contain an inode that isn't a directory. ๐ญ
- Say yes and it clears this inode. The operator will be asked to recreate the root directory at a point in the near future.
๐ INODE_NZ_DTIME
Inodes contain a field describing the time at which they were deleted. This can not be set for an inode that is still in use. An inode was found which is in use but which contains a non-zero dtime.
- Say yes and it implies the inode is still valid, and resets its dtime to zero.
๐ฅ LINK_FAST_DATA
The target name for a symbolic link is stored either as file contents for that inode, or in the inode structure itself on disk. Only small destination names are stored in the inode structure. The i_blocks field of the inode indicates that the name is stored in the inode when it is zero. An inode was found that has both i_blocks set to zero and file contents.
- Say yes and it clears the inode โ which means it deletes the link.
๐ง LINK_NULLTERM
The targets of links on disk must be null terminated. A link was found whose target wasn't null terminated.
Answering yes clears the inode and so deletes the link. bye bestie ๐
LINK_SIZE ๐
The size of a link on disk has to match the length of its target string. Like, that's the whole vibe. And we found a link whose size justโฆ doesn't. ๐
Answering yes updates the link's size so it actually reflects the length of its target string. glow-up complete โจ
LINK_BLOCKS ๐ฆ
Links can not be sparse, okay? There must be exactly as many blocks allocated as are needed to cover its size โ no more, no less, we don't do half measures here. A link was found which doesn't have enough blocks allocated to cover its size. not it ๐ญ
Answering yes clears the link's inode, thus deleting the link. gone, reduced to atoms ๐
DIR_ZERO ๐ธ
Directories must at least contain a block that has the "." and ".." entries. Bare minimum, babes. A directory was found which doesn't contain any blocks at all. zero blocks, zero thoughts ๐
Answering yes to this question clears the directory's inode, thus deleting the directory.
INODE_SIZE โญ
Certain inodes record the size of the data they reference in an i_size field. This can be the number of bytes in a file, directory, or symlink target which are stored in data mapped by extents of clusters. This error occurs when the extent lists are walked and the amount of data found does not match what is stored in i_size. the math is not mathing ๐ญ
Answering yes to this question updates the inode's i_size to match the amount of data referenced by the extent lists. It is vitally important that i_size matches the extent lists, and so answering yes is strongly encouraged. like, please. ๐ซถ
INODE_SPARSE_SIZE ๐
Certain inodes record the size of the data they reference in an i_size field. This can be the number of bytes in a file, directory, or symlink target which are stored in data mapped by extents of clusters. This error occurs when a sparse inode was found that had data allocated past its i_size. girl, you're spilling over ๐
Answering yes to this question will update the inode's i_size to cover all of its allocated storage. It is vitally important that i_size matches the extent lists, and so answering yes is strongly encouraged.
INODE_INLINE_SIZE ๐ง
Inodes can only fit a certain amount of inline data. This inode has its data inline but claims an i_size larger than will actually fit. delulu is not the solulu ๐
Answering yes to this question updates the inode's i_size to the maximum available inline space. realistic queen โจ
INODE_CLUSTERS ๐ฅ
Inodes contain a record of how many clusters are allocated to them. An inode was found whose recorded number of clusters doesn't match the number of blocks that were found associated with the inode. receipts don't match the story ๐
Answering yes resets the inode's number of clusters to reflect the number of blocks that were associated with the file.
INODE_SPARSE_CLUSTERS ๐
Inodes contain a record of how many clusters are allocated to them. A sparse inode was found whose recorded number of clusters doesn't match the number of blocks that were found associated with the inode. sparse and lying, a whole mood ๐ญ
Answering yes resets the inode's number of clusters to reflect the number of blocks that were associated with the file.
INODE_INLINE_CLUSTERS ๐
An inlined inode should not have allocated clusters. An inode who has the inline data flag set was found with clusters allocated. pick a lane bestie ๐
Answering yes resets the inode's number of clusters to zero.
LALLOC_REPAIR ๐ ๏ธ
An active local allocator did not accurately reflect the set of clusters that are free and in use in its region. the vibes were off, fr fr
Answering yes will update the local allocator bitmap. Each bit that doesn't match the use of its cluster will be inverted. flip it, reverse it ๐ช
LALLOC_USED ๐ข
A local allocator records the number of bits that are used in its bitmap. An allocator was found whose used value doesn't reflect the number of bits that are set in its bitmap.
Answering yes sets the used value to match the number of bits set in the allocator's bitmap.
CLUSTER_ALLOC_BIT ๐
A specific cluster's use didn't match the setting of its bit in the cluster allocator. one cluster living a double life ๐ญ
Answering yes will invert the bit in the allocator to match the use of the cluster โ either allocated and in use, or free. no in-between, periodt.
REFCOUNT_FLAG_INVALID ๐ฉ
A refcount file can only exist in a volume with refcount supported. Fsck has found that a file in a non-refcount volume has the refcount flag set. that flag does not belong here ๐
Answering yes removes this flag from the file.
REFCOUNT_LOC_INVALID ๐
Refcount loc can only be valid if the file has the refcount flag set. Fsck has found that a file has a refcount loc while it doesn't have the refcount flag set. loc without the flag? girl, unhinged ๐
Answering yes resets refcount loc to zero for the file.
RB_BLKNO ๐
Refcount blocks contain a record of the disk block where they are located. A refcount block was found at a block that didn't match its recorded location. lost, confused, doesn't know where it lives ๐ญ
Answering yes will update the data structure in the refcount block to reflect its real location on disk.
RB_GEN ๐ฐ๏ธ
Refcount blocks are created with a generation number to match the generation number of the volume at the time of creation. A refcount block was found which contains a generation number that doesn't match.
Answering yes implies that the generation number is correct and that the refcount block is from a previous file system. The refcount block will be removed and the file that uses it will lose the refcounted information, but it may be regenerated later. it's giving time traveler ๐งณ
RB_GEN_FIX ๐ง
Refcount blocks are created with a generation number to match the generation number of the volume at the time of creation. A refcount block was found which contains a generation number that doesn't match.
Answering yes implies that the generation number in the refcount block is incorrect and that the refcount block is valid. The generation number in the block is updated to match the generation number in the volume. fixed, no cap โจ
RB_PARENT ๐
Refcount blocks contain a record of the parent this disk block belongs to. A refcount block was found storing a wrong parent location.
Answering yes will update the data structure in the refcount block to reflect its parent's real location on disk. found family, but the correct one ๐ซถ
REFCOUNT_LIST_COUNT ๐ข
The number of entries in a refcount list is bounded by the size of the block which contains it. A refcount list was found which claims to have more entries than would fit in its container. ma'am that does not fit ๐
Answering yes updates the count field in the refcount list to match the container. Answering no to this question may stop further fixes from being done because the count value can not be trusted. so like, tread carefully ๐จ
REFCOUNT_LIST_USED ๐
The number of free entries in a refcount list must be less than the total number of entries in the list. A list was found which claims to have more free entries than possible entries. the math, bestie, the math ๐ญ
Answering yes sets the number of free entries in the list equal to the total possible entries.
REFCOUNT_CLUSTER_RANGE ๐ง
A refcount record was found which references a cluster which can not be referenced by a refcount. The referenced cluster is either very early in the volume, and thus reserved, or beyond the end of the volume. either way, off-limits ๐ฎ
Answering yes removes this refcount record from the tree.
REFCOUNT_CLUSTER_COLLISION ๐ฅ
A refcount record was found which references a cluster which has a collision with the previous valid refcount record. two records, one cluster, drama ๐ข
Answering yes removes this refcount record from the tree.
REFCOUNT_LIST_EMPTY ๐ณ๏ธ
A refcount list was found which has no refcount record in it. It is normally caused by a corrupted refcount record. empty. void. nothing. ๐
Answering yes removes this refcount block from the tree. It will be re-generated in the refcounted extent records handler if all the other information is sane. glow-up pending โจ
REFCOUNT_BLOCK_INVALID ๐ซ
A refcount block stores the refcount record for physical clusters of a file. It is found referring an invalid refcount block.
Answering yes removes this refcount block.
REFCOUNT_CLUSTERS ๐งฎ
A refcount tree contains a record of how many clusters are allocated to them. A tree was found whose recorded number of clusters doesn't match the number of blocks that were found associated with it.
Answering yes resets the number of clusters to reflect the real number of clusters that were associated with the tree. the real numbers are realing ๐
REFCOUNT_ROOT_BLOCK_INVALID ๐ฑ
The root refcount block is the root of the refcount record for a file. It is found referring an invalid refcount block.
Answering yes removes this refcount block and clears the refcount flag from this file. root cause found and it's the root itself, iconic ๐
REFCOUNT_REC_REDUNDANT ๐
A refcount record is used to store the refcount for physical clusters. Some refcount record is found to have no physical clusters corresponding to it. record with no clusters? unemployed, freeloading ๐ญ
Answering yes removes the refcount record.
REFCOUNT_COUNT_INVALID ๐
A refcount record is used to store the refcount for physical clusters. A refcount record is found which claims the wrong refcount for some physical clusters.
Answering yes updates the corresponding refcount record.
REFCOUNT_COUNT ๐ฏ
A refcount tree contains a record of how many files refer to this tree. A tree was found whose recorded number of files doesn't match the real files referring to the tree.
Answering yes resets the number of files to reflect the real number of files that were associated with the tree.
DUP_CLUSTERS_SYSFILE_CLONE ๐งฌ
A system file inode claims clusters that are also claimed by another inode. ocfs2 does not allow this. System files may be cloned but may not be deleted. Allocation system files may not be cloned or deleted. rules are rules, i don't make them ๐
Answering yes will copy the data of this inode to newly allocated extents. This will break the claim on the overcommitted clusters. fresh start, new extents, no drama ๐ฆ
DUP_CLUSTERS_CLONE ๐ช
An inode claims clusters that are also claimed by another inode. ocfs2 does not allow this.
Answering yes will copy the data of this inode to newly allocated extents. This will break the claim on the overcommitted clusters.
DUP_CLUSTERS_DELETE ๐๏ธ
An inode claims clusters that are also claimed by another inode. ocfs2 does not allow this.
Answering yes will remove this inode, thus breaking its claim on the overcommitted clusters. sorry babe, you gotta go ๐
DUP_CLUSTERS_ADD_REFCOUNT ๐ค
An inode claims clusters that are also claimed by another inode. ocfs2 does not allow this.
Answering yes will try to add a refcount record for all these inodes, so that they will share the cluster. sharing is caring, actually ๐ซถ
DIRENT_DOTTY_DUP ๐ฏโโ๏ธ
There can be only one instance of both the "." and ".." entries in a directory. A directory entry was found which duplicated one of these entries. copycat behaviour, we don't stan ๐
Answering yes will remove the duplicate directory entry.
DIRENT_NOT_DOTTY ๐ค
The first and second directory entries in a directory must be "." and ".." respectively. One of these directory entries was found to not match these rules. girl you had ONE job and it was to be in the correct order ๐
Answering yes will force the directory entry to be either "." or "..". This might consume otherwise valid entries and cause some files to appear in lost+found. so like, be aware ๐
DIRENT_DOT_INODE ๐
The inode field of the "." directory entry must refer to the directory inode that contains the given directory block. A "." entry was found which doesn't do so.
Answering yes sets the directory entry's inode reference to the parent directory that contains the entry. pointing it back home where it belongs ๐ก
DIRENT_DOT_EXCESS ๐
okay so there was a "." directory entry, and its length is lowkey too big for just the single dot in the name. Like, why so much room bestie? ๐
Answering yes creates another empty directory entry in that excess space. Recycling! โป๏ธ
DIRENT_ZERO ๐
a directory entry showed up with a name that's zero length. literally no name. the audacity ๐
Answering yes clears that directory entry so its space can be reused. ๐ซถ
DIRENT_NAME_CHARS โจ
directory entries can NOT contain the NULL character (ASCII 0) or the forward slash (ASCII 47). we found an entry with one of those forbidden lil guys in it ๐ญ
Answering yes will change each instance of these forbidden characters into a period (ASCII 46). Periodt. ๐
DIRENT_INODE_RANGE ๐ฅ
every directory entry has an inode field that its name corresponds to. this one referenced an inode number that is invalid for the current volume โ not it, not on this volume, no thank you.
Answering yes clears this entry so its space can be reused. Quick note tho: if the entry once corresponded to a real inode and got corrupted, this inode may show up in lost+found. ๐ฆ
DIRENT_INODE_FREE ๐ธ
same deal โ each entry has an inode field. this one referenced an inode number that isn't in use.
Answering yes clears this directory entry. gone. ๐ซถ
DIRENT_TYPE ๐
each directory entry has a field describing the type of file it refers to. we found an entry whose type doesn't match the inode it's pointing at. it's giving liar ๐
Answering yes resets the entry's type to match the target inode. โจ
DIR_PARENT_DUP ๐
a directory can only be pointed to by one directory entry in a parent directory. we found a second entry pointing to a given directory inode. two parents? in this economy?
Answering yes clears this entry which was the second to refer to a given directory. this reflects the policy that hard links to directories are not allowed. periodt. ๐
DIRENT_DUPLICATE ๐
file names within a directory must be unique, bestie. this name showed up in more than one directory entry in a given directory ๐ญ
Answering yes renames the duplicate entry to a name that doesn't collide with recent entries and is unlikely to collide with future entries in the directory. main character gets a new name. ๐
DIRENT_LENGTH ๐ฅ
there are very few directory entry lengths that are valid, and the vibe check is strict:
- the length must be greater than the minimum required to record a single character directory
- it must be rounded to 12 bytes
- it must be within the amount of space remaining in a directory block
- it must be properly rounded for the size of the name of the directory entry
an entry was found that didn't meet these criteria. ๐
Answering yes will try to repair the directory entry.
โ ๏ธ real talk: this runs a very good chance of invalidating all the entries in the directory block. orphaned inodes may appear in lost+found. proceed with the awareness, bestie. ๐
DIR_TRAILER_INODE ๐ง
so a directory block trailer is a fake directory entry at the end of the block. it has compatibility fields for when it's viewed as a directory entry, and the inode field must be zero.
Answering yes will set the inode field to zero. โจ
DIR_TRAILER_NAME_LEN ๐
same trailer, fake directory entry at the end of the block, compatibility fields and all. the name length field must be zero.
Answering yes will set the name length field to zero. ๐ซถ
DIR_TRAILER_REC_LEN ๐
trailer again ๐ซ the record length field must be equal to the size of the trailer.
Answering yes will set the record length field to the size of the trailer. matching, as it should be. โจ
DIR_TRAILER_BLKNO ๐ธ
the directory block trailer's self-referential block number is incorrect. it's lying about which block it is ๐ญ
Answering yes will set the block number to the correct block on disk. fixed. ๐ซถ
DIR_TRAILER_PARENT_INODE ๐
the trailer has a pointer to the directory inode it belongs to, and that pointer is incorrect. wrong parent, tragic. ๐
Answering yes will set the parent inode pointer to the inode referencing this directory block. ๐
ROOT_DIR_MISSING ๐
the super block contains a reference to the inode that serves as the root directory, and that reference points to an inode that isn't in use. the root?? missing?? not on my watch ๐ฅ
Answering yes will create a new inode and update the super block to refer to this inode as the root directory. โจ
LOSTFOUND_MISSING ๐ฆ
same energy โ the super block references the inode that serves as the lost+found directory, and that reference points to an inode that isn't in use.
Answering yes will create a new lost+found directory in the root directory. we love a comeback. ๐ซถ
DIR_NOT_CONNECTED ๐ง
every directory in the file system should be reachable by a directory entry in its parent directory โ this gets verified by walking every directory in the system. during that walk, a directory inode was found that doesn't have a parent directory entry. orphaned directory energy ๐ญ
Answering yes moves this directory entry into the lost+found directory and gives it a name based on its inode number. ๐
DIR_DOTDOT ๐ซ
a directory inode's ".." directory entry must refer to the parent directory. we found a directory whose ".." doesn't refer to its parent. it forgot where it came from ๐
Answering yes will read the directory block for the given directory and update its ".." entry to reflect its parent. โจ
INODE_NOT_CONNECTED ๐ธ
most all inodes in the system should be referenced by a directory entry. this inode isn't referred to by any directory entry. no one's claiming it, no cap. ๐
Answering yes moves this inode into the lost+found directory and gives it a name based on its inode number. ๐ซถ
INODE_COUNT ๐ข
each inode records the number of directory entries that refer to it. we found an inode whose recorded count doesn't match the actual number of entries that refer to it. math not mathing ๐ญ
Answering yes sets the inode's count to match the number of referring directory entries. ๐
INODE_ORPHANED ๐
so when files are being deleted they get placed in an internal directory. if the machine crashes while that's happening, the files are left sitting in there. fsck found an inode in this directory and would like to finish the job of truncating and removing it. closure arc โจ
Answering yes removes the file data associated with the inode and frees the inode. ๐ซถ
RECOVER_BACKUP_SUPERBLOCK ๐
when fsck.ocfs2 successfully uses the specified backup superblock, it offers you this option to overwrite the existing superblock with that backup.
Answering yes will refresh the superblock from the backup. Answering no will only disable the copying of the backup superblock and will not effect the remaining fsck.ocfs2 processing. iykyk. ๐
ORPHAN_DIR_MISSING ๐ง
while files are being deleted they're placed in an internal directory, named orphan directory. if an orphan directory doesn't exist, an OCFS2 volume cannot be mounted successfully. fsck found the orphan directory is missing and would like to create it for future use.
Answering yes creates the orphan directory in the system directory. ๐ซถ
JOURNAL_FILE_INVALID ๐
OCFS2 uses JDB for journalling, and some journal files exist in the system directory. fsck found some journal files that are invalid. ๐
Answering yes to this question will regenerate the invalid journal files. glow up โจ
JOURNAL_UNKNOWN_FEATURE ๐ฅ
fsck found some journal files with unknown features. other journals on the filesystem have only known features, so this is likely a corruption. if you think your filesystem may be newer than this version of fsck.ocfs2, say N here and grab the latest version of fsck.ocfs2.
Answering yes resets the journal features to match other journals. ๐
JOURNAL_MISSING_FEATURE ๐
fsck found some journal files have features that are not set on all journal files. all journals on the filesystem should have the same set of features. consistency bestie, it's a thing. โจ
Answering yes will set all journals to the union of set features. ๐ซถ
JOURNAL_TOO_SMALL ๐
fsck found some journal files are too small. smol. ๐ฅบ
Answering yes extends these journals. ๐ฅ
RECOVER_CLUSTER_INFO โ ๏ธ
the currently active cluster stack is different than the one the filesystem is configured for. because of that, fsck.ocfs2 cannot determine whether the filesystem is mounted on another node or not. the recommended solution is to exit and run fsck.ocfs2 on this device from a node that has the appropriate active cluster stack. however, you can proceed with the fsck if you are sure that the volume is not in use on any node.
Answering yes reconfigures the filesystem to use the current cluster stack.
๐จ DANGER: YOU MUST BE ABSOLUTELY SURE THAT NO OTHER NODE IS USING THIS FILESYSTEM BEFORE CONTINUING. OTHERWISE, YOU CAN CORRUPT THE FILESYSTEM AND LOSE DATA. ๐จ
INLINE_DATA_FLAG_INVALID ๐ฆ
an inline file can only exist in a volume with inline supported. fsck found that a file in a non-inline volume has the inline flag set. sir this is a non-inline volume ๐
Answering yes remove this flag from the file. ๐
INLINE_DATA_COUNT_INVALID โจ
for an inline file, there's a limit for id2.id_data.id_count. fsck found that this value isn't right. the limit said no. ๐
Answering yes change this value to the right number. ๐ซถ
XATTR_BLOCK_INVALID ๐ธ
extended attributes are stored off an extended attribute block referenced by the inode. this inode references an invalid extended attribute block. ๐ญ
Answering yes will remove this block. ๐ซถ
XATTR_COUNT_INVALID ๐ข
the count of extended attributes in an inode, block, or bucket does not match the number of entries found by fsck. the numbers said bestie no ๐ญ
Answering yes will change this to the correct count. โจ
XATTR_ENTRY_INVALID ๐
an extended attribute entry points to already used space. double dipping, not allowed. ๐
Answering yes will remove this entry. ๐
XATTR_NAME_OFFSET_INVALID ๐
the name_offset field of an extended attribute entry is not correct. without a correct name_offset field, the entry cannot be used. periodt.
Answering yes will remove this entry. ๐ซถ
XATTR_VALUE_INVALID ๐
the value region of an extended attribute points to already used space. overlapping, chaotic, no. ๐ญ
Answering yes will remove this entry. โจ
XATTR_LOCATION_INVALID ๐ง
the xe_local field and the xe_value_size field of an extended attribute entry do not match. so the entry cannot be used. incompatible fr fr ๐
Answering yes will remove this entry. ๐ซถ
XATTR_HASH_INVALID ๐
extended attributes use a hash of their name for lookup purposes. the name_hash of this extended attribute entry is not correct. wrong hash, wrong vibe. ๐ฅ
Answering yes will change this to the correct hash. ๐
XATTR_FREE_START_INVALID ๐ธ
extended attributes use free_start to indicate the offset of the free space in an inode, block, or bucket. the free_start field of this object is not correct.
Answering yes will change this to the correct offset. โจ
XATTR_VALUE_LEN_INVALID ๐
extended attributes use name_value_len to store the total length of all entry's name and value in an inode, block or bucket. the name_value_len field of this object is not correct.
Answering yes will change this to the correct value. ๐ซถ
XATTR_BUCKET_COUNT_INVALID
okay so the count of extended attributes bucket pointed by one extent record does not match the number of buckets fsck found. ๐
Answering yes will change this to the correct count. โจ
QMAGIC_INVALID
the magic number in the header of quota file is lowkey not matching the proper number. ๐ญ
Answering yes will make fsck use values in the quota file header anyway. ๐ซถ
QTREE_BLK_INVALID
the block with references to other blocks with quota data is corrupted, bestie. it's giving broken. ๐
Answering yes will make fsck use references in the block. ๐ฅ
DQBLK_INVALID
the structure with quota limits was found in a corrupted block. not iconic of it. ๐
Answering yes will use the values of limits for the user / group. ๐
DUP_DQBLK_INVALID
the structure with quota limits was found in a corrupted block and fsck has already found quota limits for this user / group. double trouble fr fr. ๐ญ
Answering yes will use new values of limits for the user / group. ๐
DUP_DQBLK_VALID
the structure with quota limits was found in a correct block but fsck has already found quota limits for this user / group. so valid but also duplicate, the drama. ๐
Answering yes will use new values of limits for the user / group. โจ
IV_DX_TREE
a directory index was found on an inode but that feature is not enabled on the file system. main character energy in the wrong era. ๐
Answering yes will truncate the invalid index. ๐ฆ
DX_LOOKUP_FAILED
a directory entry is missing an entry in the directory index. the missing index entry will cause lookups on this name to fail. so rude of it. ๐ค
Answering yes will rebuild the directory index, restoring the missing entry. ๐ฅ
NO_HOLES
a metadata structure encountered a hole where it should not. examples of such structures are directories, refcount trees, dx_trees etc. holes are for jeans, not metadata. ๐
Answering yes will remove the hole by updating the offset to the expected value. ๐ซถ
EXTENT_OVERLAP
the extents of the file overlap, which means there could be two or more possible data for a particular offset for the file. it's giving choose-your-own-adventure but make it data corruption. ๐ญ
Answering yes will serialize the extents. โจ
DX_TREE_CORRUPT
the index tree of the directory is corrupt. not slay. ๐
Answering yes will rebuild the directory index, in pass 2. ๐
DX_TREE_MISSING
the index of this directory is missing. gone. vanished. not in its flop era, just absent. ๐
Answering yes will rebuild the directory index. ๐ธ
BAD_CRC32
the metadata block has a bad CRC32, which means either the block or the crc32 field is corrupted. one of them is lying bestie. ๐
Answering yes will recalculate the CRC32. โญ
โจ SEE ALSO โจ
if you're in your research era, go hang with the rest of the friend group: debugfs.ocfs2(8), fsck.ocfs2(8), mkfs.ocfs2(8), mount.ocfs2(8), mounted.ocfs2(8), o2cluster(8), o2image(8), o2info(1), tunefs.ocfs2(8). iykyk ๐ฆ
๐ AUTHORS ๐
Oracle Corporation. periodt. ๐
๐ COPYRIGHT ๐
Copyright ยฉ 2004, 2012 Oracle. All rights reserved. no cap. ๐
this page is giving Version 1.8.9, January 2012, fsck.ocfs2.checks(8) energy and honestly? iconic. go off bestie ๐ โจ
๐ฆ where this page comes from
- fedora 44: ocfs2-tools 1.8.9-2.fc44 ยท GPL-2.0-only
- fedora 44: ocfs2-tools 1.8.9-2.fc44 ยท GPL-2.0-only
- ubuntu resolute: ocfs2-tools 1.8.9-1 ยท GPL-2.0-or-later
- ubuntu stonking: ocfs2-tools 1.8.9-1 ยท GPL-2.0-or-later
- ๐ girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms