Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

473 lines
13 KiB

  1. /*++
  2. Copyright (c) 2000 Microsoft Corporation
  3. Module Name:
  4. fsp.h
  5. Abstract:
  6. Private replication file system data structures and functions
  7. Author:
  8. Ahmed Mohamed (ahmedm) 1-Feb-2000
  9. Revision History:
  10. --*/
  11. #ifndef FS_P_H
  12. #define FS_P_H
  13. #ifdef __cplusplus
  14. extern "C" {
  15. #endif
  16. #include "crs.h"
  17. typedef ULONGLONG fs_id_t[2];
  18. #define PAGESIZE 4*1024
  19. #define FsTableSize 128
  20. #define FS_FID_NAME "CRSFID$"
  21. #define FS_FID_NAME_LEN 7
  22. #define MNS_REDIRECTOR DD_NFS_DEVICE_NAME_U
  23. #define MNS_TRANSPORT L"\\Device\\NetbiosSmb"
  24. // This is the delay in ms a MNS arbitrate thread should wait before trying to lock a share.
  25. // This gives preference to the highest priority network. The actual delay of a thread.
  26. // MNS_LOCK_DELAY * <Network Priority of the network>.
  27. //
  28. #define MNS_LOCK_DELAY 2000
  29. typedef struct {
  30. FILE_FULL_EA_INFORMATION hdr;
  31. CHAR data[FS_FID_NAME_LEN+sizeof(fs_id_t)];
  32. }fs_ea_t;
  33. typedef struct {
  34. FILE_GET_EA_INFORMATION hdr;
  35. CHAR data[FS_FID_NAME_LEN];
  36. }fs_ea_name_t;
  37. #define FsInitEa(x) { \
  38. (x)->hdr.NextEntryOffset = 0; \
  39. (x)->hdr.Flags = 0; \
  40. (x)->hdr.EaNameLength = FS_FID_NAME_LEN; \
  41. strncpy((x)->hdr.EaName, FS_FID_NAME, FS_FID_NAME_LEN+1); \
  42. (x)->hdr.EaValueLength = sizeof(fs_id_t); \
  43. }
  44. #define FsInitEaName(x) { \
  45. (x)->hdr.NextEntryOffset = 0; \
  46. (x)->hdr.EaNameLength = FS_FID_NAME_LEN; \
  47. strncpy((x)->hdr.EaName, FS_FID_NAME, FS_FID_NAME_LEN+1); \
  48. }
  49. #define FsInitEaFid(x, fid) { \
  50. (fid) = (fs_id_t *) (&((x)->hdr.EaName[FS_FID_NAME_LEN+1])); \
  51. }
  52. #define xFsOpenRA(fd,hvol,name,sz) \
  53. xFsOpen(fd,hvol,name,sz,FILE_READ_EA | (FILE_GENERIC_READ & ~FILE_READ_DATA), \
  54. FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, 0)
  55. #define xFsOpenWA(fd,hvol,name,sz) \
  56. xFsOpen(fd,hvol,name,sz, FILE_WRITE_EA | ((FILE_GENERIC_READ|FILE_GENERIC_WRITE)&~(FILE_READ_DATA|FILE_WRITE_DATA|FILE_APPEND_DATA)), \
  57. FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, 0)
  58. #define xFsOpenRD(fd,hvol,id,sz) \
  59. xFsOpen(fd,hvol,name,sz,FILE_READ_EA | FILE_GENERIC_READ, \
  60. FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, 0)
  61. #define xFsOpenWD(fd,hvol,name,sz) \
  62. xFsOpenById(fd,hvol,name,sz,FILE_WRITE_EA | fFILE_GENERIC_WRITE, \
  63. FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, 0)
  64. #define LockType CRITICAL_SECTION
  65. #define LockInit(x) InitializeCriticalSection(&x)
  66. #define LockEnter(x) EnterCriticalSection(&x)
  67. #define LockTryEnter(x) TryEnterCriticalSection(&x)
  68. #define LockExit(x) LeaveCriticalSection(&x)
  69. #define LockDestroy(x) DeleteCriticalSection(&x)
  70. #define USE_RTL_RESOURCE 1
  71. // Reader Writer Lock, Modeled on CSharedLock class, used by RPC.
  72. typedef struct _RwLock {
  73. #if USE_RTL_RESOURCE
  74. RTL_RESOURCE lock;
  75. #else
  76. CRITICAL_SECTION lock;
  77. HANDLE hevent;
  78. LONG readers;
  79. LONG writers;
  80. #endif
  81. } RwLock;
  82. #if USE_RTL_RESOURCE
  83. #define RwLockInit(p) RtlInitializeResource(&((p)->lock))
  84. #define RwLockDelete(p) RtlDeleteResource(&((p)->lock))
  85. #define RwLockShared(p) RtlAcquireResourceShared(&((p)->lock), TRUE)
  86. #define RwLockExclusive(p) RtlAcquireResourceExclusive(&((p)->lock), TRUE)
  87. #define RwUnlockShared(p) RtlReleaseResource(&((p)->lock))
  88. #define RwUnlockExclusive(p) RtlReleaseResource(&((p)->lock))
  89. // Two new functions courtesy of RTL.
  90. #define RwLockUpgrade(p) RtlConvertSharedToExclusive(&((p)->lock))
  91. #define RwLockDowngrade(p) RtlConvertExclusiveToShared(&((p)->lock))
  92. #else
  93. DWORD RwLockInit(RwLock *lock);
  94. VOID RwLockDelete(RwLock *lock);
  95. VOID RwLockShared(RwLock *lock);
  96. VOID RwUnlockShared(RwLock *lock);
  97. VOID RwLockExclusive(RwLock *lock);
  98. VOID RwUnlockExclusive(RwLock *lock);
  99. #endif
  100. typedef enum _VOLUME_STATE {
  101. VolumeStateInit=0,
  102. VolumeStateOnlineReadonly=1,
  103. VolumeStateOnlineReadWrite=2,
  104. VolumeStateMax=3
  105. } VOLUME_STATE;
  106. typedef enum _HANDLE_STATE {
  107. HandleStateInit=0,
  108. HandleStateAssigned=1,
  109. HandleStateOpened=2
  110. }HANDLE_STATE;
  111. typedef struct _hdl_t {
  112. fs_id_t Id;
  113. UINT32 Flags;
  114. HANDLE Fd[FsMaxNodes];
  115. UINT32 FilePointer;
  116. LPWSTR FileName;
  117. HANDLE_STATE hState;
  118. }hdl_t;
  119. // todo: if we want to support more than one tree/user we need to split this
  120. typedef struct _USERINFO_ {
  121. LockType Lock;
  122. // Add a refcnt, we can have multiple connects on an existing session
  123. DWORD RefCnt;
  124. UINT16 Tid;
  125. UINT16 Uid;
  126. struct _VOLINFO_ *VolInfo;
  127. hdl_t Table[FsTableSize];
  128. struct _USERINFO_ *Next;
  129. }UserInfo_t;
  130. typedef enum _ArbState_t {
  131. ARB_STATE_IDLE= 0,
  132. ARB_STATE_BUSY= 1,
  133. ARB_STATE_CANCEL= 2
  134. }ArbState_t;
  135. typedef enum _SHARE_STATE {
  136. SHARE_STATE_OFFLINE = 0,
  137. SHARE_STATE_ARBITRATED = 1,
  138. SHARE_STATE_ONLINE = 2,
  139. }SHARE_STATE;
  140. typedef struct WaitRegArg {
  141. HANDLE notifyFd;
  142. PVOID vol;
  143. DWORD id;
  144. }WaitRegArg_t;
  145. // This is the node ip address list. The ipaddresses are ordered according to
  146. // preference.
  147. //
  148. #define MAX_ADDR_NUM 10
  149. #define MAX_ADDR_SIZE 100
  150. typedef struct _AddrList_t {
  151. DWORD AddrSz;
  152. WCHAR Addr[MAX_ADDR_NUM][MAX_ADDR_SIZE];
  153. VOID *arb;
  154. DWORD NodeId;
  155. }AddrList_t;
  156. typedef struct _VOLINFO_ {
  157. VOLUME_STATE State;
  158. RwLock Lock;
  159. struct _VOLINFO_ *Next;
  160. UINT16 Tid;
  161. PVOID CrsHdl[FsMaxNodes]; // crs log handles
  162. HANDLE Fd[FsMaxNodes]; // root directory handles
  163. HANDLE NotifyFd[FsMaxNodes]; // root directory notification handles
  164. HANDLE WaitRegHdl[FsMaxNodes]; // Wait registration handles.
  165. HANDLE NotifyChangeEvent[FsMaxNodes];
  166. WaitRegArg_t WaitRegArgs[FsMaxNodes];
  167. HANDLE TreeConnHdl[FsMaxNodes]; // Tree connect handle.
  168. ULONG ReadSet;
  169. ULONG WriteSet;
  170. ULONG AliveSet;
  171. USHORT LockUpdates;
  172. // AddrList_t AddrList[FsMaxNodes]; // this has to be read during FsRegister().
  173. LPWSTR DiskList[FsMaxNodes];
  174. DWORD DiskListSz;
  175. UserInfo_t *UserList;
  176. LPWSTR Label;
  177. struct _FSCTX_ *FsCtx;
  178. WCHAR *Root; // Share name: GUID$
  179. WCHAR *LocalPath; // Local Path.(FsCtx_t->Root) %Windir%\Cluster\MNS.GUID$
  180. DWORD ArbTime; // Max arbitration time.
  181. SHARE_STATE ShareState[FsMaxNodes];
  182. LONG NumArbsInProgress; // Keeps count of number of arbs.
  183. HANDLE AllArbsCompleteEvent; // Set when all arbs in progress end.
  184. LockType ArbLock; // Lock to access NumArbInProgress.
  185. BOOL GoingAway;
  186. HANDLE ClussvcTerminationHandle;
  187. HANDLE ClussvcProcess;
  188. }VolInfo_t;
  189. typedef struct _FspArbitrate_t {
  190. ArbState_t State;
  191. ULONG OrigAliveSet;
  192. ULONG NewAliveSet;
  193. ULONG Count;
  194. ULONG DiskListSz;
  195. VolInfo_t *vol;
  196. HANDLE GotQuorumEvent; // Signalled when quorum is obtained or timeout reached.
  197. HANDLE CleanupEvent;
  198. crs_epoch_t epoch;
  199. // Need the following 3 arrays since we should not be modifying Volume while holding the
  200. // Read lock.
  201. PVOID CrsHdl[FsMaxNodes]; // CRS Handles.
  202. HANDLE Fd[FsMaxNodes]; // Root Directory Handles.
  203. HANDLE NotifyFd[FsMaxNodes]; // Notify Handles.
  204. HANDLE WaitRegHdl[FsMaxNodes];
  205. HANDLE TreeConnHdl[FsMaxNodes];
  206. CRITICAL_SECTION Lock; // <-- All access to this structure is through this lock.
  207. }FspArbitrate_t;
  208. typedef struct _SESSIONINFO_ {
  209. struct _SESSIONINFO_ *Next;
  210. UserInfo_t TreeCtx; // at tree connect time
  211. }SessionInfo_t;
  212. typedef struct _LOGONINFO_ {
  213. struct _LOGONINFO_ *Next;
  214. HANDLE Token;
  215. LUID LogOnId;
  216. }LogonInfo_t;
  217. typedef struct _FSCTX_ {
  218. LockType Lock;
  219. VolInfo_t *VolList;
  220. DWORD VolListSz;
  221. PVOID reshdl;
  222. // list of logged on users that we have obtained valid lsa tokens
  223. // add an entry during session setup, when we assign a user an id
  224. // At tree connect, we validate the user and create a private structure
  225. // to hold state
  226. LogonInfo_t *LogonList;
  227. SessionInfo_t *SessionList;
  228. }FsCtx_t;
  229. #define FS_GET_USER_HANDLE_OFFSET(u,f) (&(u)->Table[f].FilePointer)
  230. #define FS_SET_USER_HANDLE(u,nid,f,h) ((u)->Table[f].Fd[nid] = h)
  231. #define FS_GET_USER_HANDLE(u,nid,f) ((u)->Table[f].Fd[nid])
  232. #define FS_GET_FID_HANDLE(u,f) (&(u)->Table[f].Id)
  233. #define FS_GET_VOL_HANDLE(v,nid) ((v)->Fd[nid])
  234. #define FS_GET_VOL_NAME(v,nid) ((v)->DiskList[nid])
  235. #define FS_SET_VOL_HANDLE(v,nid,h) ((v)->Fd[nid] = (h))
  236. #define FS_GET_CRS_HANDLE(v,n) ((v)->CrsHdl[nid])
  237. #define FS_GET_CRS_NID_HANDLE(v,nid) ((v)->CrsHdl[(nid)])
  238. #define FS_GET_VOL_NOTIFY_HANDLE(v,nid) ((v)->NotifyFd[nid])
  239. #define FS_BUILD_LOCK_KEY(uid,nid,fid) ((uid << 16) | fid)
  240. #define MemAlloc(x) malloc(x)
  241. #define MemFree(x) free(x)
  242. typedef NTSTATUS (*fs_handler_t)(VolInfo_t *,UserInfo_t *,int,PVOID,ULONG,PVOID,ULONG_PTR *);
  243. typedef NTSTATUS (*fs_handler1_t)(VolInfo_t *,UserInfo_t *,int,PVOID,ULONG,PVOID,ULONG_PTR *, PVOID);
  244. #define FS_CREATE 0
  245. #define FS_SETATTR 1
  246. #define FS_WRITE 2
  247. #define FS_MKDIR 3
  248. #define FS_REMOVE 4
  249. #define FS_RENAME 5
  250. //
  251. typedef struct {
  252. crs_id_t xid;
  253. UINT32 flags;
  254. UINT32 attr;
  255. LPWSTR name;
  256. USHORT name_len;
  257. USHORT fnum; // file number
  258. }fs_create_msg_t;
  259. typedef struct {
  260. fs_id_t fid;
  261. USHORT action; // action taken
  262. USHORT access; // access granted
  263. }fs_create_reply_t;
  264. typedef struct {
  265. crs_id_t xid;
  266. fs_id_t *fs_id;
  267. FILE_BASIC_INFORMATION attr;
  268. union {
  269. struct {
  270. USHORT name_len;
  271. LPWSTR name;
  272. };
  273. USHORT fnum; // file number
  274. };
  275. }fs_setattr_msg_t;
  276. typedef struct {
  277. LPWSTR name;
  278. int name_len;
  279. }fs_lookup_msg_t;
  280. typedef struct {
  281. crs_id_t xid;
  282. fs_id_t *fs_id;
  283. union {
  284. UINT32 offset;
  285. UINT32 cookie;
  286. };
  287. UINT32 size;
  288. PVOID buf;
  289. PVOID context;
  290. USHORT fnum; // file number
  291. }fs_io_msg_t;
  292. typedef struct {
  293. crs_id_t xid;
  294. fs_id_t *fs_id;
  295. LPWSTR name;
  296. int name_len;
  297. }fs_remove_msg_t;
  298. typedef struct {
  299. crs_id_t xid;
  300. fs_id_t *fs_id;
  301. LPWSTR sname;
  302. LPWSTR dname;
  303. USHORT sname_len;
  304. USHORT dname_len;
  305. }fs_rename_msg_t;
  306. #define FS_LOCK_WAIT 0x1
  307. #define FS_LOCK_SHARED 0x2
  308. typedef struct {
  309. crs_id_t xid;
  310. USHORT fnum;
  311. ULONG offset;
  312. ULONG length;
  313. ULONG flags;
  314. }fs_lock_msg_t;
  315. #define EventWait(x) WaitForSingleObject(x, INFINITE)
  316. // Forward declaration
  317. void
  318. DecodeCreateParam(UINT32 uflags, UINT32 *flags, UINT32 *disp, UINT32 *share, UINT32 *access);
  319. NTSTATUS
  320. FspCreate(VolInfo_t *vinfo, UserInfo_t *uinfo, int nid, PVOID args, ULONG len, PVOID rbuf,
  321. ULONG_PTR *rlen, PVOID rec);
  322. NTSTATUS
  323. FspSetAttr2(VolInfo_t *vinfo, UserInfo_t *uinfo, int nid, PVOID args, ULONG len, PVOID rbuf,
  324. ULONG_PTR *rlen, PVOID rec);
  325. NTSTATUS
  326. FspMkDir(VolInfo_t *vinfo, UserInfo_t *uinfo, int nid, PVOID args, ULONG len, PVOID rbuf, ULONG_PTR *rlen, PVOID rec);
  327. NTSTATUS
  328. FspRemove(VolInfo_t *vinfo, UserInfo_t *uinfo, int nid, PVOID args, ULONG len, PVOID rbuf, ULONG_PTR *rlen, PVOID rec);
  329. NTSTATUS
  330. FspRename(VolInfo_t *vinfo, UserInfo_t *uinfo, int nid, PVOID args, ULONG len, PVOID rbuf, ULONG_PTR *rlen, PVOID rec);
  331. NTSTATUS
  332. FspWrite(VolInfo_t *vinfo, UserInfo_t *uinfo, int nid, PVOID args, ULONG len, PVOID rbuf, ULONG_PTR *rlen, PVOID rec);
  333. void
  334. FspEvict(VolInfo_t *vinfo, ULONG mask, BOOLEAN flag);
  335. void
  336. FspJoin(VolInfo_t *vinfo, ULONG mask);
  337. //Consistency Replica Set
  338. NTSTATUS
  339. FsUndoXid(VolInfo_t *volinfo, int nid, PVOID arg, int action, int mid);
  340. NTSTATUS
  341. FsReplayXid(VolInfo_t *volinfo, int nid, PVOID arg, int action, int mid);
  342. // this must be 64 bytes
  343. typedef struct {
  344. fs_id_t id; // crs epoch,seq
  345. ULONGLONG crshdr; // crs header
  346. fs_id_t fs_id;
  347. UINT32 command;
  348. UINT32 flags;
  349. union {
  350. char buf[CRS_RECORD_SZ - (sizeof(ULONGLONG) * 5 + sizeof(int) * 2)];
  351. struct {
  352. // create, set attrib
  353. UINT32 attrib;
  354. };
  355. struct {
  356. // write, lock
  357. UINT32 offset;
  358. UINT32 length;
  359. };
  360. };
  361. }fs_log_rec_t;
  362. typedef NTSTATUS (*FsReplayHandler_t)(VolInfo_t *info,
  363. fs_log_rec_t *lrec,
  364. int nid, int mid);
  365. NTSTATUS
  366. WINAPI
  367. FsCrsCallback(PVOID hd, int nid, CrsRecord_t *arg, int action, int mid);
  368. NTSTATUS
  369. CreateTreeConnection(LPWSTR path, HANDLE *Fd);
  370. DWORD
  371. GetTargetNodeAddresses(AddrList_t *addrList);
  372. DWORD
  373. GetNodeName(DWORD nodeId, LPWSTR nodeName);
  374. VOID
  375. FsForceClose(PVOID par, BOOLEAN isFired);
  376. #ifdef __cplusplus
  377. }
  378. #endif
  379. #endif