func NewInodeAllocator() InodeAllocator {
	return &inodeAllocator{1, false}
}
Create a new inode number allocator
package iso9660
import (
	"errors"
	"os"
	"syscall"
	"time"
	"github.com/NVIDIA/vdisc/pkg/iso9660/rrip"
	"github.com/NVIDIA/vdisc/pkg/iso9660/susp"
)
const (
	MaxPartSize = 4294965248  
)
type InodeType byte
const (
	InodeTypeFile InodeType = iota
	InodeTypeDirectory
	InodeTypeSymlink
)
var (
	ErrInodesExhausted = errors.New("inodes exhausted")
)
type Inode interface {
	Type() InodeType
	InodeNumber() InodeNumber
	Parts() []InodePart
	Perm() os.FileMode
	SetPerm(perm os.FileMode)
	Created() time.Time
	SetCreated(time.Time)
	Modified() time.Time
	SetModified(time.Time)
	AddParent(*DirectoryInode)
	Nlink() uint32
	IsRoot() bool
	AdditionalSystemUseEntries() ([]susp.SystemUseEntry, error)
}
type InodePart interface {
	Start() LogicalBlockAddress
	Size() uint32
}
type part struct {
	start LogicalBlockAddress
	size  uint32
}
func (s *part) Start() LogicalBlockAddress {
	return s.start
}
func (s *part) Size() uint32 {
	return s.size
}
func InodeParts(start LogicalBlockAddress, size uint64) []InodePart {
	var parts []InodePart
	remaining := size
	for remaining >= 0 {
		var sz uint32
		if remaining > MaxPartSize {
			sz = MaxPartSize
		} else {
			sz = uint32(remaining)
		}
		parts = append(parts, &part{start, sz})
		remaining -= uint64(sz)
		if remaining > 0 {
			lba := start + LogicalBlockAddress(bytesToSectors(sz))
			if lba <= start {
				panic("overflow")
			}
			start = lba
		} else {
			break
		}
	}
	return parts
}
type InodeNumber uint32
type InodeAllocator interface {
	Next() (InodeNumber, error)
}