1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | #ifndef _BCACHEFS_DIRENT_FORMAT_H |
3 | #define _BCACHEFS_DIRENT_FORMAT_H |
4 | |
5 | /* |
6 | * Dirents (and xattrs) have to implement string lookups; since our b-tree |
7 | * doesn't support arbitrary length strings for the key, we instead index by a |
8 | * 64 bit hash (currently truncated sha1) of the string, stored in the offset |
9 | * field of the key - using linear probing to resolve hash collisions. This also |
10 | * provides us with the readdir cookie posix requires. |
11 | * |
12 | * Linear probing requires us to use whiteouts for deletions, in the event of a |
13 | * collision: |
14 | */ |
15 | |
16 | struct bch_dirent { |
17 | struct bch_val v; |
18 | |
19 | /* Target inode number: */ |
20 | union { |
21 | __le64 d_inum; |
22 | struct { /* DT_SUBVOL */ |
23 | __le32 d_child_subvol; |
24 | __le32 d_parent_subvol; |
25 | }; |
26 | }; |
27 | |
28 | /* |
29 | * Copy of mode bits 12-15 from the target inode - so userspace can get |
30 | * the filetype without having to do a stat() |
31 | */ |
32 | __u8 d_type; |
33 | |
34 | __u8 d_name[]; |
35 | } __packed __aligned(8); |
36 | |
37 | #define DT_SUBVOL 16 |
38 | #define BCH_DT_MAX 17 |
39 | |
40 | #define BCH_NAME_MAX 512 |
41 | |
42 | #endif /* _BCACHEFS_DIRENT_FORMAT_H */ |
43 | |