Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 17 Mar 2010 12:41:33 +0100
From:      Miroslav Lachman <000.fbsd@quip.cz>
To:        gary.jennejohn@freenet.de
Cc:        freebsd-current@freebsd.org
Subject:   Re: A tool for remapping bad sectors in CURRENT?
Message-ID:  <4BA0BFED.7050103@quip.cz>
In-Reply-To: <20100314184806.3eddf33b@ernst.jennejohn.org>
References:  <20100308102918.GA5485@localhost> <4B94DDC8.5080008@quip.cz>	<20100308115052.GA31896@office.redwerk.com>	<4B94FBA6.5090107@quip.cz> <861vfq995i.fsf@ds4.des.no>	<4B9BF957.4060507@quip.cz> <86eijn3of2.fsf@ds4.des.no>	<4B9CB287.9080205@quip.cz>	<20100314123859.47664ace@ernst.jennejohn.org>	<4B9D0C65.7000809@quip.cz> <20100314184806.3eddf33b@ernst.jennejohn.org>

next in thread | previous in thread | raw e-mail | index | archive | help
Gary Jennejohn wrote:
> On Sun, 14 Mar 2010 17:18:45 +0100
> Miroslav Lachman<000.fbsd@quip.cz>  wrote:
>
>> Gary Jennejohn wrote:
>>> On Sun, 14 Mar 2010 10:55:19 +0100
>>> Miroslav Lachman<000.fbsd@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 Lachman



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4BA0BFED.7050103>