Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
fs
xfs
xfs_da_btree.h
Go to the documentation of this file.
1
/*
2
* Copyright (c) 2000,2002,2005 Silicon Graphics, Inc.
3
* All Rights Reserved.
4
*
5
* This program is free software; you can redistribute it and/or
6
* modify it under the terms of the GNU General Public License as
7
* published by the Free Software Foundation.
8
*
9
* This program is distributed in the hope that it would be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
* GNU General Public License for more details.
13
*
14
* You should have received a copy of the GNU General Public License
15
* along with this program; if not, write the Free Software Foundation,
16
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17
*/
18
#ifndef __XFS_DA_BTREE_H__
19
#define __XFS_DA_BTREE_H__
20
21
struct
xfs_buf
;
22
struct
xfs_bmap_free
;
23
struct
xfs_inode;
24
struct
xfs_mount;
25
struct
xfs_trans;
26
struct
zone
;
27
28
/*========================================================================
29
* Directory Structure when greater than XFS_LBSIZE(mp) bytes.
30
*========================================================================*/
31
32
/*
33
* This structure is common to both leaf nodes and non-leaf nodes in the Btree.
34
*
35
* It is used to manage a doubly linked list of all blocks at the same
36
* level in the Btree, and to identify which type of block this is.
37
*/
38
#define XFS_DA_NODE_MAGIC 0xfebe
/* magic number: non-leaf blocks */
39
#define XFS_ATTR_LEAF_MAGIC 0xfbee
/* magic number: attribute leaf blks */
40
#define XFS_DIR2_LEAF1_MAGIC 0xd2f1
/* magic number: v2 dirlf single blks */
41
#define XFS_DIR2_LEAFN_MAGIC 0xd2ff
/* magic number: v2 dirlf multi blks */
42
43
typedef
struct
xfs_da_blkinfo
{
44
__be32
forw
;
/* previous block in list */
45
__be32
back
;
/* following block in list */
46
__be16
magic
;
/* validity check on block */
47
__be16
pad
;
/* unused */
48
}
xfs_da_blkinfo_t
;
49
50
/*
51
* This is the structure of the root and intermediate nodes in the Btree.
52
* The leaf nodes are defined above.
53
*
54
* Entries are not packed.
55
*
56
* Since we have duplicate keys, use a binary search but always follow
57
* all match in the block, not just the first match found.
58
*/
59
#define XFS_DA_NODE_MAXDEPTH 5
/* max depth of Btree */
60
61
typedef
struct
xfs_da_intnode
{
62
struct
xfs_da_node_hdr
{
/* constant-structure header block */
63
xfs_da_blkinfo_t
info
;
/* block type, links, etc. */
64
__be16
count
;
/* count of active entries */
65
__be16
level
;
/* level above leaves (leaf == 0) */
66
}
hdr
;
67
struct
xfs_da_node_entry
{
68
__be32
hashval
;
/* hash value for this descendant */
69
__be32
before
;
/* Btree block before this key */
70
}
btree
[1];
/* variable sized array of keys */
71
}
xfs_da_intnode_t
;
72
typedef
struct
xfs_da_node_hdr
xfs_da_node_hdr_t
;
73
typedef
struct
xfs_da_node_entry
xfs_da_node_entry_t
;
74
75
#define XFS_LBSIZE(mp) (mp)->m_sb.sb_blocksize
76
77
/*========================================================================
78
* Btree searching and modification structure definitions.
79
*========================================================================*/
80
81
/*
82
* Search comparison results
83
*/
84
enum
xfs_dacmp
{
85
XFS_CMP_DIFFERENT
,
/* names are completely different */
86
XFS_CMP_EXACT
,
/* names are exactly the same */
87
XFS_CMP_CASE
/* names are same but differ in case */
88
};
89
90
/*
91
* Structure to ease passing around component names.
92
*/
93
typedef
struct
xfs_da_args
{
94
const
__uint8_t *
name
;
/* string (maybe not NULL terminated) */
95
int
namelen
;
/* length of string (maybe no NULL) */
96
__uint8_t *
value
;
/* set of bytes (maybe contain NULLs) */
97
int
valuelen
;
/* length of value */
98
int
flags
;
/* argument flags (eg: ATTR_NOCREATE) */
99
xfs_dahash_t
hashval
;
/* hash value of name */
100
xfs_ino_t
inumber
;
/* input/output inode number */
101
struct
xfs_inode *
dp
;
/* directory inode to manipulate */
102
xfs_fsblock_t
*
firstblock
;
/* ptr to firstblock for bmap calls */
103
struct
xfs_bmap_free
*
flist
;
/* ptr to freelist for bmap_finish */
104
struct
xfs_trans *
trans
;
/* current trans (changes over time) */
105
xfs_extlen_t
total
;
/* total blocks needed, for 1st bmap */
106
int
whichfork
;
/* data or attribute fork */
107
xfs_dablk_t
blkno
;
/* blkno of attr leaf of interest */
108
int
index
;
/* index of attr of interest in blk */
109
xfs_dablk_t
rmtblkno
;
/* remote attr value starting blkno */
110
int
rmtblkcnt
;
/* remote attr value block count */
111
xfs_dablk_t
blkno2
;
/* blkno of 2nd attr leaf of interest */
112
int
index2
;
/* index of 2nd attr in blk */
113
xfs_dablk_t
rmtblkno2
;
/* remote attr value starting blkno */
114
int
rmtblkcnt2
;
/* remote attr value block count */
115
int
op_flags
;
/* operation flags */
116
enum
xfs_dacmp
cmpresult
;
/* name compare result for lookups */
117
}
xfs_da_args_t
;
118
119
/*
120
* Operation flags:
121
*/
122
#define XFS_DA_OP_JUSTCHECK 0x0001
/* check for ok with no space */
123
#define XFS_DA_OP_RENAME 0x0002
/* this is an atomic rename op */
124
#define XFS_DA_OP_ADDNAME 0x0004
/* this is an add operation */
125
#define XFS_DA_OP_OKNOENT 0x0008
/* lookup/add op, ENOENT ok, else die */
126
#define XFS_DA_OP_CILOOKUP 0x0010
/* lookup to return CI name if found */
127
128
#define XFS_DA_OP_FLAGS \
129
{ XFS_DA_OP_JUSTCHECK, "JUSTCHECK" }, \
130
{ XFS_DA_OP_RENAME, "RENAME" }, \
131
{ XFS_DA_OP_ADDNAME, "ADDNAME" }, \
132
{ XFS_DA_OP_OKNOENT, "OKNOENT" }, \
133
{ XFS_DA_OP_CILOOKUP, "CILOOKUP" }
134
135
/*
136
* Storage for holding state during Btree searches and split/join ops.
137
*
138
* Only need space for 5 intermediate nodes. With a minimum of 62-way
139
* fanout to the Btree, we can support over 900 million directory blocks,
140
* which is slightly more than enough.
141
*/
142
typedef
struct
xfs_da_state_blk
{
143
struct
xfs_buf
*
bp
;
/* buffer containing block */
144
xfs_dablk_t
blkno
;
/* filesystem blkno of buffer */
145
xfs_daddr_t
disk_blkno
;
/* on-disk blkno (in BBs) of buffer */
146
int
index
;
/* relevant index into block */
147
xfs_dahash_t
hashval
;
/* last hash value in block */
148
int
magic
;
/* blk's magic number, ie: blk type */
149
}
xfs_da_state_blk_t
;
150
151
typedef
struct
xfs_da_state_path
{
152
int
active
;
/* number of active levels */
153
xfs_da_state_blk_t
blk
[
XFS_DA_NODE_MAXDEPTH
];
154
}
xfs_da_state_path_t
;
155
156
typedef
struct
xfs_da_state
{
157
xfs_da_args_t
*
args
;
/* filename arguments */
158
struct
xfs_mount *
mp
;
/* filesystem mount point */
159
unsigned
int
blocksize
;
/* logical block size */
160
unsigned
int
node_ents
;
/* how many entries in danode */
161
xfs_da_state_path_t
path
;
/* search/split paths */
162
xfs_da_state_path_t
altpath
;
/* alternate path for join */
163
unsigned
char
inleaf
;
/* insert into 1->lf, 0->splf */
164
unsigned
char
extravalid
;
/* T/F: extrablk is in use */
165
unsigned
char
extraafter
;
/* T/F: extrablk is after new */
166
xfs_da_state_blk_t
extrablk
;
/* for double-splits on leaves */
167
/* for dirv2 extrablk is data */
168
}
xfs_da_state_t
;
169
170
/*
171
* Utility macros to aid in logging changed structure fields.
172
*/
173
#define XFS_DA_LOGOFF(BASE, ADDR) ((char *)(ADDR) - (char *)(BASE))
174
#define XFS_DA_LOGRANGE(BASE, ADDR, SIZE) \
175
(uint)(XFS_DA_LOGOFF(BASE, ADDR)), \
176
(uint)(XFS_DA_LOGOFF(BASE, ADDR)+(SIZE)-1)
177
178
/*
179
* Name ops for directory and/or attr name operations
180
*/
181
struct
xfs_nameops
{
182
xfs_dahash_t
(*
hashname
)(
struct
xfs_name
*);
183
enum
xfs_dacmp
(*
compname
)(
struct
xfs_da_args
*,
184
const
unsigned
char
*,
int
);
185
};
186
187
188
/*========================================================================
189
* Function prototypes.
190
*========================================================================*/
191
192
/*
193
* Routines used for growing the Btree.
194
*/
195
int
xfs_da_node_create
(
xfs_da_args_t
*args,
xfs_dablk_t
blkno
,
int
level
,
196
struct
xfs_buf
**
bpp
,
int
whichfork
);
197
int
xfs_da_split
(
xfs_da_state_t
*
state
);
198
199
/*
200
* Routines used for shrinking the Btree.
201
*/
202
int
xfs_da_join
(
xfs_da_state_t
*
state
);
203
void
xfs_da_fixhashpath
(
xfs_da_state_t
*
state
,
204
xfs_da_state_path_t
*path_to_to_fix);
205
206
/*
207
* Routines used for finding things in the Btree.
208
*/
209
int
xfs_da_node_lookup_int
(
xfs_da_state_t
*
state
,
int
*
result
);
210
int
xfs_da_path_shift
(
xfs_da_state_t
*
state
,
xfs_da_state_path_t
*
path
,
211
int
forward,
int
release
,
int
*
result
);
212
/*
213
* Utility routines.
214
*/
215
int
xfs_da_blk_link
(
xfs_da_state_t
*
state
,
xfs_da_state_blk_t
*old_blk,
216
xfs_da_state_blk_t
*new_blk);
217
218
/*
219
* Utility routines.
220
*/
221
int
xfs_da_grow_inode
(
xfs_da_args_t
*args,
xfs_dablk_t
*new_blkno);
222
int
xfs_da_grow_inode_int
(
struct
xfs_da_args
*args,
xfs_fileoff_t
*bno,
223
int
count
);
224
int
xfs_da_get_buf
(
struct
xfs_trans *
trans
,
struct
xfs_inode *
dp
,
225
xfs_dablk_t
bno, xfs_daddr_t mappedbno,
226
struct
xfs_buf
**bp,
int
whichfork
);
227
int
xfs_da_read_buf
(
struct
xfs_trans *
trans
,
struct
xfs_inode *
dp
,
228
xfs_dablk_t
bno, xfs_daddr_t mappedbno,
229
struct
xfs_buf
**
bpp
,
int
whichfork
);
230
xfs_daddr_t
xfs_da_reada_buf
(
struct
xfs_trans *
trans
,
struct
xfs_inode *
dp
,
231
xfs_dablk_t
bno,
int
whichfork
);
232
int
xfs_da_shrink_inode
(
xfs_da_args_t
*args,
xfs_dablk_t
dead_blkno,
233
struct
xfs_buf
*dead_buf);
234
235
uint
xfs_da_hashname
(
const
__uint8_t *name_string,
int
name_length);
236
enum
xfs_dacmp
xfs_da_compname
(
struct
xfs_da_args
*args,
237
const
unsigned
char
*
name
,
int
len);
238
239
240
xfs_da_state_t
*
xfs_da_state_alloc
(
void
);
241
void
xfs_da_state_free
(
xfs_da_state_t
*
state
);
242
243
extern
struct
kmem_zone
*
xfs_da_state_zone
;
244
extern
const
struct
xfs_nameops
xfs_default_nameops
;
245
246
#endif
/* __XFS_DA_BTREE_H__ */
Generated on Thu Jan 10 2013 14:50:22 for Linux Kernel by
1.8.2