1*4366bb71SDavid du Colombier /* 2*4366bb71SDavid du Colombier * fscfs 3*4366bb71SDavid du Colombier */ 4*4366bb71SDavid du Colombier 5*4366bb71SDavid du Colombier typedef struct Attach Attach; 6*4366bb71SDavid du Colombier typedef struct Auth Auth; 7*4366bb71SDavid du Colombier typedef struct Data Data; 8*4366bb71SDavid du Colombier typedef struct Dref Dref; 9*4366bb71SDavid du Colombier typedef struct Fid Fid; 10*4366bb71SDavid du Colombier typedef struct File File; 11*4366bb71SDavid du Colombier typedef struct Host Host; 12*4366bb71SDavid du Colombier typedef struct Path Path; 13*4366bb71SDavid du Colombier typedef struct P9fs P9fs; 14*4366bb71SDavid du Colombier typedef struct Req Req; 15*4366bb71SDavid du Colombier typedef struct SFid SFid; 16*4366bb71SDavid du Colombier typedef struct String String; 17*4366bb71SDavid du Colombier 18*4366bb71SDavid du Colombier #pragma incomplete P9fs 19*4366bb71SDavid du Colombier 20*4366bb71SDavid du Colombier typedef u32int Tag; 21*4366bb71SDavid du Colombier 22*4366bb71SDavid du Colombier struct String 23*4366bb71SDavid du Colombier { 24*4366bb71SDavid du Colombier Ref; 25*4366bb71SDavid du Colombier int len; 26*4366bb71SDavid du Colombier char* s; 27*4366bb71SDavid du Colombier String* next; /* hash chain */ 28*4366bb71SDavid du Colombier }; 29*4366bb71SDavid du Colombier 30*4366bb71SDavid du Colombier struct Dref 31*4366bb71SDavid du Colombier { 32*4366bb71SDavid du Colombier int inuse; /* reference count locally */ 33*4366bb71SDavid du Colombier int faruse; /* remote references */ 34*4366bb71SDavid du Colombier Tag tag; /* remote object tag */ 35*4366bb71SDavid du Colombier Host* loc; /* location of object (nil if here) */ 36*4366bb71SDavid du Colombier Host* src; /* source of object reference (nil if here) */ 37*4366bb71SDavid du Colombier int depth; /* 0 if here or loc == src */ 38*4366bb71SDavid du Colombier int weight; /* proxy weight */ 39*4366bb71SDavid du Colombier }; 40*4366bb71SDavid du Colombier 41*4366bb71SDavid du Colombier enum{ 42*4366bb71SDavid du Colombier FidHash= 1<<8, 43*4366bb71SDavid du Colombier }; 44*4366bb71SDavid du Colombier 45*4366bb71SDavid du Colombier struct Attach 46*4366bb71SDavid du Colombier { 47*4366bb71SDavid du Colombier /* parameters and result of a Tattach */ 48*4366bb71SDavid du Colombier u32int fid; 49*4366bb71SDavid du Colombier char* uname; 50*4366bb71SDavid du Colombier char* aname; 51*4366bb71SDavid du Colombier Path* root; /* qid from attach is root->qid, root->sfid is server fid */ 52*4366bb71SDavid du Colombier Attach* next; 53*4366bb71SDavid du Colombier }; 54*4366bb71SDavid du Colombier 55*4366bb71SDavid du Colombier struct Auth 56*4366bb71SDavid du Colombier { 57*4366bb71SDavid du Colombier /* could probably use a Ref */ 58*4366bb71SDavid du Colombier SFid* afid; 59*4366bb71SDavid du Colombier char* uname; 60*4366bb71SDavid du Colombier char* aname; 61*4366bb71SDavid du Colombier char* error; 62*4366bb71SDavid du Colombier Auth* next; 63*4366bb71SDavid du Colombier int active; /* active until attached, with or without success */ 64*4366bb71SDavid du Colombier Req* pending; /* later Auth requests with same parameters, and flush requests */ 65*4366bb71SDavid du Colombier }; 66*4366bb71SDavid du Colombier 67*4366bb71SDavid du Colombier struct Host 68*4366bb71SDavid du Colombier { 69*4366bb71SDavid du Colombier Ref; 70*4366bb71SDavid du Colombier 71*4366bb71SDavid du Colombier QLock; 72*4366bb71SDavid du Colombier int fd; /* link to host */ 73*4366bb71SDavid du Colombier char* name; /* symbolic name (mainly for diagnostics) */ 74*4366bb71SDavid du Colombier Fid* fids[FidHash]; /* fids active for this host */ 75*4366bb71SDavid du Colombier /* might need per-host auth/attach fid/afid for authentication? */ 76*4366bb71SDavid du Colombier /* implies separation of fid spaces, and thus separate Fids but not Files and Paths */ 77*4366bb71SDavid du Colombier }; 78*4366bb71SDavid du Colombier 79*4366bb71SDavid du Colombier struct Path 80*4366bb71SDavid du Colombier { 81*4366bb71SDavid du Colombier Ref; 82*4366bb71SDavid du Colombier char* name; 83*4366bb71SDavid du Colombier Qid qid; 84*4366bb71SDavid du Colombier Path* parent; 85*4366bb71SDavid du Colombier Path* child; 86*4366bb71SDavid du Colombier Path* next; /* sibling */ 87*4366bb71SDavid du Colombier uint nxtime; /* zero (if exists) or last time we checked */ 88*4366bb71SDavid du Colombier char* inval; /* walk error if invalid */ 89*4366bb71SDavid du Colombier File* file; /* file data, if open */ 90*4366bb71SDavid du Colombier SFid* sfid; /* walked to this fid on server */ 91*4366bb71SDavid du Colombier }; 92*4366bb71SDavid du Colombier 93*4366bb71SDavid du Colombier struct Data 94*4366bb71SDavid du Colombier { 95*4366bb71SDavid du Colombier /* cached portion of a file */ 96*4366bb71SDavid du Colombier uint min; /* offsets */ 97*4366bb71SDavid du Colombier uint max; 98*4366bb71SDavid du Colombier uint size; /* size of buffer (power of 2) */ 99*4366bb71SDavid du Colombier uchar* base; 100*4366bb71SDavid du Colombier 101*4366bb71SDavid du Colombier /* LRU stuff */ 102*4366bb71SDavid du Colombier Data* forw; 103*4366bb71SDavid du Colombier Data* back; 104*4366bb71SDavid du Colombier File* owner; 105*4366bb71SDavid du Colombier uint n; /* index in owner's cache */ 106*4366bb71SDavid du Colombier }; 107*4366bb71SDavid du Colombier 108*4366bb71SDavid du Colombier struct SFid 109*4366bb71SDavid du Colombier { 110*4366bb71SDavid du Colombier Ref; /* by client fids */ 111*4366bb71SDavid du Colombier u32int fid; /* fid on server */ 112*4366bb71SDavid du Colombier SFid* next; /* on free or LRU list */ 113*4366bb71SDavid du Colombier }; 114*4366bb71SDavid du Colombier 115*4366bb71SDavid du Colombier struct Fid 116*4366bb71SDavid du Colombier { 117*4366bb71SDavid du Colombier u32int fid; /* fid on Host */ 118*4366bb71SDavid du Colombier Qid qid; 119*4366bb71SDavid du Colombier Path* path; /* shared data about file */ 120*4366bb71SDavid du Colombier SFid* opened; /* server fid once opened */ 121*4366bb71SDavid du Colombier uint mode; /* open mode (OREAD, OWRITE, ORDWR) */ 122*4366bb71SDavid du Colombier Fid* next; /* in fid hash list */ 123*4366bb71SDavid du Colombier }; 124*4366bb71SDavid du Colombier 125*4366bb71SDavid du Colombier struct File 126*4366bb71SDavid du Colombier { 127*4366bb71SDavid du Colombier Ref; 128*4366bb71SDavid du Colombier 129*4366bb71SDavid du Colombier SFid* open[3]; /* cached sfids: OREAD, OWRITE, ORDWR */ 130*4366bb71SDavid du Colombier 131*4366bb71SDavid du Colombier /* data from Dir */ 132*4366bb71SDavid du Colombier uint mode; /* permissions */ 133*4366bb71SDavid du Colombier uint atime; /* last read time */ 134*4366bb71SDavid du Colombier uint mtime; /* last write time */ 135*4366bb71SDavid du Colombier u64int length; /* file length from stat or 0 => use clength */ 136*4366bb71SDavid du Colombier String* uid; /* owner name */ 137*4366bb71SDavid du Colombier String* gid; /* group name */ 138*4366bb71SDavid du Colombier String* muid; /* last modifier name */ 139*4366bb71SDavid du Colombier 140*4366bb71SDavid du Colombier Qid qid; 141*4366bb71SDavid du Colombier u32int iounit; 142*4366bb71SDavid du Colombier u64int clength; /* known length in cache */ 143*4366bb71SDavid du Colombier uint ndata; /* size of cache array */ 144*4366bb71SDavid du Colombier Data** cached; 145*4366bb71SDavid du Colombier 146*4366bb71SDavid du Colombier /* Dref for local and remote references */ 147*4366bb71SDavid du Colombier /* possibly put expired ones on LRU? */ 148*4366bb71SDavid du Colombier File* next; 149*4366bb71SDavid du Colombier }; 150*4366bb71SDavid du Colombier 151*4366bb71SDavid du Colombier struct Req 152*4366bb71SDavid du Colombier { 153*4366bb71SDavid du Colombier u32int tag; 154*4366bb71SDavid du Colombier Fcall t; 155*4366bb71SDavid du Colombier SFid* fid; /* also afid in Tauth */ 156*4366bb71SDavid du Colombier SFid* newfid; /* also afid in Tattach */ 157*4366bb71SDavid du Colombier Fcall r; 158*4366bb71SDavid du Colombier uchar* buf; 159*4366bb71SDavid du Colombier uint msize; 160*4366bb71SDavid du Colombier Req* flush; 161*4366bb71SDavid du Colombier Req* next; /* in tag list, or flush list of another Req */ 162*4366bb71SDavid du Colombier }; 163