2 * Copyright 2000, International Business Machines Corporation and others.
5 * This software has been released under the terms of the IBM Public
6 * License. For details, see the LICENSE file in the top-level source
7 * directory or online at http://www.openafs.org/dl/license10.html
10 #if !defined(__AFS_DIR_H)
14 #define AFS_PAGESIZE 2048 /* bytes per page */
15 #define NHASHENT 128 /* entries in the hash tbl */
16 #define MAXPAGES 128 /* max pages in a dir */
17 #define BIGMAXPAGES 1023 /* new big max pages */
18 #define EPP 64 /* dir entries per page */
19 #define LEPP 6 /* log above */
20 /* When this next field changs, it is crucial to modify MakeDir, since the
21 * latter is responsible for marking these entries as allocated. Also
22 * change the salvager. */
23 #define DHE 12 /* entries in a dir header above a pages header alone. */
28 struct MKFid { /* A file identifier. */
29 afs_int32 vnode; /* file's vnode slot */
30 afs_int32 vunique; /* the slot incarnation number */
34 /* A page header entry. */
35 unsigned short pgcount; /* number of pages, or 0 if old-style */
36 unsigned short tag; /* 1234 in network byte order */
37 char freecount; /* unused, info in dirHeader structure */
38 char freebitmap[EPP / 8];
39 char padding[32 - (5 + EPP / 8)];
48 /* A directory header object. */
49 struct PageHeader header;
50 char alloMap[MAXPAGES]; /* one byte per 2K page */
51 unsigned short hashTable[NHASHENT];
55 /* A directory entry */
57 char length; /* currently unused */
64 /* A directory extension entry. */
69 /* A page in a directory. */
70 struct DirHeader header;
71 struct DirEntry entry[1];
75 /* A page in a directory. */
76 struct PageHeader header;
77 struct DirEntry entry[1];
81 * Note that this declaration is seen in both the kernel code and the
82 * user space code. One implementation is in afs/afs_buffer.c; the
83 * other is in dir/buffer.c.
85 extern int DVOffset(struct DirBuffer *);
88 /* This is private to buffer.c */
92 extern int NameBlobs(char *name);
93 extern int Create(void *dir, char *entry, void *vfid);
94 extern int Length(void *dir);
95 extern int Delete(void *dir, char *entry);
96 extern int FindBlobs(void *dir, int nblobs);
97 extern void AddPage(void *dir, int pageno);
98 extern void FreeBlobs(void *dir, int firstblob, int nblobs);
99 extern int MakeDir(void *dir, afs_int32 * me, afs_int32 * parent);
100 extern int Lookup(void *dir, char *entry, void *fid);
101 extern int LookupOffset(void *dir, char *entry, void *fid, long *offsetp);
102 extern int EnumerateDir(void *dir,
103 int (*hookproc) (void *dir, char *name,
104 afs_int32 vnode, afs_int32 unique),
106 extern int IsEmpty(void *dir);
107 extern int GetBlob(void *dir, afs_int32 blobno, struct DirBuffer *);
108 extern int DirHash(char *string);
110 extern int DStat(int *abuffers, int *acalls, int *aios);
111 extern void DRelease(struct DirBuffer *loc, int flag);
112 extern int DFlushVolume(afs_int32 vid);
113 extern int DFlushEntry(afs_int32 *fid);
114 extern int InverseLookup (void *dir, afs_uint32 vnode, afs_uint32 unique,
115 char *name, afs_uint32 length);
117 /* The kernel uses different versions of these, and prototypes them
118 in afs_prototypes.h */
120 extern int DInit(int abuffers);
121 extern int DRead(afs_int32 *fid, int page, struct DirBuffer *);
122 extern int DFlush(void);
123 extern int DNew(afs_int32 *fid, int page, struct DirBuffer *);
124 extern void DZap(afs_int32 *fid);
128 extern int DirOK(void *);
129 extern int DirSalvage(void *, void *, afs_int32, afs_int32,
130 afs_int32, afs_int32);
135 extern int afs_dir_NameBlobs(char *name);
136 extern int afs_dir_Create(void *dir, char *entry, void *vfid);
137 extern int afs_dir_Length(void *dir);
138 extern int afs_dir_Delete(void *dir, char *entry);
139 extern int afs_dir_MakeDir(void *dir, afs_int32 * me, afs_int32 * parent);
140 extern int afs_dir_Lookup(void *dir, char *entry, void *fid);
141 extern int afs_dir_LookupOffset(void *dir, char *entry, void *fid,
143 extern int afs_dir_EnumerateDir(void *dir,
144 int (*hookproc) (void *dir, char *name,
148 extern int afs_dir_IsEmpty(void *dir);
149 extern int afs_dir_ChangeFid(void *dir, char *entry, afs_uint32 *old_fid,
150 afs_uint32 *new_fid);
151 extern int afs_dir_GetBlob(void *dir, afs_int32 blobno, struct DirBuffer *);
154 #endif /* !defined(__AFS_DIR_H) */