ext4

package
v0.0.0-...-4339555 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 8, 2023 License: Apache-2.0 Imports: 13 Imported by: 9

Documentation

Index

Constants

View Source
const (
	SectorSize       = 0x200
	SuperBlockSize   = 0x400
	GroupZeroPadding = 0x400

	INDEX_FL                        = 0x00001000
	EXTENTS_FL                      = 0x00080000
	FEATURE_COMPAT_DIR_PREALLOC     = 0x0001
	FEATURE_COMPAT_IMAGIC_INODES    = 0x0002
	FEATURE_COMPAT_HAS_JOURNAL      = 0x0004
	FEATURE_COMPAT_EXT_ATTR         = 0x0008
	FEATURE_COMPAT_RESIZE_INODE     = 0x0010
	FEATURE_COMPAT_DIR_INDEX        = 0x0020
	FEATURE_COMPAT_SPARSE_SUPER2    = 0x0200
	FEATURE_RO_COMPAT_SPARSE_SUPER  = 0x0001
	FEATURE_RO_COMPAT_LARGE_FILE    = 0x0002
	FEATURE_RO_COMPAT_BTREE_DIR     = 0x0004
	FEATURE_RO_COMPAT_HUGE_FILE     = 0x0008
	FEATURE_RO_COMPAT_GDT_CSUM      = 0x0010
	FEATURE_RO_COMPAT_DIR_NLINK     = 0x0020
	FEATURE_RO_COMPAT_EXTRA_ISIZE   = 0x0040
	FEATURE_RO_COMPAT_QUOTA         = 0x0100
	FEATURE_RO_COMPAT_BIGALLOC      = 0x0200
	FEATURE_RO_COMPAT_METADATA_CSUM = 0x0400
	FEATURE_RO_COMPAT_READONLY      = 0x1000
	FEATURE_RO_COMPAT_PROJECT       = 0x2000
	FEATURE_INCOMPAT_COMPRESSION    = 0x0001
	FEATURE_INCOMPAT_FILETYPE       = 0x0002
	FEATURE_INCOMPAT_RECOVER        = 0x0004
	FEATURE_INCOMPAT_JOURNAL_DEV    = 0x0008
	FEATURE_INCOMPAT_META_BG        = 0x0010
	FEATURE_INCOMPAT_EXTENTS        = 0x0040
	FEATURE_INCOMPAT_64BIT          = 0x0080
	FEATURE_INCOMPAT_MMP            = 0x0100
	FEATURE_INCOMPAT_FLEX_BG        = 0x0200
	FEATURE_INCOMPAT_EA_INODE       = 0x0400
	FEATURE_INCOMPAT_DIRDATA        = 0x1000
	FEATURE_INCOMPAT_CSUM_SEED      = 0x2000
	FEATURE_INCOMPAT_LARGEDIR       = 0x4000
	FEATURE_INCOMPAT_INLINE_DATA    = 0x8000
	FEATURE_INCOMPAT_ENCRYPT        = 0x10000
)

Variables

View Source
var (
	ErrInodeNotFound = xerrors.New("inode not found")
)
View Source
var (
	ErrOpenSymlink = xerrors.New("open symlink does not support")
)

Functions

func Check

func Check(r io.Reader) bool

Types

type Cache

type Cache[K comparable, V any] interface {
	// Add cache data
	Add(key K, value V) bool

	// Get returns key's value from the cache
	Get(key K) (value V, ok bool)
}

type DirectoryEntry2

type DirectoryEntry2 struct {
	Inode   uint32 `struc:"uint32,little"`
	RecLen  uint16 `struc:"uint16,little"`
	NameLen uint8  `struc:"uint8,sizeof=Name"`
	Flags   uint8  `struc:"uint8"`
	Name    string `struc:"[]byte"`
}

DirectoryEntry2 is more or less a flat file that maps an arbitrary byte string

type DirectoryEntryCsum

type DirectoryEntryCsum struct {
	FakeInodeZero uint32 `struc:"uint32,little"`
	RecLen        uint16 `struc:"uint16,little"`
	FakeNameLen   uint8  `struc:"uint8"`
	FakeFileType  uint8  `struc:"uint8"`
	Checksum      uint32 `struc:"uint32,little"`
}

DirectoryEntryCsum is not use

type Extent

type Extent struct {
	Block   uint32 `struc:"uint32,little"`
	Len     uint16 `struc:"uint16,little"`
	StartHi uint16 `struc:"uint16,little"`
	StartLo uint32 `struc:"uint32,little"`
}

Extent is extent tree leaf nodes

type ExtentHeader

type ExtentHeader struct {
	Magic      uint16 `struc:"uint16,little"`
	Entries    uint16 `struc:"uint16,little"`
	Max        uint16 `struc:"uint16,little"`
	Depth      uint16 `struc:"uint16,little"`
	Generation uint32 `struc:"uint32,little"`
}

ExtentHeader is ...

type ExtentInternal

type ExtentInternal struct {
	Block    uint32 `struc:"uint32,little"`
	LeafLow  uint32 `struc:"uint32,little"`
	LeafHigh uint16 `struc:"uint16,little"`
	Unused   uint16 `struc:"uint16,little"`
}

ExtentInternal

type File

type File struct {
	FileInfo
	// contains filtered or unexported fields
}

File is implemented io/fs File interface

func (*File) Close

func (f *File) Close() error

func (File) Dir

func (f File) Dir() string

func (File) FilePath

func (f File) FilePath() string

func (*File) Read

func (f *File) Read(p []byte) (n int, err error)

func (*File) Stat

func (f *File) Stat() (fs.FileInfo, error)

type FileInfo

type FileInfo struct {
	// contains filtered or unexported fields
}

FileInfo is implemented io/fs FileInfo interface

func (FileInfo) IsDir

func (fi FileInfo) IsDir() bool
func (f FileInfo) IsSymlink() bool

func (FileInfo) ModTime

func (fi FileInfo) ModTime() time.Time

func (FileInfo) Mode

func (fi FileInfo) Mode() fs.FileMode

func (FileInfo) Name

func (fi FileInfo) Name() string

func (FileInfo) Size

func (fi FileInfo) Size() int64

func (FileInfo) Sys

func (fi FileInfo) Sys() interface{}

type FileSystem

type FileSystem struct {
	// contains filtered or unexported fields
}

FileSystem is implemented io/fs interface

func NewFS

func NewFS(r io.SectionReader, cache Cache[string, any]) (*FileSystem, error)

NewFS is created io/fs.FS for ext4 filesystem

func (*FileSystem) Extents

func (ext4 *FileSystem) Extents(inode *Inode) ([]Extent, error)

func (*FileSystem) Open

func (ext4 *FileSystem) Open(name string) (fs.File, error)

func (*FileSystem) ReadDir

func (ext4 *FileSystem) ReadDir(path string) ([]fs.DirEntry, error)

func (*FileSystem) ReadDirInfo

func (ext4 *FileSystem) ReadDirInfo(name string) (fs.FileInfo, error)

func (*FileSystem) Stat

func (ext4 *FileSystem) Stat(name string) (fs.FileInfo, error)

type GroupDescriptor

type GroupDescriptor struct {
	GroupDescriptor32
	BlockBitmapHi     uint32 `struc:"uint32,little"`
	InodeBitmapHi     uint32 `struc:"uint32,little"`
	InodeTableHi      uint32 `struc:"uint32,little"`
	FreeBlocksCountHi uint16 `struc:"uint16,little"`
	FreeInodesCountHi uint16 `struc:"uint16,little"`
	UsedDirsCountHi   uint16 `struc:"uint16,little"`
	ItableUnusedHi    uint16 `struc:"uint16,little"`
	ExcludeBitmapHi   uint32 `struc:"uint32,little"`
	BlockBitmapCsumHi uint16 `struc:"uint16,little"`
	InodeBitmapCsumHi uint16 `struc:"uint16,little"`
	Reserved          uint32 `struc:"uint32,little"`
}

GroupDescriptor is 64 byte

func (*GroupDescriptor) GetBlockBitmapLoc

func (gd *GroupDescriptor) GetBlockBitmapLoc(featureInCompat64bit bool) int64

GetBlockBitmapLoc is ...

func (*GroupDescriptor) GetInodeBitmapLoc

func (gd *GroupDescriptor) GetInodeBitmapLoc(featureInCompat64bit bool) int64

GetInodeBitmapLoc is ...

func (*GroupDescriptor) GetInodeTableLoc

func (gd *GroupDescriptor) GetInodeTableLoc(featureInCompat64bit bool) int64

GetInodeTableLoc is ...

type GroupDescriptor32

type GroupDescriptor32 struct {
	BlockBitmapLo     uint32 `struc:"uint32,little"`
	InodeBitmapLo     uint32 `struc:"uint32,little"`
	InodeTableLo      uint32 `struc:"uint32,little"`
	FreeBlocksCountLo uint16 `struc:"uint16,little"`
	FreeInodesCountLo uint16 `struc:"uint16,little"`
	UsedDirsCountLo   uint16 `struc:"uint16,little"`
	Flags             uint16 `struc:"uint16,little"`
	ExcludeBitmapLo   uint32 `struc:"uint32,little"`
	BlockBitmapCsumLo uint16 `struc:"uint16,little"`
	InodeBitmapCsumLo uint16 `struc:"uint16,little"`
	ItableUnusedLo    uint16 `struc:"uint16,little"`
	Checksum          uint16 `struc:"uint16,little"`
}

GroupDescriptor32 is 32 byte

type Inode

type Inode struct {
	Mode           uint16   `struc:"uint16,little"`
	UID            uint16   `struc:"uint16,little"`
	SizeLo         uint32   `struc:"uint32,little"`
	Atime          uint32   `struc:"uint32,little"`
	Ctime          uint32   `struc:"uint32,little"`
	Mtime          uint32   `struc:"uint32,little"`
	Dtime          uint32   `struc:"uint32,little"`
	GID            uint16   `struc:"uint16,little"`
	LinksCount     uint16   `struc:"uint16,little"`
	BlocksLo       uint32   `struc:"uint32,little"`
	Flags          uint32   `struc:"uint32,little"`
	Osd1           uint32   `struc:"uint32,little"`
	BlockOrExtents [60]byte `struc:"[60]byte,little"`
	Generation     uint32   `struc:"uint32,little"`
	FileACLLo      uint32   `struc:"uint32,little"`
	SizeHigh       uint32   `struc:"uint32,little"`
	ObsoFaddr      uint32   `struc:"uint32,little"`
	// OSD2 - linux only starts
	BlocksHigh  uint16 `struc:"uint16,little"`
	FileACLHigh uint16 `struc:"uint16,little"`
	UIDHigh     uint16 `struc:"uint16,little"`
	GIDHigh     uint16 `struc:"uint16,little"`
	ChecksumLow uint16 `struc:"uint16,little"`
	Unused      uint16 `struc:"uint16,little"`
	// OSD2 - linux only ends
	ExtraIsize  uint16 `struc:"uint16,little"`
	ChecksumHi  uint16 `struc:"uint16,little"`
	CtimeExtra  uint32 `struc:"uint32,little"`
	MtimeExtra  uint32 `struc:"uint32,little"`
	AtimeExtra  uint32 `struc:"uint32,little"`
	Crtime      uint32 `struc:"uint32,little"`
	CrtimeExtra uint32 `struc:"uint32,little"`
	VersionHi   uint32 `struc:"uint32,little"`
	Projid      uint32 `struc:"uint32,little"`
	// padding
	Reserved [96]uint8 `struc:"[96]uint32,little"`
}

Inode is index-node

func (*Inode) GetSize

func (i *Inode) GetSize() int64

GetSize is get inode file size

func (Inode) IsDir

func (i Inode) IsDir() bool

func (Inode) IsRegular

func (i Inode) IsRegular() bool

func (Inode) IsSocket

func (i Inode) IsSocket() bool
func (i Inode) IsSymlink() bool

func (*Inode) UsesDirectoryHashTree

func (i *Inode) UsesDirectoryHashTree() bool

UsesDirectoryHashTree

func (*Inode) UsesExtents

func (i *Inode) UsesExtents() bool

UsesExtents

type MoveExtent

type MoveExtent struct {
	Reserved   uint32 `struc:"uint32,little"`
	DonorFd    uint32 `struc:"uint32,little"`
	OrigStart  uint64 `struc:"uint64,little"`
	DonorStart uint64 `struc:"uint64,little"`
	Len        uint64 `struc:"uint64,little"`
	MovedLen   uint64 `struc:"uint64,little"`
}

MoveExtent is not use

type Superblock

type Superblock struct {
	InodeCount           uint32     `struc:"uint32,little"`
	BlockCountLo         uint32     `struc:"uint32,little"`
	RBlockCountLo        uint32     `struc:"uint32,little"`
	FreeBlockCountLo     uint32     `struc:"uint32,little"`
	FreeInodeCount       uint32     `struc:"uint32,little"`
	FirstDataBlock       uint32     `struc:"uint32,little"`
	LogBlockSize         uint32     `struc:"uint32,little"`
	LogClusterSize       uint32     `struc:"uint32,little"`
	BlockPerGroup        uint32     `struc:"uint32,little"`
	ClusterPerGroup      uint32     `struc:"uint32,little"`
	InodePerGroup        uint32     `struc:"uint32,little"`
	Mtime                uint32     `struc:"uint32,little"`
	Wtime                uint32     `struc:"uint32,little"`
	MntCount             uint16     `struc:"uint16,little"`
	MaxMntCount          uint16     `struc:"uint16,little"`
	Magic                uint16     `struc:"uint16,little"`
	State                uint16     `struc:"uint16,little"`
	Errors               uint16     `struc:"uint16,little"`
	MinorRevLevel        uint16     `struc:"uint16,little"`
	Lastcheck            uint32     `struc:"uint32,little"`
	Checkinterval        uint32     `struc:"uint32,little"`
	CreatorOs            uint32     `struc:"uint32,little"`
	RevLevel             uint32     `struc:"uint32,little"`
	DefResuid            uint16     `struc:"uint16,little"`
	DefResgid            uint16     `struc:"uint16,little"`
	FirstIno             uint32     `struc:"uint32,little"`
	InodeSize            uint16     `struc:"uint16,little"`
	BlockGroupNr         uint16     `struc:"uint16,little"`
	FeatureCompat        uint32     `struc:"uint32,little"`
	FeatureIncompat      uint32     `struc:"uint32,little"`
	FeatureRoCompat      uint32     `struc:"uint32,little"`
	UUID                 [16]byte   `struc:"[16]byte"`
	VolumeName           [16]byte   `struc:"[16]byte"`
	LastMounted          [64]byte   `struc:"[64]byte"`
	AlgorithmUsageBitmap uint32     `struc:"uint32,little"`
	PreallocBlocks       byte       `struc:"byte"`
	PreallocDirBlocks    byte       `struc:"byte"`
	ReservedGdtBlocks    uint16     `struc:"uint16,little"`
	JournalUUID          [16]byte   `struc:"[16]byte"`
	JournalInum          uint32     `struc:"uint32,little"`
	JournalDev           uint32     `struc:"uint32,little"`
	LastOrphan           uint32     `struc:"uint32,little"`
	HashSeed             [4]uint32  `struc:"[4]uint32,little"`
	DefHashVersion       byte       `struc:"byte"`
	JnlBackupType        byte       `struc:"byte"`
	DescSize             uint16     `struc:"uint16,little"`
	DefaultMountOpts     uint32     `struc:"uint32,little"`
	FirstMetaBg          uint32     `struc:"uint32,little"`
	MkfTime              uint32     `struc:"uint32,little"`
	JnlBlocks            [17]uint32 `struc:"[17]uint32,little"`
	BlockCountHi         uint32     `struc:"uint32,little"`
	RBlockCountHi        uint32     `struc:"uint32,little"`
	FreeBlockCountHi     uint32     `struc:"uint32,little"`
	MinExtraIsize        uint16     `struc:"uint16,little"`
	WantExtraIsize       uint16     `struc:"uint16,little"`
	Flags                uint32     `struc:"uint32,little"`
	RaidStride           uint16     `struc:"uint16,little"`
	MmpUpdateInterval    uint16     `struc:"uint16,little"`
	MmpBlock             uint64     `struc:"uint64,little"`
	RaidStripeWidth      uint32     `struc:"uint32,little"`
	LogGroupPerFlex      byte       `struc:"byte"`
	ChecksumType         byte       `struc:"byte"`
	EncryptionLevel      byte       `struc:"byte"`
	ReservedPad          byte       `struc:"byte"`
	KbyteWritten         uint64     `struc:"uint64,little"`
	SnapshotInum         uint32     `struc:"uint32,little"`
	SnapshotID           uint32     `struc:"uint32,little"`
	SnapshotRBlockCount  uint64     `struc:"uint64,little"`
	SnapshotList         uint32     `struc:"uint32,little"`
	ErrorCount           uint32     `struc:"uint32,little"`
	FirstErrorTime       uint32     `struc:"uint32,little"`
	FirstErrorIno        uint32     `struc:"uint32,little"`
	FirstErrorBlock      uint64     `struc:"uint64,little"`
	FirstErrorFunc       [32]byte   `struc:"[32]pad"`
	FirstErrorLine       uint32     `struc:"uint32,little"`
	LastErrorTime        uint32     `struc:"uint32,little"`
	LastErrorIno         uint32     `struc:"uint32,little"`
	LastErrorLine        uint32     `struc:"uint32,little"`
	LastErrorBlock       uint64     `struc:"uint64,little"`
	LastErrorFunc        [32]byte   `struc:"[32]pad"`
	MountOpts            [64]byte   `struc:"[64]pad"`
	UsrQuotaInum         uint32     `struc:"uint32,little"`
	GrpQuotaInum         uint32     `struc:"uint32,little"`
	OverheadClusters     uint32     `struc:"uint32,little"`
	BackupBgs            [2]uint32  `struc:"[2]uint32,little"`
	EncryptAlgos         [4]byte    `struc:"[4]pad"`
	EncryptPwSalt        [16]byte   `struc:"[16]pad"`
	LpfIno               uint32     `struc:"uint32,little"`
	PrjQuotaInum         uint32     `struc:"uint32,little"`
	ChecksumSeed         uint32     `struc:"uint32,little"`
	Reserved             [98]uint32 `struc:"[98]uint32,little"`
	Checksum             uint32     `struc:"uint32,little"`
}

func (*Superblock) FeatureCompatDirIndex

func (sb *Superblock) FeatureCompatDirIndex() bool

func (*Superblock) FeatureCompatDirPrealloc

func (sb *Superblock) FeatureCompatDirPrealloc() bool

func (*Superblock) FeatureCompatExtAttr

func (sb *Superblock) FeatureCompatExtAttr() bool

func (*Superblock) FeatureCompatHas_journal

func (sb *Superblock) FeatureCompatHas_journal() bool

func (*Superblock) FeatureCompatImagicInodes

func (sb *Superblock) FeatureCompatImagicInodes() bool

func (*Superblock) FeatureCompatResizeInode

func (sb *Superblock) FeatureCompatResizeInode() bool

func (*Superblock) FeatureCompatSparseSuper2

func (sb *Superblock) FeatureCompatSparseSuper2() bool

func (*Superblock) FeatureInCompat64bit

func (sb *Superblock) FeatureInCompat64bit() bool

func (*Superblock) FeatureIncompatCompression

func (sb *Superblock) FeatureIncompatCompression() bool

func (*Superblock) FeatureIncompatCsumSeed

func (sb *Superblock) FeatureIncompatCsumSeed() bool

func (*Superblock) FeatureIncompatDirdata

func (sb *Superblock) FeatureIncompatDirdata() bool

func (*Superblock) FeatureIncompatEaInode

func (sb *Superblock) FeatureIncompatEaInode() bool

func (*Superblock) FeatureIncompatEncrypt

func (sb *Superblock) FeatureIncompatEncrypt() bool

func (*Superblock) FeatureIncompatExtents

func (sb *Superblock) FeatureIncompatExtents() bool

func (*Superblock) FeatureIncompatFiletype

func (sb *Superblock) FeatureIncompatFiletype() bool

func (*Superblock) FeatureIncompatFlexBg

func (sb *Superblock) FeatureIncompatFlexBg() bool

func (*Superblock) FeatureIncompatInlineData

func (sb *Superblock) FeatureIncompatInlineData() bool

func (*Superblock) FeatureIncompatJournalDev

func (sb *Superblock) FeatureIncompatJournalDev() bool

func (*Superblock) FeatureIncompatLargedir

func (sb *Superblock) FeatureIncompatLargedir() bool

func (*Superblock) FeatureIncompatMetaBg

func (sb *Superblock) FeatureIncompatMetaBg() bool

func (*Superblock) FeatureIncompatMmp

func (sb *Superblock) FeatureIncompatMmp() bool

func (*Superblock) FeatureIncompatRecover

func (sb *Superblock) FeatureIncompatRecover() bool

func (*Superblock) FeatureRoCompatBigalloc

func (sb *Superblock) FeatureRoCompatBigalloc() bool

func (*Superblock) FeatureRoCompatBtreeDir

func (sb *Superblock) FeatureRoCompatBtreeDir() bool
func (sb *Superblock) FeatureRoCompatDirNlink() bool

func (*Superblock) FeatureRoCompatExtraIsize

func (sb *Superblock) FeatureRoCompatExtraIsize() bool

func (*Superblock) FeatureRoCompatGdtCsum

func (sb *Superblock) FeatureRoCompatGdtCsum() bool

func (*Superblock) FeatureRoCompatHugeFile

func (sb *Superblock) FeatureRoCompatHugeFile() bool

func (*Superblock) FeatureRoCompatLargeFile

func (sb *Superblock) FeatureRoCompatLargeFile() bool

func (*Superblock) FeatureRoCompatMetadataCsum

func (sb *Superblock) FeatureRoCompatMetadataCsum() bool

func (*Superblock) FeatureRoCompatProject

func (sb *Superblock) FeatureRoCompatProject() bool

func (*Superblock) FeatureRoCompatQuota

func (sb *Superblock) FeatureRoCompatQuota() bool

func (*Superblock) FeatureRoCompatReadonly

func (sb *Superblock) FeatureRoCompatReadonly() bool

func (*Superblock) FeatureRoCompatSparseSuper

func (sb *Superblock) FeatureRoCompatSparseSuper() bool

func (*Superblock) GetBlockCount

func (sb *Superblock) GetBlockCount() int64

func (*Superblock) GetBlockSize

func (sb *Superblock) GetBlockSize() int64

func (*Superblock) GetGroupDescriptorCount

func (sb *Superblock) GetGroupDescriptorCount() uint32

func (*Superblock) GetGroupDescriptorTableCount

func (sb *Superblock) GetGroupDescriptorTableCount() uint32

func (*Superblock) GetGroupsPerFlex

func (sb *Superblock) GetGroupsPerFlex() int64

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL