Import Upstream version 1.8.5
[hcoop/debian/openafs.git] / src / dir / dir.h
CommitLineData
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
28struct MKFid { /* A file identifier. */
29 afs_int32 vnode; /* file's vnode slot */
30 afs_int32 vunique; /* the slot incarnation number */
31};
32
33struct 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
42struct DirBuffer {
43 void *buffer;
44 void *data;
45};
46
47struct 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
54struct 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
63struct DirXEntry {
64 /* A directory extension entry. */
65 char name[32];
66};
67
68struct DirPage0 {
69 /* A page in a directory. */
70 struct DirHeader header;
71 struct DirEntry entry[1];
72};
73
74struct DirPage1 {
75 /* A page in a directory. */
76 struct PageHeader header;
77 struct DirEntry entry[1];
78};
79
80/* Prototypes */
81#ifdef KERNEL
82struct dcache;
83typedef struct dcache * dir_file_t;
84#else
85struct DirHandle;
86typedef struct DirHandle * dir_file_t;
87extern void Die(const char *msg) AFS_NORETURN;
88#endif
89
90extern int afs_dir_NameBlobs(char *name);
91extern int afs_dir_Create(dir_file_t dir, char *entry, void *vfid);
92extern int afs_dir_Length(dir_file_t dir);
93extern int afs_dir_Delete(dir_file_t dir, char *entry);
94extern int afs_dir_MakeDir(dir_file_t dir, afs_int32 * me,
95 afs_int32 * parent);
96extern int afs_dir_Lookup(dir_file_t dir, char *entry, void *fid);
97extern int afs_dir_LookupOffset(dir_file_t dir, char *entry, void *fid,
98 long *offsetp);
99extern 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);
104extern int afs_dir_IsEmpty(dir_file_t dir);
105extern int afs_dir_GetBlob(dir_file_t dir, afs_int32 blobno,
106 struct DirBuffer *);
107extern int afs_dir_GetVerifiedBlob(dir_file_t dir, afs_int32 blobno,
108 struct DirBuffer *);
109extern int afs_dir_DirHash(char *string);
110
111extern int afs_dir_InverseLookup (void *dir, afs_uint32 vnode,
112 afs_uint32 unique, char *name,
113 afs_uint32 length);
114
115extern int afs_dir_ChangeFid(dir_file_t dir, char *entry,
116 afs_uint32 *old_fid, afs_uint32 *new_fid);
117
118/* buffer operations */
119
120extern void DInit(int abuffers);
121extern int DRead(dir_file_t fid, int page, struct DirBuffer *);
122extern int DFlush(void);
123extern int DFlushVolume(afs_int32);
124extern int DNew(dir_file_t fid, int page, struct DirBuffer *);
125extern void DZap(dir_file_t fid);
126extern void DRelease(struct DirBuffer *loc, int flag);
127extern int DStat(int *abuffers, int *acalls, int *aios);
128extern int DFlushVolume(afs_int32 vid);
129extern int DFlushEntry(dir_file_t fid);
130extern int DVOffset(struct DirBuffer *);
131
132/* salvage.c */
133
134#ifndef KERNEL
135extern int DirOK(void *);
136extern int DirSalvage(void *, void *, afs_int32, afs_int32,
137 afs_int32, afs_int32);
138
139#endif
140
141#endif /* !defined(__AFS_DIR_H) */