rx: Remove RX_CALL_BUSY
[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 OPENAFS_WINNT_AFSD_CM_DIR_H
11 #define OPENAFS_WINNT_AFSD_CM_DIR_H 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 /* lock types */
105 #define CM_DIRLOCK_NONE         0x0
106 #define CM_DIRLOCK_READ         0x1
107 #define CM_DIRLOCK_WRITE        0x2
108
109 /* flags for cm_dirOp operations */
110 #define CM_DIROP_FLAG_NONE         0x0000
111 #define CM_DIROP_FLAG_NOBUILDTREE  0x0001
112
113 /* Used for managing transactional directory operations.  Each
114    instance should only be used by one thread. */
115 typedef struct cm_dirOp {
116     int           lockType;
117     cm_scache_t * scp;
118     cm_user_t *   userp;
119     cm_req_t      req;
120
121     osi_hyper_t   length;       /* scp->length at the time
122                                    cm_BeginDirOp() was called.*/
123     osi_hyper_t   newLength;    /* adjusted scp->length */
124     afs_uint64    dataVersion;  /* scp->dataVersion when
125                                    cm_BeginDirOp() was called.*/
126     afs_uint64    newDataVersion; /* scp->dataVersion when
127                                      cm_CheckDirOpForSingleChange()
128                                      was called. */
129
130     afs_uint64    dirtyBufCount;
131
132     afs_uint64    nBuffers;     /* number of buffers below */
133     cm_dirOpBuffer_t buffers[CM_DIROP_MAXBUFFERS];
134 } cm_dirOp_t;
135
136 extern long
137 cm_BeginDirOp(cm_scache_t * scp, cm_user_t * userp, cm_req_t * reqp,
138               afs_uint32 lockType, afs_uint32 flags, cm_dirOp_t * op);
139
140 extern int
141 cm_CheckDirOpForSingleChange(cm_dirOp_t * op);
142
143 extern long
144 cm_EndDirOp(cm_dirOp_t * op);
145
146 extern long
147 cm_NameEntries(char *namep, size_t *lenp);
148
149 extern long
150 cm_DirCreateEntry(cm_dirOp_t * op, char *entry, cm_fid_t * cfid);
151
152 extern int
153 cm_DirLength(cm_dirOp_t * op);
154
155 extern int
156 cm_DirDeleteEntry(cm_dirOp_t * op, char *entry);
157
158 extern int
159 cm_DirMakeDir(cm_dirOp_t * op, cm_fid_t * me, cm_fid_t * parent);
160
161 extern int
162 cm_DirLookup(cm_dirOp_t * op, char *entry, cm_fid_t * cfid);
163
164 extern int
165 cm_DirLookupOffset(cm_dirOp_t * op, char *entry, cm_fid_t *cfid, osi_hyper_t *offsetp);
166
167 extern int
168 cm_DirApply(cm_dirOp_t * op, int (*hookproc) (void *, char *, long, long), void *hook);
169
170 extern int
171 cm_DirIsEmpty(cm_dirOp_t * op);
172
173 extern int
174 cm_DirHash(char *string);
175
176 /* Directory entry lists */
177 typedef struct cm_dirEntryList {
178     struct cm_dirEntryList * nextp;
179     char   name[1];
180 } cm_dirEntryList_t;
181
182 extern void
183 cm_DirEntryListAdd(char * namep, cm_dirEntryList_t ** list);
184
185 extern void
186 cm_DirEntryListFree(cm_dirEntryList_t ** list);
187
188 extern void
189 cm_DirDumpStats(void);
190
191 extern int
192 cm_MemDumpDirStats(FILE *outputFile, char *cookie, int lock);
193
194 extern afs_uint64 dir_enums;
195
196 #endif /*  OPENAFS_WINNT_AFSD_CM_DIR_H */