dir/vol: Die() really does
[openafs.git] / src / dir / dir.h
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_DirHash(char *string);
108
109 extern int afs_dir_InverseLookup (void *dir, afs_uint32 vnode,
110                                   afs_uint32 unique, char *name,
111                                   afs_uint32 length);
112
113 extern int afs_dir_ChangeFid(dir_file_t dir, char *entry,
114                              afs_uint32 *old_fid, afs_uint32 *new_fid);
115
116 /* buffer operations */
117
118 extern void DInit(int abuffers);
119 extern int DRead(dir_file_t fid, int page, struct DirBuffer *);
120 extern int DFlush(void);
121 extern int DFlushVolume(afs_int32);
122 extern int DNew(dir_file_t fid, int page, struct DirBuffer *);
123 extern void DZap(dir_file_t fid);
124 extern void DRelease(struct DirBuffer *loc, int flag);
125 extern int DStat(int *abuffers, int *acalls, int *aios);
126 extern int DFlushVolume(afs_int32 vid);
127 extern int DFlushEntry(dir_file_t fid);
128 extern int DVOffset(struct DirBuffer *);
129
130 /* salvage.c */
131
132 #ifndef KERNEL
133 extern int DirOK(void *);
134 extern int DirSalvage(void *, void *, afs_int32, afs_int32,
135                       afs_int32, afs_int32);
136
137 #endif
138
139 #endif /*       !defined(__AFS_DIR_H) */