github.com/Cloud-Foundations/Dominator@v0.3.4/lib/filesystem/estimate.go (about)

     1  package filesystem
     2  
     3  func (fs *FileSystem) estimateUsage(blockSize uint64) uint64 {
     4  	if blockSize < 1 {
     5  		blockSize = 4096
     6  	}
     7  	fileOrder := sizeToOrder(blockSize)
     8  	var totalDataBytes uint64
     9  	for _, inode := range fs.InodeTable {
    10  		switch inode := inode.(type) {
    11  		case *DirectoryInode:
    12  			totalDataBytes += blockSize
    13  		case *RegularInode:
    14  			// Round up to the nearest page size.
    15  			size := (inode.Size >> fileOrder) << fileOrder
    16  			if size < inode.Size {
    17  				size += 1 << fileOrder
    18  			}
    19  			totalDataBytes += size
    20  		case *SymlinkInode:
    21  			totalDataBytes += 64
    22  		}
    23  	}
    24  	return totalDataBytes
    25  }
    26  
    27  func sizeToOrder(blockSize uint64) uint {
    28  	order := uint(0)
    29  	for i := uint(0); i < 64; i++ {
    30  		if 1<<i&blockSize != 0 {
    31  			order = i
    32  		}
    33  	}
    34  	return order
    35  }