#define __AFS_DIR_H
#define AFS_PAGESIZE 2048 /* bytes per page */
-#define NHASHENT 128 /* entries in the hash tbl */
-#define MAXPAGES 128 /* max pages in a dir */
-#define BIGMAXPAGES 1023 /* new big max pages */
-#define EPP 64 /* dir entries per page */
-#define LEPP 6 /* log above */
-/* 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. */
-#define DHE 12 /* entries in a dir header above a pages header alone. */
+#define NHASHENT 128 /* entries in the hash tbl */
+#define MAXPAGES 128 /* max pages in a dir */
+#define BIGMAXPAGES 1023 /* new big max pages */
+#define EPP 64 /* dir entries per page */
+#define LEPP 6 /* log above */
+/* 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. */
+#define DHE 12 /* entries in a dir header above a pages header alone. */
#define FFIRST 1
#define FNEXT 2
-struct MKFid
-{ /* A file identifier. */
+struct MKFid { /* A file identifier. */
afs_int32 vnode; /* file's vnode slot */
afs_int32 vunique; /* the slot incarnation number */
};
-struct PageHeader
-{
+struct PageHeader {
/* A page header entry. */
unsigned short pgcount; /* number of pages, or 0 if old-style */
unsigned short tag; /* 1234 in network byte order */
char freecount; /* unused, info in dirHeader structure */
- char freebitmap[EPP/8];
- char padding[32-(5+EPP/8)];
+ char freebitmap[EPP / 8];
+ char padding[32 - (5 + EPP / 8)];
};
-struct DirHeader
-{
+struct DirBuffer {
+ void *buffer;
+ void *data;
+};
+
+struct DirHeader {
/* A directory header object. */
struct PageHeader header;
char alloMap[MAXPAGES]; /* one byte per 2K page */
unsigned short hashTable[NHASHENT];
};
-struct DirEntry
-{
+struct DirEntry {
/* A directory entry */
char flag;
char length; /* currently unused */
char name[16];
};
-struct DirXEntry
-{
+struct DirXEntry {
/* A directory extension entry. */
char name[32];
};
-struct DirPage0
-{
+struct DirPage0 {
/* A page in a directory. */
struct DirHeader header;
struct DirEntry entry[1];
};
-struct DirPage1
-{
+struct DirPage1 {
/* A page in a directory. */
struct PageHeader header;
struct DirEntry entry[1];
};
-/*
- * Note that this declaration is seen in both the kernel code and the
- * user space code. One implementation is in afs/afs_buffer.c; the
- * other is in dir/buffer.c.
- */
-extern int DVOffset(void *ap);
-
-
-
/* Prototypes */
-extern int NameBlobs (char *name);
-extern int Create (void *dir, char *entry, void *vfid);
-extern int Length (void *dir);
-extern int Delete (void *dir, char *entry);
-extern int FindBlobs (void *dir, int nblobs);
-extern void AddPage (void *dir, int pageno);
-extern void FreeBlobs(void *dir, register int firstblob, int nblobs);
-extern int MakeDir (void *dir, afs_int32 *me, afs_int32 *parent);
-extern int Lookup (void *dir, char *entry, void *fid);
-extern int LookupOffset (void *dir, char *entry, void *fid, long *offsetp);
-extern int EnumerateDir (void *dir, int (*hookproc)(void *dir, char *name, afs_int32 vnode, afs_int32 unique), void *hook);
-extern int IsEmpty (void *dir);
-extern struct DirEntry *GetBlob (void *dir, afs_int32 blobno);
-extern int DirHash (register char *string);
-
#ifdef KERNEL
-extern int afs_dir_NameBlobs (char *name);
-extern int afs_dir_Create (void *dir, char *entry, void *vfid);
-extern int afs_dir_Length (void *dir);
-extern int afs_dir_Delete (void *dir, char *entry);
-extern int afs_dir_MakeDir (void *dir, afs_int32 *me, afs_int32 *parent);
-extern int afs_dir_Lookup (void *dir, char *entry, void *fid);
-extern int afs_dir_LookupOffset (void *dir, char *entry, void *fid, long *offsetp);
-extern int afs_dir_EnumerateDir (void *dir, int (*hookproc)(void *dir, char *name, afs_int32 vnode, afs_int32 unique), void *hook);
-extern int afs_dir_IsEmpty (void *dir);
-extern struct DirEntry *afs_dir_GetBlob (void *dir, afs_int32 blobno);
+struct dcache;
+typedef struct dcache * dir_file_t;
+#else
+struct DirHandle;
+typedef struct DirHandle * dir_file_t;
+extern void Die(const char *msg) AFS_NORETURN;
+#endif
+
+extern int afs_dir_NameBlobs(char *name);
+extern int afs_dir_Create(dir_file_t dir, char *entry, void *vfid);
+extern int afs_dir_Length(dir_file_t dir);
+extern int afs_dir_Delete(dir_file_t dir, char *entry);
+extern int afs_dir_MakeDir(dir_file_t dir, afs_int32 * me,
+ afs_int32 * parent);
+extern int afs_dir_Lookup(dir_file_t dir, char *entry, void *fid);
+extern int afs_dir_LookupOffset(dir_file_t dir, char *entry, void *fid,
+ long *offsetp);
+extern int afs_dir_EnumerateDir(dir_file_t dir,
+ int (*hookproc) (void *, char *name,
+ afs_int32 vnode,
+ afs_int32 unique),
+ void *hook);
+extern int afs_dir_IsEmpty(dir_file_t dir);
+extern int afs_dir_GetBlob(dir_file_t dir, afs_int32 blobno,
+ struct DirBuffer *);
+extern int afs_dir_DirHash(char *string);
+
+extern int afs_dir_InverseLookup (void *dir, afs_uint32 vnode,
+ afs_uint32 unique, char *name,
+ afs_uint32 length);
+
+extern int afs_dir_ChangeFid(dir_file_t dir, char *entry,
+ afs_uint32 *old_fid, afs_uint32 *new_fid);
+
+/* buffer operations */
+
+extern void DInit(int abuffers);
+extern int DRead(dir_file_t fid, int page, struct DirBuffer *);
+extern int DFlush(void);
+extern int DFlushVolume(afs_int32);
+extern int DNew(dir_file_t fid, int page, struct DirBuffer *);
+extern void DZap(dir_file_t fid);
+extern void DRelease(struct DirBuffer *loc, int flag);
+extern int DStat(int *abuffers, int *acalls, int *aios);
+extern int DFlushVolume(afs_int32 vid);
+extern int DFlushEntry(dir_file_t fid);
+extern int DVOffset(struct DirBuffer *);
+
+/* salvage.c */
+
+#ifndef KERNEL
+extern int DirOK(void *);
+extern int DirSalvage(void *, void *, afs_int32, afs_int32,
+ afs_int32, afs_int32);
+
#endif
-#endif /* !defined(__AFS_DIR_H) */
+#endif /* !defined(__AFS_DIR_H) */