Coda Distributed File System
codadir.h
Go to the documentation of this file.
1/* BLURB gpl
2
3 Coda File System
4 Release 8
5
6 Copyright (c) 1987-2021 Carnegie Mellon University
7 Additional copyrights listed below
8
9This code is distributed "AS IS" without warranty of any kind under
10the terms of the GNU General Public Licence Version 2, as shown in the
11file LICENSE. The technical and financial contributors to Coda are
12listed in the file CREDITS.
13
14 Additional copyrights
15 none currently
16
17#*/
18
19#ifndef CODA_DIR_H_
20#define CODA_DIR_H_ 1
21#include <lwp/lock.h>
22#include <sys/types.h>
23#include <time.h>
24#include <coda.h>
25#include <vcrcommon.h>
26#include <dllist.h>
27#include <coda_tsa.h>
28
29/* bytes per page */
30#define DIR_PAGESIZE 2048
31
32/* maximum pages of a directory */
33#define DIR_MAXPAGES 128
34
35/* where is directory data */
36#define DIR_DATA_IN_RVM 1
37#define DIR_DATA_IN_VM 0
38
39typedef struct DirEntry *PDirEntry;
40typedef struct DirFid *PDirFid;
41typedef struct DirHeader *PDirHeader;
42typedef struct DirHandle *PDirHandle;
43typedef struct DCEntry *PDCEntry;
44
45struct DirHandle {
48 int dh_dirty; /* used by server only */
49};
50
51#if 0 /* moved to vcrcommon.rpc2 */
52/* A file identifier in host order. */
53struct DirFid {
54 int df_vnode; /* file's vnode slot */
55 int df_unique; /* the slot incarnation number */
56};
57#endif
58
59/* File identifier in network order */
60struct DirNFid {
61 int dnf_vnode; /* file's vnode slot */
62 int dnf_unique; /* the slot incarnation number */
63};
64
65/* A directory entry */
66struct DirEntry {
67 char flag;
68 char length; /* currently unused */
69 short next;
70 struct DirNFid fid;
71 char name[16]; /* 16 is deceiving; actual name[] arrays
72 have extra blobs appended to make name[]
73 as long as needed (Satya, May 04) */
74};
75
76int DIR_Init(int data_loc);
77
78/* DH interface */
79void DH_LockW(PDirHandle dh);
80void DH_LockR(PDirHandle dh);
81void DH_UnLockW(PDirHandle dh);
82void DH_UnLockR(PDirHandle dh);
83void DH_Init(PDirHandle dh);
84void DH_Alloc(PDirHandle dh, int size, int in_rvm);
86void DH_Free(PDirHandle dh, int in_rvm);
87void DH_FreeData(PDirHandle dh);
88PDirHandle DH_New(int in_rvm, PDirHeader vmdata, PDirHeader rvmdata);
89int DH_Length(PDirHandle dh);
90int DH_Convert(PDirHandle dh, char *file, VolumeId vol, RealmId realm);
91int DH_Create(PDirHandle dh, const char *entry, struct ViceFid *vfid);
93int DH_Lookup(PDirHandle dh, const char *entry, struct ViceFid *vfid,
94 int flags);
95char *DH_FindName(PDirHandle dh, struct DirFid *fid, char *name, int len);
96int DH_LookupByFid(PDirHandle dh, char *entry, struct ViceFid *vfid);
97int DH_Delete(PDirHandle dh, const char *entry);
98int DH_DirOK(PDirHandle dh);
99void DH_Free(PDirHandle dh, int in_rvm);
100void DH_Print(PDirHandle dh, FILE *f);
101void DH_PrintStats(FILE *fp);
102int DH_MakeDir(PDirHandle dh, struct ViceFid *vme, struct ViceFid *vparent);
104 int (*hookproc)(struct DirEntry *de, void *hook),
105 void *hook);
109void DH_Init(PDirHandle dh);
110
111/* fid support */
112
113#define ISDIR(fid) ((fid).Vnode & 1) /* Directory fids are odd */
114
115#define FID_LT(a, b) \
116 /* Assumes that ((a).Volume == (b).Volume)! */ \
117 ((((a).Vnode) < ((b).Vnode)) || \
118 ((a).Vnode == (b).Vnode && ((a).Unique) < ((b).Unique)))
119
120#define FID_LTE(a, b) \
121 /* Assumes that ((a).Volume == (b).Volume)! */ \
122 ((((a).Vnode) < ((b).Vnode)) || \
123 ((a).Vnode == (b).Vnode && ((a).Unique) <= ((b).Unique)))
124
125/* local fid and local volume related stuff */
126int FID_IsVolRoot(const struct ViceFid *fid);
127void FID_MakeRoot(struct ViceFid *fid);
128
129/* check if this is a local directory or file */
130int FID_IsDisco(const struct ViceFid *x);
131int FID_IsLocalDir(const struct ViceFid *fid);
132int FID_IsLocalFile(const struct ViceFid *fid);
133void FID_MakeDiscoFile(struct ViceFid *fid, VolumeId vid, Unique_t unique);
134void FID_MakeDiscoDir(struct ViceFid *fid, VolumeId vid, Unique_t unique);
135
136/* directory vnode number for dangling links during conflicts -
137 two versions, one for the remote copy one for the local oopy*/
138
139/* make the root of a repair subtree residing on the server */
140int FID_IsFakeRoot(struct ViceFid *fid);
141void FID_MakeSubtreeRoot(struct ViceFid *fid, VolumeId vid, Unique_t unique);
142/* fill fids residing in the local tree */
143void FID_MakeLocalDir(struct ViceFid *fid, Unique_t unique);
144void FID_MakeLocalFile(struct ViceFid *fid, Unique_t unique);
145void FID_MakeLocalSubtreeRoot(struct ViceFid *fid, Unique_t unique);
146
147/* compare parts of fids */
148int FID_EQ(const struct ViceFid *fa, const struct ViceFid *fb);
149int FID_VolEQ(const struct ViceFid *fa, const struct ViceFid *fb);
150int FID_Cmp(const struct ViceFid *, const struct ViceFid *);
151
152/* copy or transform parts of fids */
153void FID_CpyVol(struct ViceFid *target, const struct ViceFid *source);
154void FID_VFid2DFid(const struct ViceFid *vf, struct DirFid *df);
155void FID_DFid2VFid(const struct DirFid *df, struct ViceFid *vf);
156void FID_PrintFid(const struct DirFid *fid);
157void FID_Int2DFid(struct DirFid *fid, const int vnode, const int unique);
158void FID_NFid2Int(const struct DirNFid *fid, VnodeId *vnode, Unique_t *unique);
159
160/* print fids */
161char *FID_(const struct ViceFid *fid);
162
163/* extern definitions for dirbody.c */
164int DIR_init(int);
167void DIR_Print(PDirHeader, FILE *f);
168#define DIR_intrans() DIR_check_trans(__FUNCTION__, __FILE__)
169void DIR_check_trans(const char *where, const char *file);
170struct PageHeader *DIR_Page(struct DirHeader *dirh, int page);
171
172/* Directory Inode interface */
173struct DirInode {
175 int di_refcount; /* for copy on write */
176};
177typedef struct DirInode *PDirInode;
178
179void DC_SetDI(PDCEntry pdce, PDirInode pdi);
182void DI_Copy(PDirInode oldinode, PDirInode *newinode) REQUIRES_TRANSACTION;
187void *DI_Page(PDirInode, int);
188void DI_VMCopy(PDirInode oldinode, PDirInode *newinode);
189void DI_VMFree(PDirInode pdi);
190void DI_VMDec(PDirInode pdi);
191void DC_SetCount(PDCEntry pdce, int count);
192void DC_SetRefcount(PDCEntry pdc, int count);
193
194/* dir handle cache */
197void DC_Put(PDCEntry);
198void DC_Drop(PDCEntry);
199int DC_Count(PDCEntry pdce);
200void DC_SetDirh(PDCEntry pdce, PDirHeader pdh);
203int DC_Dirty(PDCEntry);
204void DC_SetDirty(PDCEntry, int);
209void DC_Rehash(PDCEntry);
210void DC_HashInit();
211
212#endif /* _DIR_H_ */
#define REQUIRES_TRANSACTION
Definition: coda_tsa.h:107
int DH_IsEmpty(PDirHandle dh)
Definition: codadir.c:124
PDirHandle DC_DC2DH(PDCEntry)
Definition: dhcache.c:264
char * FID_(const struct ViceFid *fid)
Definition: fid.c:203
int FID_VolEQ(const struct ViceFid *fa, const struct ViceFid *fb)
Definition: fid.c:108
void FID_NFid2Int(const struct DirNFid *fid, VnodeId *vnode, Unique_t *unique)
Definition: fid.c:59
struct DirHeader * PDirHeader
Definition: codadir.h:41
int DI_Count(PDirInode)
Definition: dirinode.c:154
int DH_Create(PDirHandle dh, const char *entry, struct ViceFid *vfid)
Definition: codadir.c:106
struct DCEntry * PDCEntry
Definition: codadir.h:43
PDirInode DC_DC2DI(PDCEntry pdce)
Definition: dhcache.c:276
int FID_EQ(const struct ViceFid *fa, const struct ViceFid *fb)
Definition: fid.c:97
void * DI_Page(PDirInode, int)
Definition: dirinode.c:173
int FID_IsFakeRoot(struct ViceFid *fid)
Definition: fid.c:176
void DC_SetDirty(PDCEntry, int)
Definition: dhcache.c:307
void DC_SetCowpdi(PDCEntry, PDirInode)
Definition: dhcache.c:294
void DH_Free(PDirHandle dh, int in_rvm)
void DIR_Print(PDirHeader, FILE *f)
Definition: dirbody.c:693
#define DIR_MAXPAGES
Definition: codadir.h:33
void DH_UnLockW(PDirHandle dh)
Definition: codadir.c:61
int DH_Lookup(PDirHandle dh, const char *entry, struct ViceFid *vfid, int flags)
Definition: codadir.c:138
void DI_Inc(PDirInode pdi) REQUIRES_TRANSACTION
Definition: dirinode.c:141
PDirHeader DI_DiToDh(PDirInode pdi)
Definition: dirinode.c:36
void DH_Alloc(PDirHandle dh, int size, int in_rvm)
Definition: codadir.c:204
int FID_IsLocalDir(const struct ViceFid *fid)
Definition: fid.c:126
char * DH_FindName(PDirHandle dh, struct DirFid *fid, char *name, int len)
int FID_IsDisco(const struct ViceFid *x)
Definition: fid.c:121
int DC_Refcount(PDCEntry)
Definition: dhcache.c:254
void FID_Int2DFid(struct DirFid *fid, const int vnode, const int unique)
Definition: fid.c:50
void FID_PrintFid(const struct DirFid *fid)
void DC_SetDirh(PDCEntry pdce, PDirHeader pdh)
Definition: dhcache.c:282
int FID_IsLocalFile(const struct ViceFid *fid)
Definition: fid.c:131
int DH_Delete(PDirHandle dh, const char *entry)
Definition: codadir.c:171
struct DirHandle * PDirHandle
Definition: codadir.h:42
int DC_Count(PDCEntry pdce)
Definition: dhcache.c:225
PDCEntry DC_Get(PDirInode)
Definition: dhcache.c:110
PDCEntry DC_DH2DC(PDirHandle pdh)
Definition: dhcache.c:270
void DH_Put(PDirHandle)
PDCEntry DC_New()
Definition: dhcache.c:236
void DH_PrintStats(FILE *fp)
Definition: dirbody.c:416
int DH_LookupByFid(PDirHandle dh, char *entry, struct ViceFid *vfid)
Definition: codadir.c:154
int DH_Length(PDirHandle dh)
Definition: codadir.c:78
void FID_MakeRoot(struct ViceFid *fid)
Definition: fid.c:192
void FID_DFid2VFid(const struct DirFid *df, struct ViceFid *vf)
int DIR_Compare(PDirHeader, PDirHeader)
Definition: dirbody.c:917
void DC_SetRefcount(PDCEntry pdc, int count)
Definition: dhcache.c:259
int DC_Dirty(PDCEntry)
Definition: dhcache.c:314
void DC_SetDI(PDCEntry pdce, PDirInode pdi)
Definition: dhcache.c:288
void DI_Dec(PDirInode pdi) REQUIRES_TRANSACTION
Definition: dirinode.c:114
int DIR_Length(PDirHeader)
void FID_MakeDiscoDir(struct ViceFid *fid, VolumeId vid, Unique_t unique)
Definition: fid.c:143
struct DirInode * PDirInode
Definition: codadir.h:177
void DI_VMCopy(PDirInode oldinode, PDirInode *newinode)
Definition: dirinode.c:208
void DC_SetCount(PDCEntry pdce, int count)
Definition: dhcache.c:230
void FID_MakeLocalFile(struct ViceFid *fid, Unique_t unique)
Definition: fid.c:167
void FID_MakeLocalSubtreeRoot(struct ViceFid *fid, Unique_t unique)
Definition: fid.c:181
void DI_DhToDi(PDCEntry pdce) REQUIRES_TRANSACTION
Definition: dirinode.c:72
void FID_MakeDiscoFile(struct ViceFid *fid, VolumeId vid, Unique_t unique)
Definition: fid.c:136
int DH_EnumerateDir(PDirHandle dh, int(*hookproc)(struct DirEntry *de, void *hook), void *hook)
Definition: codadir.c:267
void DIR_check_trans(const char *where, const char *file)
Definition: dirbody.c:98
struct PageHeader * DIR_Page(struct DirHeader *dirh, int page)
Definition: dirbody.c:280
int DI_Pages(PDirInode)
Definition: dirinode.c:161
struct DirFid * PDirFid
Definition: codadir.h:40
PDirInode DC_Cowpdi(PDCEntry)
Definition: dhcache.c:301
void DC_Put(PDCEntry)
Definition: dhcache.c:211
int FID_Cmp(const struct ViceFid *, const struct ViceFid *)
Definition: fid.c:80
void DC_HashInit()
Definition: dhcache.c:198
void DH_Print(PDirHandle dh, FILE *f)
Definition: codadir.c:228
void DI_VMFree(PDirInode pdi)
Definition: dirinode.c:254
PDirHeader DH_Data(PDirHandle dh)
Definition: codadir.c:223
void DC_Rehash(PDCEntry)
Definition: dhcache.c:167
void FID_MakeLocalDir(struct ViceFid *fid, Unique_t unique)
Definition: fid.c:160
int DH_MakeDir(PDirHandle dh, struct ViceFid *vme, struct ViceFid *vparent)
Definition: codadir.c:246
int DH_Commit(PDirHandle dh)
struct DirEntry * PDirEntry
Definition: codadir.h:39
int DH_Convert(PDirHandle dh, char *file, VolumeId vol, RealmId realm)
Definition: codadir.c:92
int DH_DirOK(PDirHandle dh)
Definition: codadir.c:236
void FID_MakeSubtreeRoot(struct ViceFid *fid, VolumeId vid, Unique_t unique)
Definition: fid.c:152
void DH_LockR(PDirHandle dh)
Definition: codadir.c:56
void DH_LockW(PDirHandle dh)
Definition: codadir.c:51
PDirHandle DH_New(int in_rvm, PDirHeader vmdata, PDirHeader rvmdata)
void DC_Drop(PDCEntry)
Definition: dhcache.c:184
int DIR_init(int)
void DI_Copy(PDirInode oldinode, PDirInode *newinode) REQUIRES_TRANSACTION
Definition: dirinode.c:182
void DH_UnLockR(PDirHandle dh)
Definition: codadir.c:66
void FID_CpyVol(struct ViceFid *target, const struct ViceFid *source)
Definition: fid.c:44
void DH_Init(PDirHandle dh)
Definition: codadir.c:71
void DI_VMDec(PDirInode pdi)
Definition: dirinode.c:232
int DIR_Init(int data_loc)
Definition: dirbody.c:403
int FID_IsVolRoot(const struct ViceFid *fid)
Definition: fid.c:198
void DH_Get(PDirHandle, PDirHeader)
void FID_VFid2DFid(const struct ViceFid *vf, struct DirFid *df)
Definition: fid.c:66
void DH_FreeData(PDirHandle dh)
Definition: codadir.c:186
FILE * file
Definition: dirtest.c:723
name
Definition: pwdtopdbtool.py:40
x
Definition: pwdtopdbtool.py:40
@ f
Definition: rvm_private.h:416
Definition: dhcache.c:38
Definition: codadir.h:66
struct DirNFid fid
Definition: codadir.h:70
char length
Definition: codadir.h:68
char name[16]
Definition: codadir.h:71
char flag
Definition: codadir.h:67
short next
Definition: codadir.h:69
Definition: codadir.h:45
int dh_dirty
Definition: codadir.h:48
Lock dh_lock
Definition: codadir.h:46
PDirHeader dh_data
Definition: codadir.h:47
Definition: dirbody.h:71
Definition: codadir.h:173
int di_refcount
Definition: codadir.h:175
void * di_pages[DIR_MAXPAGES]
Definition: codadir.h:174
Definition: codadir.h:60
int dnf_vnode
Definition: codadir.h:61
int dnf_unique
Definition: codadir.h:62
Definition: lock.h:68
Definition: dirbody.h:63
Definition: codamergedump.cc:54