4af06f8d951dfe1a2271e1683adad8f1da3c077f
[openafs.git] / src / WINNT / afsd / cm_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 #ifndef __CM_DIR_ENV__
11 #define __CM_DIR_ENV__ 1
12
13 /* These data structures are derived from src/dir/dir.h and should not 
14  * be changed as they describe AFS3 wire protocol.
15  *
16  */
17
18 #define CM_DIR_PAGESIZE         2048            /* bytes per page */
19 #define CM_DIR_NHASHENT         128             /* entries in the dir hash tbl */
20 #define CM_DIR_MAXPAGES         128             /* max pages in a dir */
21 #define CM_DIR_BIGMAXPAGES      1023            /* new big max pages */
22 #define CM_DIR_EPP              64              /* dir entries per page */
23 #define CM_DIR_LEPP             6               /* log above */
24 #define CM_DIR_CHUNKSIZE        32              /* bytes per dir entry chunk */
25
26 /* When this next field changs, it is crucial to modify MakeDir, since the latter is
27  * responsible for marking these entries as allocated.  Also change
28  * the salvager.
29  */
30 #define CM_DIR_DHE              12              /* entries in a dir header above a pages
31                                                  * header alone.
32                                                  */
33
34 #define CM_DIR_FFIRST           1
35 #define CM_DIR_FNEXT            2
36
37 typedef struct cm_dirFid {
38         /* A file identifier. */
39         afs_int32 vnode;        /* file's vnode slot */
40         afs_int32 unique;       /* the slot incarnation number */
41 } cm_dirFid_t;
42
43 typedef struct cm_pageHeader {
44         /* A page header entry. */
45         unsigned short pgcount; /* number of pages, or 0 if old-style */
46         unsigned short tag;             /* '1234' in network byte order */
47         char freeCount; /* unused, info in dirHeader structure */
48         char freeBitmap[CM_DIR_EPP/8];
49         char padding[CM_DIR_CHUNKSIZE-(5+CM_DIR_EPP/8)];/* pad to one 32-byte entry */
50 } cm_pageHeader_t;
51
52 /* a total of 13 32-byte entries, 1 for the header that in all pages, and
53  * 12 more special ones for the entries in a the first page.
54  */
55 typedef struct cm_dirHeader {
56         /* A directory header object. */
57         cm_pageHeader_t header;
58         char alloMap[CM_DIR_MAXPAGES];    /* one byte per 2K page */
59         unsigned short hashTable[CM_DIR_NHASHENT];
60 } cm_dirHeader_t;
61
62 /* this represents a directory entry.  We use strlen to find out how
63  * many bytes are really in the dir entry; it is always a multiple of
64  * 32.
65  */
66 typedef struct cm_dirEntry {
67         /* A directory entry */
68         char flag;      /* this must be FFIRST (1) */
69         char length;    /* currently unused */
70         unsigned short next;
71         cm_dirFid_t fid;
72         char name[1];   /* the real length is determined with strlen() */
73 } cm_dirEntry_t;
74
75 #ifdef UNUSED
76 typedef struct cm_dirXEntry {
77         /* A directory extension entry. */
78         char name[32];
79 } cm_dirXEntry_t;
80
81 typedef struct cm_dirPage0 {
82         /* A page in a directory. */
83         cm_dirHeader_t header;
84         cm_dirEntry_t entry[1];
85 } cm_dirPage0_t;
86
87 typedef struct cm_dirPage1 {
88         /* A page in a directory. */
89         cm_pageHeader_t header;
90         cm_dirEntry_t entry[1];
91 } cm_dirPage1_t;
92 #endif /* UNUSED */
93
94 #define CM_DIROP_MAXBUFFERS 8
95
96 typedef struct cm_dirOpBuffer {
97     int        flags;
98     cm_buf_t * bufferp;
99     int        refcount;
100 } cm_dirOpBuffer_t;
101
102 #define CM_DIROPBUFF_INUSE      0x1
103
104 #define CM_DIRLOCK_NONE         0x0
105 #define CM_DIRLOCK_READ         0x1
106 #define CM_DIRLOCK_WRITE        0x2
107
108 /* Used for managing transactional directory operations.  Each
109    instance should only be used by one thread. */
110 typedef struct cm_dirOp {
111     int           lockType;
112     cm_scache_t * scp;
113     cm_user_t *   userp;
114     cm_req_t      req;
115
116     osi_hyper_t   length;       /* scp->length at the time
117                                    cm_BeginDirOp() was called.*/
118     osi_hyper_t   newLength;    /* adjusted scp->length */
119     afs_uint32    dataVersion;  /* scp->dataVersion when
120                                    cm_BeginDirOp() was called.*/
121     afs_uint32    newDataVersion; /* scp->dataVersion when
122                                      cm_CheckDirOpForSingleChange()
123                                      was called. */
124
125     afs_uint32    dirtyBufCount;
126
127     afs_uint32    nBuffers;     /* number of buffers below */
128     cm_dirOpBuffer_t buffers[CM_DIROP_MAXBUFFERS];
129 } cm_dirOp_t;
130
131 extern long
132 cm_BeginDirOp(cm_scache_t * scp, cm_user_t * userp, cm_req_t * reqp,
133               afs_uint32 lockType, cm_dirOp_t * op);
134
135 extern int
136 cm_CheckDirOpForSingleChange(cm_dirOp_t * op);
137
138 extern long
139 cm_EndDirOp(cm_dirOp_t * op);
140
141 extern long
142 cm_NameEntries(char *namep, long *lenp);
143
144 extern long
145 cm_DirCreateEntry(cm_dirOp_t * op, char *entry, cm_fid_t * cfid);
146
147 extern int
148 cm_DirLength(cm_dirOp_t * op);
149
150 extern int
151 cm_DirDeleteEntry(cm_dirOp_t * op, char *entry);
152
153 extern int
154 cm_DirMakeDir(cm_dirOp_t * op, cm_fid_t * me, cm_fid_t * parent);
155
156 extern int
157 cm_DirLookup(cm_dirOp_t * op, char *entry, cm_fid_t * cfid);
158
159 extern int
160 cm_DirLookupOffset(cm_dirOp_t * op, char *entry, cm_fid_t *cfid, osi_hyper_t *offsetp);
161
162 extern int
163 cm_DirApply(cm_dirOp_t * op, int (*hookproc) (void *, char *, long, long), void *hook);
164
165 extern int
166 cm_DirIsEmpty(cm_dirOp_t * op);
167
168 extern int
169 cm_DirHash(char *string);
170
171 /* Directory entry lists */
172 typedef struct cm_dirEntryList {
173     struct cm_dirEntryList * nextp;
174     char   name[1];
175 } cm_dirEntryList_t;
176
177 extern void
178 cm_DirEntryListAdd(char * namep, cm_dirEntryList_t ** list);
179
180 extern void
181 cm_DirEntryListFree(cm_dirEntryList_t ** list);
182
183 extern void
184 cm_DirDumpStats(void);
185 #endif /*  __CM_DIR_ENV__ */