~ubuntu-branches/ubuntu/utopic/xfsprogs/utopic-proposed

« back to all changes in this revision

Viewing changes to include/xfs_dir_sf.h

  • Committer: Bazaar Package Importer
  • Author(s): Nathan Scott
  • Date: 2002-04-13 09:45:06 UTC
  • Revision ID: james.westby@ubuntu.com-20020413094506-t8dhemv41gkeg4kx
Tags: 2.0.3-1
New upstream bugfix release

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
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_DIR_SF_H__
 
33
#define __XFS_DIR_SF_H__
 
34
 
 
35
/*
 
36
 * Directory layout when stored internal to an inode.
 
37
 *
 
38
 * Small directories are packed as tightly as possible so as to
 
39
 * fit into the literal area of the inode.
 
40
 */
 
41
 
 
42
typedef struct { __uint8_t i[sizeof(xfs_ino_t)]; } xfs_dir_ino_t;
 
43
 
 
44
/*
 
45
 * The parent directory has a dedicated field, and the self-pointer must
 
46
 * be calculated on the fly.
 
47
 *
 
48
 * Entries are packed toward the top as tight as possible.  The header
 
49
 * and the elements much be bcopy()'d out into a work area to get correct
 
50
 * alignment for the inode number fields.
 
51
 */
 
52
typedef struct xfs_dir_shortform {
 
53
        struct xfs_dir_sf_hdr {         /* constant-structure header block */
 
54
                xfs_dir_ino_t parent;   /* parent dir inode number */
 
55
                __uint8_t count;        /* count of active entries */
 
56
        } hdr;
 
57
        struct xfs_dir_sf_entry {
 
58
                xfs_dir_ino_t inumber;  /* referenced inode number */
 
59
                __uint8_t namelen;      /* actual length of name (no NULL) */
 
60
                __uint8_t name[1];      /* name */
 
61
        } list[1];                      /* variable sized array */
 
62
} xfs_dir_shortform_t;
 
63
typedef struct xfs_dir_sf_hdr xfs_dir_sf_hdr_t;
 
64
typedef struct xfs_dir_sf_entry xfs_dir_sf_entry_t;
 
65
 
 
66
/*
 
67
 * We generate this then sort it, so that readdirs are returned in
 
68
 * hash-order.  Else seekdir won't work.
 
69
 */
 
70
typedef struct xfs_dir_sf_sort {
 
71
        __uint8_t       entno;          /* .=0, ..=1, else entry# + 2 */
 
72
        __uint8_t       seqno;          /* sequence # with same hash value */
 
73
        __uint8_t       namelen;        /* length of name value (no null) */
 
74
        xfs_dahash_t    hash;           /* this entry's hash value */
 
75
        xfs_intino_t    ino;            /* this entry's inode number */
 
76
        char            *name;          /* name value, pointer into buffer */
 
77
} xfs_dir_sf_sort_t;
 
78
 
 
79
#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_DIR_SF_GET_DIRINO)
 
80
void xfs_dir_sf_get_dirino_arch(xfs_dir_ino_t *from, xfs_ino_t *to, xfs_arch_t arch);
 
81
void xfs_dir_sf_get_dirino(xfs_dir_ino_t *from, xfs_ino_t *to);
 
82
#define XFS_DIR_SF_GET_DIRINO_ARCH(from,to,arch)    xfs_dir_sf_get_dirino_arch(from, to, arch)
 
83
#define XFS_DIR_SF_GET_DIRINO(from,to)              xfs_dir_sf_get_dirino(from, to)
 
84
#else
 
85
#define XFS_DIR_SF_GET_DIRINO_ARCH(from,to,arch)    DIRINO_COPY_ARCH(from,to,arch)      
 
86
#define XFS_DIR_SF_GET_DIRINO(from,to)              DIRINO_COPY_ARCH(from,to,ARCH_NOCONVERT)
 
87
#endif
 
88
#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_DIR_SF_PUT_DIRINO)
 
89
void xfs_dir_sf_put_dirino_arch(xfs_ino_t *from, xfs_dir_ino_t *to, xfs_arch_t arch);
 
90
void xfs_dir_sf_put_dirino(xfs_ino_t *from, xfs_dir_ino_t *to);
 
91
#define XFS_DIR_SF_PUT_DIRINO_ARCH(from,to,arch)    xfs_dir_sf_put_dirino_arch(from, to, arch)
 
92
#define XFS_DIR_SF_PUT_DIRINO(from,to)              xfs_dir_sf_put_dirino(from, to)
 
93
#else
 
94
#define XFS_DIR_SF_PUT_DIRINO_ARCH(from,to,arch)    DIRINO_COPY_ARCH(from,to,arch)
 
95
#define XFS_DIR_SF_PUT_DIRINO(from,to)              DIRINO_COPY_ARCH(from,to,ARCH_NOCONVERT)
 
96
#endif
 
97
#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_DIR_SF_ENTSIZE_BYNAME)
 
98
int xfs_dir_sf_entsize_byname(int len);
 
99
#define XFS_DIR_SF_ENTSIZE_BYNAME(len)          xfs_dir_sf_entsize_byname(len)
 
100
#else
 
101
#define XFS_DIR_SF_ENTSIZE_BYNAME(len)          /* space a name uses */ \
 
102
        ((uint)sizeof(xfs_dir_sf_entry_t)-1 + (len))
 
103
#endif
 
104
#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_DIR_SF_ENTSIZE_BYENTRY)
 
105
int xfs_dir_sf_entsize_byentry(xfs_dir_sf_entry_t *sfep);
 
106
#define XFS_DIR_SF_ENTSIZE_BYENTRY(sfep)        xfs_dir_sf_entsize_byentry(sfep)
 
107
#else
 
108
#define XFS_DIR_SF_ENTSIZE_BYENTRY(sfep)        /* space an entry uses */ \
 
109
        ((uint)sizeof(xfs_dir_sf_entry_t)-1 + (sfep)->namelen)
 
110
#endif
 
111
#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_DIR_SF_NEXTENTRY)
 
112
xfs_dir_sf_entry_t *xfs_dir_sf_nextentry(xfs_dir_sf_entry_t *sfep);
 
113
#define XFS_DIR_SF_NEXTENTRY(sfep)              xfs_dir_sf_nextentry(sfep)
 
114
#else
 
115
#define XFS_DIR_SF_NEXTENTRY(sfep)              /* next entry in struct */ \
 
116
        ((xfs_dir_sf_entry_t *) \
 
117
                ((char *)(sfep) + XFS_DIR_SF_ENTSIZE_BYENTRY(sfep)))
 
118
#endif
 
119
#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_DIR_SF_ALLFIT)
 
120
int xfs_dir_sf_allfit(int count, int totallen);
 
121
#define XFS_DIR_SF_ALLFIT(count,totallen)       \
 
122
        xfs_dir_sf_allfit(count,totallen)
 
123
#else
 
124
#define XFS_DIR_SF_ALLFIT(count,totallen)       /* will all entries fit? */ \
 
125
        ((uint)sizeof(xfs_dir_sf_hdr_t) + \
 
126
               ((uint)sizeof(xfs_dir_sf_entry_t)-1)*(count) + (totallen))
 
127
#endif
 
128
 
 
129
#ifdef XFS_ALL_TRACE
 
130
#define XFS_DIR_TRACE
 
131
#endif
 
132
 
 
133
#if !defined(DEBUG)
 
134
#undef XFS_DIR_TRACE
 
135
#endif
 
136
 
 
137
/*
 
138
 * Kernel tracing support for directories.
 
139
 */
 
140
struct uio;
 
141
struct xfs_inode;
 
142
struct xfs_da_intnode;
 
143
struct xfs_dinode;
 
144
struct xfs_dir_leafblock;
 
145
struct xfs_dir_leaf_entry;
 
146
 
 
147
#define XFS_DIR_TRACE_SIZE      4096    /* size of global trace buffer */     
 
148
 
 
149
/*
 
150
 * Trace record types.
 
151
 */
 
152
#define XFS_DIR_KTRACE_G_DU     1       /* dp, uio */
 
153
#define XFS_DIR_KTRACE_G_DUB    2       /* dp, uio, bno */
 
154
#define XFS_DIR_KTRACE_G_DUN    3       /* dp, uio, node */
 
155
#define XFS_DIR_KTRACE_G_DUL    4       /* dp, uio, leaf */
 
156
#define XFS_DIR_KTRACE_G_DUE    5       /* dp, uio, leaf entry */
 
157
#define XFS_DIR_KTRACE_G_DUC    6       /* dp, uio, cookie */
 
158
 
 
159
#if defined(XFS_DIR_TRACE)
 
160
 
 
161
void xfs_dir_trace_g_du(char *where, struct xfs_inode *dp, struct uio *uio);
 
162
void xfs_dir_trace_g_dub(char *where, struct xfs_inode *dp, struct uio *uio,
 
163
                              xfs_dablk_t bno);
 
164
void xfs_dir_trace_g_dun(char *where, struct xfs_inode *dp, struct uio *uio,
 
165
                              struct xfs_da_intnode *node);
 
166
void xfs_dir_trace_g_dul(char *where, struct xfs_inode *dp, struct uio *uio,
 
167
                              struct xfs_dir_leafblock *leaf);
 
168
void xfs_dir_trace_g_due(char *where, struct xfs_inode *dp, struct uio *uio,
 
169
                              struct xfs_dir_leaf_entry *entry);
 
170
void xfs_dir_trace_g_duc(char *where, struct xfs_inode *dp, struct uio *uio,
 
171
                              xfs_off_t cookie);
 
172
void xfs_dir_trace_enter(int type, char *where,
 
173
                             __psunsigned_t a0, __psunsigned_t a1,
 
174
                             __psunsigned_t a2, __psunsigned_t a3,
 
175
                             __psunsigned_t a4, __psunsigned_t a5,
 
176
                             __psunsigned_t a6, __psunsigned_t a7,
 
177
                             __psunsigned_t a8, __psunsigned_t a9,
 
178
                             __psunsigned_t a10, __psunsigned_t a11);
 
179
#else
 
180
#define xfs_dir_trace_g_du(w,d,u)
 
181
#define xfs_dir_trace_g_dub(w,d,u,b)
 
182
#define xfs_dir_trace_g_dun(w,d,u,n)
 
183
#define xfs_dir_trace_g_dul(w,d,u,l)
 
184
#define xfs_dir_trace_g_due(w,d,u,e)
 
185
#define xfs_dir_trace_g_duc(w,d,u,c)
 
186
#endif /* DEBUG */
 
187
 
 
188
#endif  /* __XFS_DIR_SF_H__ */