dir-buffer-protos-20040123
[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 latter is responsible for marking these entries as allocated.  Also change the salvager. */
21 #define DHE 12                  /* entries in a dir header above a pages header alone. */
22
23 #define FFIRST 1
24 #define FNEXT 2
25
26 struct MKFid {                  /* A file identifier. */
27     afs_int32 vnode;            /* file's vnode slot */
28     afs_int32 vunique;          /* the slot incarnation number */
29 };
30
31 struct PageHeader {
32     /* A page header entry. */
33     unsigned short pgcount;     /* number of pages, or 0 if old-style */
34     unsigned short tag;         /* 1234 in network byte order */
35     char freecount;             /* unused, info in dirHeader structure */
36     char freebitmap[EPP / 8];
37     char padding[32 - (5 + EPP / 8)];
38 };
39
40 struct DirHeader {
41     /* A directory header object. */
42     struct PageHeader header;
43     char alloMap[MAXPAGES];     /* one byte per 2K page */
44     unsigned short hashTable[NHASHENT];
45 };
46
47 struct DirEntry {
48     /* A directory entry */
49     char flag;
50     char length;                /* currently unused */
51     unsigned short next;
52     struct MKFid fid;
53     char name[16];
54 };
55
56 struct DirXEntry {
57     /* A directory extension entry. */
58     char name[32];
59 };
60
61 struct DirPage0 {
62     /* A page in a directory. */
63     struct DirHeader header;
64     struct DirEntry entry[1];
65 };
66
67 struct DirPage1 {
68     /* A page in a directory. */
69     struct PageHeader header;
70     struct DirEntry entry[1];
71 };
72
73 /*
74  * Note that this declaration is seen in both the kernel code and the
75  * user space code.  One implementation is in afs/afs_buffer.c; the
76  * other is in dir/buffer.c.
77  */
78 extern int DVOffset(void *ap);
79
80
81 /* This is private to buffer.c */
82 struct buffer;
83
84 /* Prototypes */
85 extern int NameBlobs(char *name);
86 extern int Create(void *dir, char *entry, void *vfid);
87 extern int Length(void *dir);
88 extern int Delete(void *dir, char *entry);
89 extern int FindBlobs(void *dir, int nblobs);
90 extern void AddPage(void *dir, int pageno);
91 extern void FreeBlobs(void *dir, register int firstblob, int nblobs);
92 extern int MakeDir(void *dir, afs_int32 * me, afs_int32 * parent);
93 extern int Lookup(void *dir, char *entry, void *fid);
94 extern int LookupOffset(void *dir, char *entry, void *fid, long *offsetp);
95 extern int EnumerateDir(void *dir,
96                         int (*hookproc) (void *dir, char *name,
97                                          afs_int32 vnode, afs_int32 unique),
98                         void *hook);
99 extern int IsEmpty(void *dir);
100 extern struct DirEntry *GetBlob(void *dir, afs_int32 blobno);
101 extern int DirHash(register char *string);
102
103 extern int DStat(int *abuffers, int *acalls, int *aios);
104 extern void DRelease();
105 extern int DVOffset(register void *ap);
106 extern int DFlushVolume(register afs_int32 vid);
107 extern int DFlushEntry(register afs_int32 *fid);
108
109 /* The kernel uses different versions of these, and prototypes them
110    in afs_prototypes.h */
111 #ifndef KERNEL
112 extern int DInit(int abuffers);
113 extern void *DRead();
114 extern int DFlush();
115 extern void *DNew(register afs_int32 *fid, register int page);
116 extern void DZap(register afs_int32 *fid);
117 #endif
118
119 #ifdef KERNEL
120 extern int afs_dir_NameBlobs(char *name);
121 extern int afs_dir_Create(void *dir, char *entry, void *vfid);
122 extern int afs_dir_Length(void *dir);
123 extern int afs_dir_Delete(void *dir, char *entry);
124 extern int afs_dir_MakeDir(void *dir, afs_int32 * me, afs_int32 * parent);
125 extern int afs_dir_Lookup(void *dir, char *entry, void *fid);
126 extern int afs_dir_LookupOffset(void *dir, char *entry, void *fid,
127                                 long *offsetp);
128 extern int afs_dir_EnumerateDir(void *dir,
129                                 int (*hookproc) (void *dir, char *name,
130                                                  afs_int32 vnode,
131                                                  afs_int32 unique),
132                                 void *hook);
133 extern int afs_dir_IsEmpty(void *dir);
134 extern struct DirEntry *afs_dir_GetBlob(void *dir, afs_int32 blobno);
135 #endif
136
137 #endif /*       !defined(__AFS_DIR_H) */