OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [fs/] [xfs/] [xfs_dir2_data.h] - Blame information for rev 1275

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1275 phoenix
/*
2
 * Copyright (c) 2000 Silicon Graphics, Inc.  All Rights Reserved.
3
 *
4
 * This program is free software; you can redistribute it and/or modify it
5
 * under the terms of version 2 of the GNU General Public License as
6
 * published by the Free Software Foundation.
7
 *
8
 * This program is distributed in the hope that it would be useful, but
9
 * WITHOUT ANY WARRANTY; without even the implied warranty of
10
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
11
 *
12
 * Further, this software is distributed without any warranty that it is
13
 * free of the rightful claim of any third person regarding infringement
14
 * or the like.  Any license provided herein, whether implied or
15
 * otherwise, applies only to this software file.  Patent licenses, if
16
 * any, provided herein do not apply to combinations of this program with
17
 * other software, or any other product whatsoever.
18
 *
19
 * You should have received a copy of the GNU General Public License along
20
 * with this program; if not, write the Free Software Foundation, Inc., 59
21
 * Temple Place - Suite 330, Boston MA 02111-1307, USA.
22
 *
23
 * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
24
 * Mountain View, CA  94043, or:
25
 *
26
 * http://www.sgi.com
27
 *
28
 * For further information regarding this notice, see:
29
 *
30
 * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/
31
 */
32
#ifndef __XFS_DIR2_DATA_H__
33
#define __XFS_DIR2_DATA_H__
34
 
35
/*
36
 * Directory format 2, data block structures.
37
 */
38
 
39
struct xfs_dabuf;
40
struct xfs_da_args;
41
struct xfs_inode;
42
struct xfs_trans;
43
 
44
/*
45
 * Constants.
46
 */
47
#define XFS_DIR2_DATA_MAGIC     0x58443244      /* XD2D: for multiblock dirs */
48
#define XFS_DIR2_DATA_ALIGN_LOG 3               /* i.e., 8 bytes */
49
#define XFS_DIR2_DATA_ALIGN     (1 << XFS_DIR2_DATA_ALIGN_LOG)
50
#define XFS_DIR2_DATA_FREE_TAG  0xffff
51
#define XFS_DIR2_DATA_FD_COUNT  3
52
 
53
/*
54
 * Directory address space divided into sections,
55
 * spaces separated by 32gb.
56
 */
57
#define XFS_DIR2_SPACE_SIZE     (1ULL << (32 + XFS_DIR2_DATA_ALIGN_LOG))
58
#define XFS_DIR2_DATA_SPACE     0
59
#define XFS_DIR2_DATA_OFFSET    (XFS_DIR2_DATA_SPACE * XFS_DIR2_SPACE_SIZE)
60
#define XFS_DIR2_DATA_FIRSTDB(mp)       \
61
        XFS_DIR2_BYTE_TO_DB(mp, XFS_DIR2_DATA_OFFSET)
62
 
63
/*
64
 * Offsets of . and .. in data space (always block 0)
65
 */
66
#define XFS_DIR2_DATA_DOT_OFFSET        \
67
        ((xfs_dir2_data_aoff_t)sizeof(xfs_dir2_data_hdr_t))
68
#define XFS_DIR2_DATA_DOTDOT_OFFSET     \
69
        (XFS_DIR2_DATA_DOT_OFFSET + XFS_DIR2_DATA_ENTSIZE(1))
70
#define XFS_DIR2_DATA_FIRST_OFFSET              \
71
        (XFS_DIR2_DATA_DOTDOT_OFFSET + XFS_DIR2_DATA_ENTSIZE(2))
72
 
73
/*
74
 * Structures.
75
 */
76
 
77
/*
78
 * Describe a free area in the data block.
79
 * The freespace will be formatted as a xfs_dir2_data_unused_t.
80
 */
81
typedef struct xfs_dir2_data_free {
82
        xfs_dir2_data_off_t     offset;         /* start of freespace */
83
        xfs_dir2_data_off_t     length;         /* length of freespace */
84
} xfs_dir2_data_free_t;
85
 
86
/*
87
 * Header for the data blocks.
88
 * Always at the beginning of a directory-sized block.
89
 * The code knows that XFS_DIR2_DATA_FD_COUNT is 3.
90
 */
91
typedef struct xfs_dir2_data_hdr {
92
        __uint32_t              magic;          /* XFS_DIR2_DATA_MAGIC */
93
                                                /* or XFS_DIR2_BLOCK_MAGIC */
94
        xfs_dir2_data_free_t    bestfree[XFS_DIR2_DATA_FD_COUNT];
95
} xfs_dir2_data_hdr_t;
96
 
97
/*
98
 * Active entry in a data block.  Aligned to 8 bytes.
99
 * Tag appears as the last 2 bytes.
100
 */
101
typedef struct xfs_dir2_data_entry {
102
        xfs_ino_t               inumber;        /* inode number */
103
        __uint8_t               namelen;        /* name length */
104
        __uint8_t               name[1];        /* name bytes, no null */
105
                                                /* variable offset */
106
        xfs_dir2_data_off_t     tag;            /* starting offset of us */
107
} xfs_dir2_data_entry_t;
108
 
109
/*
110
 * Unused entry in a data block.  Aligned to 8 bytes.
111
 * Tag appears as the last 2 bytes.
112
 */
113
typedef struct xfs_dir2_data_unused {
114
        __uint16_t              freetag;        /* XFS_DIR2_DATA_FREE_TAG */
115
        xfs_dir2_data_off_t     length;         /* total free length */
116
                                                /* variable offset */
117
        xfs_dir2_data_off_t     tag;            /* starting offset of us */
118
} xfs_dir2_data_unused_t;
119
 
120
typedef union {
121
        xfs_dir2_data_entry_t   entry;
122
        xfs_dir2_data_unused_t  unused;
123
} xfs_dir2_data_union_t;
124
 
125
/*
126
 * Generic data block structure, for xfs_db.
127
 */
128
typedef struct xfs_dir2_data {
129
        xfs_dir2_data_hdr_t     hdr;            /* magic XFS_DIR2_DATA_MAGIC */
130
        xfs_dir2_data_union_t   u[1];
131
} xfs_dir2_data_t;
132
 
133
/*
134
 * Macros.
135
 */
136
 
137
/*
138
 * Size of a data entry.
139
 */
140
#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_DIR2_DATA_ENTSIZE)
141
int xfs_dir2_data_entsize(int n);
142
#define XFS_DIR2_DATA_ENTSIZE(n)        xfs_dir2_data_entsize(n)
143
#else
144
#define XFS_DIR2_DATA_ENTSIZE(n)        \
145
        ((int)(roundup(offsetof(xfs_dir2_data_entry_t, name[0]) + (n) + \
146
                 (uint)sizeof(xfs_dir2_data_off_t), XFS_DIR2_DATA_ALIGN)))
147
#endif
148
 
149
/*
150
 * Pointer to an entry's tag word.
151
 */
152
#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_DIR2_DATA_ENTRY_TAG_P)
153
xfs_dir2_data_off_t *xfs_dir2_data_entry_tag_p(xfs_dir2_data_entry_t *dep);
154
#define XFS_DIR2_DATA_ENTRY_TAG_P(dep)  xfs_dir2_data_entry_tag_p(dep)
155
#else
156
#define XFS_DIR2_DATA_ENTRY_TAG_P(dep)  \
157
        ((xfs_dir2_data_off_t *)\
158
         ((char *)(dep) + XFS_DIR2_DATA_ENTSIZE((dep)->namelen) - \
159
          (uint)sizeof(xfs_dir2_data_off_t)))
160
#endif
161
 
162
/*
163
 * Pointer to a freespace's tag word.
164
 */
165
#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_DIR2_DATA_UNUSED_TAG_P)
166
xfs_dir2_data_off_t *xfs_dir2_data_unused_tag_p_arch(
167
        xfs_dir2_data_unused_t *dup, xfs_arch_t arch);
168
#define XFS_DIR2_DATA_UNUSED_TAG_P_ARCH(dup,arch) \
169
        xfs_dir2_data_unused_tag_p_arch(dup,arch)
170
#else
171
#define XFS_DIR2_DATA_UNUSED_TAG_P_ARCH(dup,arch)       \
172
        ((xfs_dir2_data_off_t *)\
173
         ((char *)(dup) + INT_GET((dup)->length, arch) \
174
                        - (uint)sizeof(xfs_dir2_data_off_t)))
175
#endif
176
 
177
/*
178
 * Function declarations.
179
 */
180
 
181
#ifdef DEBUG
182
extern void
183
        xfs_dir2_data_check(struct xfs_inode *dp, struct xfs_dabuf *bp);
184
#else
185
#define xfs_dir2_data_check(dp,bp)
186
#endif
187
 
188
extern xfs_dir2_data_free_t *
189
        xfs_dir2_data_freefind(xfs_dir2_data_t *d,
190
                               xfs_dir2_data_unused_t *dup);
191
 
192
extern xfs_dir2_data_free_t *
193
        xfs_dir2_data_freeinsert(xfs_dir2_data_t *d,
194
                                 xfs_dir2_data_unused_t *dup, int *loghead);
195
 
196
extern void
197
        xfs_dir2_data_freeremove(xfs_dir2_data_t *d,
198
                                 xfs_dir2_data_free_t *dfp, int *loghead);
199
 
200
extern void
201
        xfs_dir2_data_freescan(struct xfs_mount *mp, xfs_dir2_data_t *d,
202
                               int *loghead, char *aendp);
203
 
204
extern int
205
        xfs_dir2_data_init(struct xfs_da_args *args, xfs_dir2_db_t blkno,
206
                           struct xfs_dabuf **bpp);
207
 
208
extern void
209
        xfs_dir2_data_log_entry(struct xfs_trans *tp, struct xfs_dabuf *bp,
210
                                xfs_dir2_data_entry_t *dep);
211
 
212
extern void
213
        xfs_dir2_data_log_header(struct xfs_trans *tp, struct xfs_dabuf *bp);
214
 
215
extern void
216
        xfs_dir2_data_log_unused(struct xfs_trans *tp, struct xfs_dabuf *bp,
217
                                 xfs_dir2_data_unused_t *dup);
218
 
219
extern void
220
        xfs_dir2_data_make_free(struct xfs_trans *tp, struct xfs_dabuf *bp,
221
                                xfs_dir2_data_aoff_t offset,
222
                                xfs_dir2_data_aoff_t len, int *needlogp,
223
                                int *needscanp);
224
 
225
extern void
226
        xfs_dir2_data_use_free(struct xfs_trans *tp, struct xfs_dabuf *bp,
227
                               xfs_dir2_data_unused_t *dup,
228
                               xfs_dir2_data_aoff_t offset,
229
                               xfs_dir2_data_aoff_t len, int *needlogp,
230
                               int *needscanp);
231
 
232
#endif  /* __XFS_DIR2_DATA_H__ */

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.