diff options
Diffstat (limited to 'fs/xfs/xfs_attr_leaf.h')
-rw-r--r-- | fs/xfs/xfs_attr_leaf.h | 79 |
1 files changed, 43 insertions, 36 deletions
diff --git a/fs/xfs/xfs_attr_leaf.h b/fs/xfs/xfs_attr_leaf.h index f6143ff251a0..541e34109bb9 100644 --- a/fs/xfs/xfs_attr_leaf.h +++ b/fs/xfs/xfs_attr_leaf.h | |||
@@ -63,7 +63,7 @@ struct xfs_trans; | |||
63 | * the leaf_entry. The namespaces are independent only because we also look | 63 | * the leaf_entry. The namespaces are independent only because we also look |
64 | * at the namespace bit when we are looking for a matching attribute name. | 64 | * at the namespace bit when we are looking for a matching attribute name. |
65 | * | 65 | * |
66 | * We also store a "incomplete" bit in the leaf_entry. It shows that an | 66 | * We also store an "incomplete" bit in the leaf_entry. It shows that an |
67 | * attribute is in the middle of being created and should not be shown to | 67 | * attribute is in the middle of being created and should not be shown to |
68 | * the user if we crash during the time that the bit is set. We clear the | 68 | * the user if we crash during the time that the bit is set. We clear the |
69 | * bit when we have finished setting up the attribute. We do this because | 69 | * bit when we have finished setting up the attribute. We do this because |
@@ -72,42 +72,48 @@ struct xfs_trans; | |||
72 | */ | 72 | */ |
73 | #define XFS_ATTR_LEAF_MAPSIZE 3 /* how many freespace slots */ | 73 | #define XFS_ATTR_LEAF_MAPSIZE 3 /* how many freespace slots */ |
74 | 74 | ||
75 | typedef struct xfs_attr_leaf_map { /* RLE map of free bytes */ | ||
76 | __uint16_t base; /* base of free region */ | ||
77 | __uint16_t size; /* length of free region */ | ||
78 | } xfs_attr_leaf_map_t; | ||
79 | |||
80 | typedef struct xfs_attr_leaf_hdr { /* constant-structure header block */ | ||
81 | xfs_da_blkinfo_t info; /* block type, links, etc. */ | ||
82 | __uint16_t count; /* count of active leaf_entry's */ | ||
83 | __uint16_t usedbytes; /* num bytes of names/values stored */ | ||
84 | __uint16_t firstused; /* first used byte in name area */ | ||
85 | __uint8_t holes; /* != 0 if blk needs compaction */ | ||
86 | __uint8_t pad1; | ||
87 | xfs_attr_leaf_map_t freemap[XFS_ATTR_LEAF_MAPSIZE]; | ||
88 | /* N largest free regions */ | ||
89 | } xfs_attr_leaf_hdr_t; | ||
90 | |||
91 | typedef struct xfs_attr_leaf_entry { /* sorted on key, not name */ | ||
92 | xfs_dahash_t hashval; /* hash value of name */ | ||
93 | __uint16_t nameidx; /* index into buffer of name/value */ | ||
94 | __uint8_t flags; /* LOCAL/ROOT/SECURE/INCOMPLETE flag */ | ||
95 | __uint8_t pad2; /* unused pad byte */ | ||
96 | } xfs_attr_leaf_entry_t; | ||
97 | |||
98 | typedef struct xfs_attr_leaf_name_local { | ||
99 | __uint16_t valuelen; /* number of bytes in value */ | ||
100 | __uint8_t namelen; /* length of name bytes */ | ||
101 | __uint8_t nameval[1]; /* name/value bytes */ | ||
102 | } xfs_attr_leaf_name_local_t; | ||
103 | |||
104 | typedef struct xfs_attr_leaf_name_remote { | ||
105 | xfs_dablk_t valueblk; /* block number of value bytes */ | ||
106 | __uint32_t valuelen; /* number of bytes in value */ | ||
107 | __uint8_t namelen; /* length of name bytes */ | ||
108 | __uint8_t name[1]; /* name bytes */ | ||
109 | } xfs_attr_leaf_name_remote_t; | ||
110 | |||
75 | typedef struct xfs_attr_leafblock { | 111 | typedef struct xfs_attr_leafblock { |
76 | struct xfs_attr_leaf_hdr { /* constant-structure header block */ | 112 | xfs_attr_leaf_hdr_t hdr; /* constant-structure header block */ |
77 | xfs_da_blkinfo_t info; /* block type, links, etc. */ | 113 | xfs_attr_leaf_entry_t entries[1]; /* sorted on key, not name */ |
78 | __uint16_t count; /* count of active leaf_entry's */ | 114 | xfs_attr_leaf_name_local_t namelist; /* grows from bottom of buf */ |
79 | __uint16_t usedbytes; /* num bytes of names/values stored */ | 115 | xfs_attr_leaf_name_remote_t valuelist; /* grows from bottom of buf */ |
80 | __uint16_t firstused; /* first used byte in name area */ | ||
81 | __uint8_t holes; /* != 0 if blk needs compaction */ | ||
82 | __uint8_t pad1; | ||
83 | struct xfs_attr_leaf_map { /* RLE map of free bytes */ | ||
84 | __uint16_t base; /* base of free region */ | ||
85 | __uint16_t size; /* length of free region */ | ||
86 | } freemap[XFS_ATTR_LEAF_MAPSIZE]; /* N largest free regions */ | ||
87 | } hdr; | ||
88 | struct xfs_attr_leaf_entry { /* sorted on key, not name */ | ||
89 | xfs_dahash_t hashval; /* hash value of name */ | ||
90 | __uint16_t nameidx; /* index into buffer of name/value */ | ||
91 | __uint8_t flags; /* LOCAL/ROOT/SECURE/INCOMPLETE flag */ | ||
92 | __uint8_t pad2; /* unused pad byte */ | ||
93 | } entries[1]; /* variable sized array */ | ||
94 | struct xfs_attr_leaf_name_local { | ||
95 | __uint16_t valuelen; /* number of bytes in value */ | ||
96 | __uint8_t namelen; /* length of name bytes */ | ||
97 | __uint8_t nameval[1]; /* name/value bytes */ | ||
98 | } namelist; /* grows from bottom of buf */ | ||
99 | struct xfs_attr_leaf_name_remote { | ||
100 | xfs_dablk_t valueblk; /* block number of value bytes */ | ||
101 | __uint32_t valuelen; /* number of bytes in value */ | ||
102 | __uint8_t namelen; /* length of name bytes */ | ||
103 | __uint8_t name[1]; /* name bytes */ | ||
104 | } valuelist; /* grows from bottom of buf */ | ||
105 | } xfs_attr_leafblock_t; | 116 | } xfs_attr_leafblock_t; |
106 | typedef struct xfs_attr_leaf_hdr xfs_attr_leaf_hdr_t; | ||
107 | typedef struct xfs_attr_leaf_map xfs_attr_leaf_map_t; | ||
108 | typedef struct xfs_attr_leaf_entry xfs_attr_leaf_entry_t; | ||
109 | typedef struct xfs_attr_leaf_name_local xfs_attr_leaf_name_local_t; | ||
110 | typedef struct xfs_attr_leaf_name_remote xfs_attr_leaf_name_remote_t; | ||
111 | 117 | ||
112 | /* | 118 | /* |
113 | * Flags used in the leaf_entry[i].flags field. | 119 | * Flags used in the leaf_entry[i].flags field. |
@@ -150,7 +156,8 @@ xfs_attr_leaf_name_local(xfs_attr_leafblock_t *leafp, int idx) | |||
150 | (leafp))[INT_GET((leafp)->entries[idx].nameidx, ARCH_CONVERT)]; | 156 | (leafp))[INT_GET((leafp)->entries[idx].nameidx, ARCH_CONVERT)]; |
151 | } | 157 | } |
152 | 158 | ||
153 | #define XFS_ATTR_LEAF_NAME(leafp,idx) xfs_attr_leaf_name(leafp,idx) | 159 | #define XFS_ATTR_LEAF_NAME(leafp,idx) \ |
160 | xfs_attr_leaf_name(leafp,idx) | ||
154 | static inline char *xfs_attr_leaf_name(xfs_attr_leafblock_t *leafp, int idx) | 161 | static inline char *xfs_attr_leaf_name(xfs_attr_leafblock_t *leafp, int idx) |
155 | { | 162 | { |
156 | return (&((char *) | 163 | return (&((char *) |