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];
83 typedef struct dcache
* dir_file_t
;
86 typedef struct DirHandle
* dir_file_t
;
87 extern void Die(const char *msg
) AFS_NORETURN
;
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
,
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
,
99 extern int afs_dir_EnumerateDir(dir_file_t dir
,
100 int (*hookproc
) (void *, char *name
,
104 extern int afs_dir_IsEmpty(dir_file_t dir
);
105 extern int afs_dir_GetBlob(dir_file_t dir
, afs_int32 blobno
,
107 extern int afs_dir_GetVerifiedBlob(dir_file_t dir
, afs_int32 blobno
,
109 extern int afs_dir_DirHash(char *string
);
111 extern int afs_dir_InverseLookup (void *dir
, afs_uint32 vnode
,
112 afs_uint32 unique
, char *name
,
115 extern int afs_dir_ChangeFid(dir_file_t dir
, char *entry
,
116 afs_uint32
*old_fid
, afs_uint32
*new_fid
);
118 /* buffer operations */
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
*);
135 extern int DirOK(void *);
136 extern int DirSalvage(void *, void *, afs_int32
, afs_int32
,
137 afs_int32
, afs_int32
);
141 #endif /* !defined(__AFS_DIR_H) */