A tool for remapping bad sectors in CURRENT?
000.fbsd at quip.cz
Wed Mar 17 11:41:38 UTC 2010
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:
3001 (1 frag)
3001 * 4 = 12004
fsdb (inum: 3)> findblk 12004
12004: data block of inode 3
Thank you for this hint!
More information about the freebsd-current