Hi, I'm getting strange results when I map out the blocks used in files larger than a several thousand KB. I never seem to get any more than 1024 contiguous data blocks in a row.
Here's a portion of the output of my script when I run it on a 176MB file in my home directory: ... Contiguous chunk 67: 2385568 - 2385591 (24 blocks) Contiguous chunk 68: 2385608 - 2386448 (841 blocks) Contiguous chunk 69: 2386450 - 2387473 (1024 blocks) Contiguous chunk 70: 2387475 - 2388498 (1024 blocks) Contiguous chunk 71: 2388500 - 2389523 (1024 blocks) ... Maybe this is a bug in my script? Can anyone explain why this would happen? I'm attaching my script in case other ext2/3/4 newbies can get any use out of it, and in case anyone needs to see it in order to answer my question. It's pretty self-explanatory, though. Cheers, Eric
#!/usr/bin/python
# Eric's first python program :)
import sys #for sys.argv
import fcntl #for fcntl.ioctl
import os #for os.access
import struct # for struct.pack and struct.unpack
print "WARNING: This script may not work for files with holes."
if len(sys.argv) != 2:
print "Usage: " + sys.argv[0] + " <filename>"
print "Note: This program uses the FIBMAP ioctl, so you must be root."
sys.exit(1)
if os.access(sys.argv[1], os.F_OK) == False:
print "File " + sys.argv[1] + " doesn't exist."
sys.exit(1)
f = open(sys.argv[1],'r')
fsBlockSize = struct.unpack('i',fcntl.ioctl(f,2,' '))[0]
numFileBlocks = os.stat(sys.argv[1])[6] / fsBlockSize
if (os.stat(sys.argv[1])[6] % fsBlockSize) != 0:
numFileBlocks += 1
blockIterator = 0
blockmap = []
for blockIterator in range(numFileBlocks):
h=struct.pack('i',blockIterator)
blockmap += struct.unpack('i',fcntl.ioctl(f,1,h))
print "Filesystem block size: " + str(fsBlockSize)
print "Number of filesystem blocks in file: " + str(numFileBlocks)
extentBegin = []
extentEnd = []
extentBegin += [blockmap[0]]
for blockIterator in range(1,len(blockmap)):
if blockmap[blockIterator]-blockmap[blockIterator-1] == 1:
blockIterator += 1
continue
else:
extentEnd += [blockmap[blockIterator-1]]
extentBegin += [blockmap[blockIterator]]
blockIterator += 1
extentEnd += [blockmap[blockIterator-1]]
for n in range(0,len(extentBegin)):
print "Contiguous chunk " + str(n) + ": " + str(extentBegin[n]) + " - " + str(extentEnd[n]) + " (" + str(extentEnd[n] - extentBegin[n]+1) + " blocks)"
sys.exit(0)
signature.asc
Description: This is a digitally signed message part
