public inbox for linux-btrfs@vger.kernel.org
 help / color / mirror / Atom feed
* Newbie questions about DIR_ITEM and DIR_INDEX design
@ 2025-08-20 13:59 Sun YangKai
  2025-08-20 17:06 ` Mark Harmstone
  0 siblings, 1 reply; 5+ messages in thread
From: Sun YangKai @ 2025-08-20 13:59 UTC (permalink / raw)
  To: linux-btrfs; +Cc: sunk67188

Hello btrfs developers

I am a beginner studying the implementation of btrfs. While examining the 
structures of DIR_ITEM and DIR_INDEX, I noticed that both store similar 
content but differ in their offset values. This led me to two questions:

1. The offset field in DIR_ITEM is computed as a CRC32 hash of the filename. In 
practice, is there a risk of hash collisions? If so, how does the current 
implementation handle such collisions?

2. The offset field in DIR_INDEX appears to be an auto-incrementing number, 
possibly indicating the creation order of entries within a directory. Why is 
this necessary, given that DIR_ITEM already exists?

I would greatly appreciate any insights or references to relevant 
documentation or code snippets to help me understand these design choices.

Thank you for your time and guidance.

Best regards,
Sun YangKai



^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Newbie questions about DIR_ITEM and DIR_INDEX design
  2025-08-20 13:59 Newbie questions about DIR_ITEM and DIR_INDEX design Sun YangKai
@ 2025-08-20 17:06 ` Mark Harmstone
  2025-08-21  8:26   ` Sun YangKai
  0 siblings, 1 reply; 5+ messages in thread
From: Mark Harmstone @ 2025-08-20 17:06 UTC (permalink / raw)
  To: Sun YangKai, linux-btrfs

Hi Sun,

On 20/08/2025 2.59 pm, Sun YangKai wrote:
> Hello btrfs developers
> 
> I am a beginner studying the implementation of btrfs. While examining the
> structures of DIR_ITEM and DIR_INDEX, I noticed that both store similar
> content but differ in their offset values. This led me to two questions:
> 
> 1. The offset field in DIR_ITEM is computed as a CRC32 hash of the filename. In
> practice, is there a risk of hash collisions? If so, how does the current
> implementation handle such collisions?

I think the mathematics is something like for a hash of n bits, you need
approximately 2^(n/2) instances for a 50% chance of a collision. So 65,536
filenames in this case.

If we have a collision, we append a second DIR_ITEM after the first, in
the same slot. So it'd only be an issue if you could generate enough hash
collisions to fill a 16KB leaf, but I think coming up with such a list
would be difficult enough in itself.

The collisions in /usr/share/dict/words, if you want to play around with
this yourself:

dolent, Tang
dunghill, fricatrice
accusable, aggrandizement
acarodermatitis, unfallacious
hydrotical, hylomorphist
gratillity, radiobserver
creophagist, machinability
boomdas, Loxiinae

> 2. The offset field in DIR_INDEX appears to be an auto-incrementing number,
> possibly indicating the creation order of entries within a directory. Why is
> this necessary, given that DIR_ITEM already exists?

Well, the collisions are one reason: each dentry is a directory has to have
a unique d_off value. I wouldn't be surprised if it also simplifies the
implementation of readdir.

Mark

> I would greatly appreciate any insights or references to relevant
> documentation or code snippets to help me understand these design choices.
> 
> Thank you for your time and guidance.
> 
> Best regards,
> Sun YangKai



^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Newbie questions about DIR_ITEM and DIR_INDEX design
  2025-08-20 17:06 ` Mark Harmstone
@ 2025-08-21  8:26   ` Sun YangKai
  2025-08-21  9:20     ` Mark Harmstone
  0 siblings, 1 reply; 5+ messages in thread
From: Sun YangKai @ 2025-08-21  8:26 UTC (permalink / raw)
  To: Mark Harmstone; +Cc: linux-btrfs

Hi Mark,

Thank you so much for your incredibly helpful, detailed, and patient response.
It’s greatly appreciated and has significantly improved my understanding of 
btrfs design choices.

Best regards,
Sun YangKai



^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Newbie questions about DIR_ITEM and DIR_INDEX design
  2025-08-21  8:26   ` Sun YangKai
@ 2025-08-21  9:20     ` Mark Harmstone
  2025-08-21 10:06       ` Sun YangKai
  0 siblings, 1 reply; 5+ messages in thread
From: Mark Harmstone @ 2025-08-21  9:20 UTC (permalink / raw)
  To: Sun YangKai; +Cc: linux-btrfs

On 21/08/2025 9.26 am, Sun YangKai wrote:
> Hi Mark,
> 
> Thank you so much for your incredibly helpful, detailed, and patient response.
> It’s greatly appreciated and has significantly improved my understanding of
> btrfs design choices.
> 
> Best regards,
> Sun YangKai

No worries.

It looks like another factor was the fact that the original version of
getdents() returned a 32-bit d_off on 32-bit systems - which is okay for
a monotonic counter within a directory, but no good if you want to avoid
the birthday paradox.

So if you were designing Btrfs from scratch today, you might choose just
to have DIR_ITEM, change its hash length to 64 bits, and disallow hash
collisions completely.

Mark

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Newbie questions about DIR_ITEM and DIR_INDEX design
  2025-08-21  9:20     ` Mark Harmstone
@ 2025-08-21 10:06       ` Sun YangKai
  0 siblings, 0 replies; 5+ messages in thread
From: Sun YangKai @ 2025-08-21 10:06 UTC (permalink / raw)
  To: Mark Harmstone; +Cc: linux-btrfs

> No worries.
> 
> It looks like another factor was the fact that the original version of
> getdents() returned a 32-bit d_off on 32-bit systems - which is okay for
> a monotonic counter within a directory, but no good if you want to avoid
> the birthday paradox.
> 
> So if you were designing Btrfs from scratch today, you might choose just
> to have DIR_ITEM, change its hash length to 64 bits, and disallow hash
> collisions completely.
This is exactly what I'm thinking. I came up to this because I have a quite 
large dir whose size is about 66M on my machine. It works well, but with both 
DIR_ITEM and DIR_INDEX, the size is doubled.
> 
> Mark

Thanks,
Sun Yangkai





^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2025-08-21 10:06 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-08-20 13:59 Newbie questions about DIR_ITEM and DIR_INDEX design Sun YangKai
2025-08-20 17:06 ` Mark Harmstone
2025-08-21  8:26   ` Sun YangKai
2025-08-21  9:20     ` Mark Harmstone
2025-08-21 10:06       ` Sun YangKai

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox