diff --git a/daemon/nfs41_daemon.c b/daemon/nfs41_daemon.c index 2955f96..bcd2da5 100644 --- a/daemon/nfs41_daemon.c +++ b/daemon/nfs41_daemon.c @@ -128,7 +128,7 @@ static unsigned int WINAPI thread_main(void *args) status = upcall_handle(&upcall); write_downcall: - dprintf(1, "writing downcall: xid=%d opcode=%s status=%d " + dprintf(1, "writing downcall: xid=%lld opcode=%s status=%d " "get_last_error=%d\n", upcall.xid, opcode2string(upcall.opcode), upcall.status, upcall.last_error); @@ -138,7 +138,7 @@ write_downcall: status = DeviceIoControl(pipe, IOCTL_NFS41_WRITE, inbuf, inbuf_len, NULL, 0, (LPDWORD)&outbuf_len, NULL); if (!status) { - eprintf("IOCTL_NFS41_WRITE failed with %d xid=%d opcode=%s\n", + eprintf("IOCTL_NFS41_WRITE failed with %d xid=%lld opcode=%s\n", GetLastError(), upcall.xid, opcode2string(upcall.opcode)); upcall_cancel(&upcall); } diff --git a/daemon/upcall.c b/daemon/upcall.c index 5f7eb8b..dcd6a7e 100644 --- a/daemon/upcall.c +++ b/daemon/upcall.c @@ -95,7 +95,7 @@ int upcall_parse( /* parse common elements */ status = safe_read(&buffer, &length, &version, sizeof(uint32_t)); if (status) goto out; - status = safe_read(&buffer, &length, &upcall->xid, sizeof(uint32_t)); + status = safe_read(&buffer, &length, &upcall->xid, sizeof(uint64_t)); if (status) goto out; status = safe_read(&buffer, &length, &upcall->opcode, sizeof(uint32_t)); if (status) goto out; diff --git a/daemon/upcall.h b/daemon/upcall.h index 4cc061a..e276f27 100644 --- a/daemon/upcall.h +++ b/daemon/upcall.h @@ -184,7 +184,7 @@ typedef union __upcall_args { } upcall_args; typedef struct __nfs41_upcall { - uint32_t xid; + uint64_t xid; uint32_t opcode; uint32_t status; uint32_t last_error; diff --git a/sys/nfs41_debug.c b/sys/nfs41_debug.c index a542fb7..7c3fe87 100644 --- a/sys/nfs41_debug.c +++ b/sys/nfs41_debug.c @@ -666,12 +666,12 @@ void print_open_error(int on, int status) } void print_wait_status(int on, const char *prefix, NTSTATUS status, - const char *opcode, PVOID entry, int xid) + const char *opcode, PVOID entry, LONGLONG xid) { switch (status) { case STATUS_SUCCESS: if (opcode) - DbgP("%s Got a wakeup call, finishing %s entry=%p xid=%d\n", + DbgP("%s Got a wakeup call, finishing %s entry=%p xid=%lld\n", prefix, opcode, entry, xid); else DbgP("%s Got a wakeup call\n", prefix); diff --git a/sys/nfs41_debug.h b/sys/nfs41_debug.h index 4402361..2c39ac1 100644 --- a/sys/nfs41_debug.h +++ b/sys/nfs41_debug.h @@ -56,7 +56,7 @@ void print_caching_level(int on, ULONG flag); const char *opcode2string(int opcode); void print_open_error(int on, int status); void print_wait_status(int on, const char *str, NTSTATUS status, - const char *opcode, PVOID entry, int xid); + const char *opcode, PVOID entry, LONGLONG xid); void print_acl_args(SECURITY_INFORMATION info); #define DbgEn() DbgPrintEx(DPFLTR_IHVNETWORK_ID, DPFLTR_ERROR_LEVEL, \ diff --git a/sys/nfs41_driver.c b/sys/nfs41_driver.c index 9c1d747..5ccbdba 100644 --- a/sys/nfs41_driver.c +++ b/sys/nfs41_driver.c @@ -70,7 +70,7 @@ FAST_MUTEX upcallLock, downcallLock; FAST_MUTEX xidLock; FAST_MUTEX openOwnerLock; -ULONG xid = 0; +LONGLONG xid = 0; ULONG open_owner_id = 1; #define DECLARE_CONST_ANSI_STRING(_var, _string) \ @@ -122,7 +122,7 @@ typedef enum _nfs41_updowncall_state { typedef struct _updowncall_entry { DWORD version; - DWORD xid; + LONGLONG xid; DWORD opcode; NTSTATUS status; nfs41_updowncall_state state; @@ -420,15 +420,6 @@ nfs41_start_driver_state nfs41_start_state = NFS41_START_DRIVER_STARTABLE; NTSTATUS map_readwrite_errors(DWORD status); -ULONG get_next_xid() -{ - ULONG x; - ExAcquireFastMutex(&xidLock); - x = ++xid; - ExReleaseFastMutex(&xidLock); - return x; -} - ULONG get_next_open_owner() { ULONG x; @@ -525,7 +516,7 @@ NTSTATUS marshal_nfs41_header( RtlCopyMemory(tmp, &entry->open_state, sizeof(HANDLE)); tmp += sizeof(HANDLE); - DbgP("[upcall] entry=%p xid=%d opcode=%d version=%d session=0x%x " + DbgP("[upcall] entry=%p xid=%lld opcode=%d version=%d session=0x%x " "open_state=0x%x\n", entry, entry->xid, entry->opcode, entry->version, entry->session, entry->open_state); out: @@ -1348,7 +1339,7 @@ NTSTATUS nfs41_UpcallCreate( } RtlZeroMemory(entry, sizeof(nfs41_updowncall_entry)); - entry->xid = get_next_xid(); + entry->xid = InterlockedIncrement64(&xid); entry->opcode = opcode; entry->state = NFS41_WAITING_FOR_UPCALL; entry->session = session; @@ -1391,7 +1382,7 @@ NTSTATUS nfs41_UpcallWaitForReply( nfs41_AddEntry(upcallLock, upcall, entry); KeSetEvent(&upcallEvent, 0, FALSE); - DbgP("@@@ Creating %s upcall entry=%p xid=%d\n", opstring, entry, entry->xid); + DbgP("@@@ Creating %s upcall entry=%p xid=%lld\n", opstring, entry, entry->xid); if (!entry->async_op) { /* 02/03/2011 AGLO: it is not clear what the "right" waiting design * should be. Having non-interruptable waiting seems to be the right @@ -1428,12 +1419,12 @@ NTSTATUS nfs41_UpcallWaitForReply( default: ExAcquireFastMutex(&entry->lock); if (entry->state == NFS41_DONE_PROCESSING) { - DbgP("[downcall] finish processing %s entry=%p xid=%d\n", + DbgP("[downcall] finish processing %s entry=%p xid=%lld\n", opcode2string(entry->opcode), entry, entry->xid); ExReleaseFastMutex(&entry->lock); break; } - DbgP("[upcall] abandoning %s entry=%p xid=%d\n", + DbgP("[upcall] abandoning %s entry=%p xid=%lld\n", opcode2string(entry->opcode), entry, entry->xid); entry->state = NFS41_NOT_WAITING; ExReleaseFastMutex(&entry->lock); @@ -1520,7 +1511,7 @@ NTSTATUS nfs41_downcall( buf += sizeof(tmp->status); RtlCopyMemory(&tmp->errno, buf, sizeof(tmp->errno)); buf += sizeof(tmp->errno); - DbgP("[downcall] xid=%d opcode=%d status=%d errno=%d\n", tmp->xid, + DbgP("[downcall] xid=%lld opcode=%d status=%d errno=%d\n", tmp->xid, tmp->opcode, tmp->status, tmp->errno); ExAcquireFastMutex(&downcallLock); @@ -1529,7 +1520,6 @@ NTSTATUS nfs41_downcall( while (pEntry != NULL) { cur = (nfs41_updowncall_entry *)CONTAINING_RECORD(pEntry, nfs41_updowncall_entry, next); - DbgP("nfs41_downcall: comparing %d %d\n", cur->xid, tmp->xid); if (cur->xid == tmp->xid) { found = 1; break; @@ -1543,7 +1533,7 @@ NTSTATUS nfs41_downcall( ExReleaseFastMutex(&downcallLock); SeStopImpersonatingClient(); if (!found) { - print_error("Didn't find xid=%d entry\n", tmp->xid); + print_error("Didn't find xid=%lld entry\n", tmp->xid); goto out_free; }