Commit | Line | Data |
---|---|---|
805e021f CE |
1 | /* |
2 | * Copyright 2000, International Business Machines Corporation and others. | |
3 | * All Rights Reserved. | |
4 | * | |
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 | |
8 | */ | |
9 | ||
10 | #if !defined(__AFS_DIR_H) | |
11 | ||
12 | #define __AFS_DIR_H | |
13 | ||
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. */ | |
24 | ||
25 | #define FFIRST 1 | |
26 | #define FNEXT 2 | |
27 | ||
28 | struct MKFid { /* A file identifier. */ | |
29 | afs_int32 vnode; /* file's vnode slot */ | |
30 | afs_int32 vunique; /* the slot incarnation number */ | |
31 | }; | |
32 | ||
33 | struct PageHeader { | |
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)]; | |
40 | }; | |
41 | ||
42 | struct DirBuffer { | |
43 | void *buffer; | |
44 | void *data; | |
45 | }; | |
46 | ||
47 | struct DirHeader { | |
48 | /* A directory header object. */ | |
49 | struct PageHeader header; | |
50 | char alloMap[MAXPAGES]; /* one byte per 2K page */ | |
51 | unsigned short hashTable[NHASHENT]; | |
52 | }; | |
53 | ||
54 | struct DirEntry { | |
55 | /* A directory entry */ | |
56 | char flag; | |
57 | char length; /* currently unused */ | |
58 | unsigned short next; | |
59 | struct MKFid fid; | |
60 | char name[16]; | |
61 | }; | |
62 | ||
63 | struct DirXEntry { | |
64 | /* A directory extension entry. */ | |
65 | char name[32]; | |
66 | }; | |
67 | ||
68 | struct DirPage0 { | |
69 | /* A page in a directory. */ | |
70 | struct DirHeader header; | |
71 | struct DirEntry entry[1]; | |
72 | }; | |
73 | ||
74 | struct DirPage1 { | |
75 | /* A page in a directory. */ | |
76 | struct PageHeader header; | |
77 | struct DirEntry entry[1]; | |
78 | }; | |
79 | ||
80 | /* Prototypes */ | |
81 | #ifdef KERNEL | |
82 | struct dcache; | |
83 | typedef struct dcache * dir_file_t; | |
84 | #else | |
85 | struct DirHandle; | |
86 | typedef struct DirHandle * dir_file_t; | |
87 | extern void Die(const char *msg) AFS_NORETURN; | |
88 | #endif | |
89 | ||
90 | extern int afs_dir_NameBlobs(char *name); | |
91 | extern int afs_dir_Create(dir_file_t dir, char *entry, void *vfid); | |
92 | extern int afs_dir_Length(dir_file_t dir); | |
93 | extern int afs_dir_Delete(dir_file_t dir, char *entry); | |
94 | extern int afs_dir_MakeDir(dir_file_t dir, afs_int32 * me, | |
95 | afs_int32 * parent); | |
96 | extern int afs_dir_Lookup(dir_file_t dir, char *entry, void *fid); | |
97 | extern int afs_dir_LookupOffset(dir_file_t dir, char *entry, void *fid, | |
98 | long *offsetp); | |
99 | extern int afs_dir_EnumerateDir(dir_file_t dir, | |
100 | int (*hookproc) (void *, char *name, | |
101 | afs_int32 vnode, | |
102 | afs_int32 unique), | |
103 | void *hook); | |
104 | extern int afs_dir_IsEmpty(dir_file_t dir); | |
105 | extern int afs_dir_GetBlob(dir_file_t dir, afs_int32 blobno, | |
106 | struct DirBuffer *); | |
107 | extern int afs_dir_GetVerifiedBlob(dir_file_t dir, afs_int32 blobno, | |
108 | struct DirBuffer *); | |
109 | extern int afs_dir_DirHash(char *string); | |
110 | ||
111 | extern int afs_dir_InverseLookup (void *dir, afs_uint32 vnode, | |
112 | afs_uint32 unique, char *name, | |
113 | afs_uint32 length); | |
114 | ||
115 | extern int afs_dir_ChangeFid(dir_file_t dir, char *entry, | |
116 | afs_uint32 *old_fid, afs_uint32 *new_fid); | |
117 | ||
118 | /* buffer operations */ | |
119 | ||
120 | extern void DInit(int abuffers); | |
121 | extern int DRead(dir_file_t fid, int page, struct DirBuffer *); | |
122 | extern int DFlush(void); | |
123 | extern int DFlushVolume(afs_int32); | |
124 | extern int DNew(dir_file_t fid, int page, struct DirBuffer *); | |
125 | extern void DZap(dir_file_t fid); | |
126 | extern void DRelease(struct DirBuffer *loc, int flag); | |
127 | extern int DStat(int *abuffers, int *acalls, int *aios); | |
128 | extern int DFlushVolume(afs_int32 vid); | |
129 | extern int DFlushEntry(dir_file_t fid); | |
130 | extern int DVOffset(struct DirBuffer *); | |
131 | ||
132 | /* salvage.c */ | |
133 | ||
134 | #ifndef KERNEL | |
135 | extern int DirOK(void *); | |
136 | extern int DirSalvage(void *, void *, afs_int32, afs_int32, | |
137 | afs_int32, afs_int32); | |
138 | ||
139 | #endif | |
140 | ||
141 | #endif /* !defined(__AFS_DIR_H) */ |