Gary Jennejohn wrote: > On Sun, 14 Mar 2010 17:18:45 +0100 > Miroslav Lachman<000.fbsd_at_quip.cz> wrote: > >> Gary Jennejohn wrote: >>> On Sun, 14 Mar 2010 10:55:19 +0100 >>> Miroslav Lachman<000.fbsd_at_quip.cz> wrote: >>> >>> [big snip] >>>> fsdb (inum: 3)> blocks >>>> Blocks for inode 3: >>>> Direct blocks: >>>> 3001 (1 frag) >>>> >>>> fsdb (inum: 3)> findblk 3001 >>>> fsdb (inum: 3)> >>>> >>>> ^^^^^^^^ findblk did not returned inode 3! >>>> >>> >>> This is almost guaranteed to be a file system block and not >>> a disk block. >> >> Do you mean the number 3001? >> I am sorry for my ignorance, but it is not clear to me from fsdb manpage >> what "blocks" means FS block and what disk block. >> >> And how can I use (calculate with) this numbers? >> >> How can I get the right number to pass to findlbk command (in the >> example above) to give me back the inode 3? >> >> If FS block is 16384 bytes, then it means 16384/512 = 32 disk blocks per >> FS block. >> >> If 3001 is FS block, then it means 3001*32 = 96032 disk block number. Am >> I right? >> >> fsdb (inum: 3)> findblk 96032 >> fsdb (inum: 3)> >> >> Again - findblk did not returned inode 3. >> >> So what is the exact formula to get the right findblk number and then >> right inode number as result of findblk command? >> >> I am still lost in terms (words) and numbers :( >> > > Well, it's pretty hairy. > > Looking at findblk() it does this to go from disk block to file system > block (this is greatly simplified) > > file_system_blockno = disk_blockno>> fs_fsbtodb; > > So conversely, you'd do disk_blockno = file_system_blockno<< fs_fsbtodb. > > You can get this information using "ffsinfo -l 0x001 -o some_file > /dev/ataXY" (using ahci) and grep'ing for fsbtodb in some_file. The > 0x001 means to only dump the first super block. > > I looked at a file system which has default 16kB file system blocks and > fsbtodb is 2 ==> *multiply file_system_block by 4 not 32*. This is probably > because it's a multiple of a 4kB block, which is the smallest usable > file system block size AFAIK. > > BTW looking at the code leads me to conclude that fsdb will not print out > anything if the disk block you're trying to find has bever been allocated > to an inode ==> unused disk block, safe to overwrite. This assumes that > you calculated the disk block correctly. I absolutely don't understand how you get the number 4 (it is some magic for me :]) but it works! fsdb (inum: 3)> blocks Blocks for inode 3: Direct blocks: 3001 (1 frag) 3001 * 4 = 12004 fsdb (inum: 3)> findblk 12004 12004: data block of inode 3 Thank you for this hint! Miroslav LachmanReceived on Wed Mar 17 2010 - 10:41:38 UTC
This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:40:01 UTC