driver: static allocation for NetRoot mounts list

Signed-off-by: Casey Bodley <cbodley@citi.umich.edu>
This commit is contained in:
Casey Bodley 2012-05-03 14:23:07 -04:00 committed by unknown
parent 185416b785
commit b48871d807

View file

@ -291,11 +291,11 @@ typedef struct _nfs41_mount_list {
#define nfs41_AddEntry(lock,pList,pEntry) \ #define nfs41_AddEntry(lock,pList,pEntry) \
ExAcquireFastMutex(&lock); \ ExAcquireFastMutex(&lock); \
InsertTailList(&pList->head, &(pEntry)->next); \ InsertTailList(&(pList)->head, &(pEntry)->next);\
ExReleaseFastMutex(&lock); ExReleaseFastMutex(&lock);
#define nfs41_RemoveFirst(lock,pList,pEntry) \ #define nfs41_RemoveFirst(lock,pList,pEntry) \
ExAcquireFastMutex(&lock); \ ExAcquireFastMutex(&lock); \
pEntry = (IsListEmpty(&pList->head) \ pEntry = (IsListEmpty(&(pList)->head) \
? NULL \ ? NULL \
: RemoveHeadList(&pList->head)); \ : RemoveHeadList(&pList->head)); \
ExReleaseFastMutex(&lock); ExReleaseFastMutex(&lock);
@ -318,10 +318,10 @@ typedef struct _nfs41_mount_list {
ExReleaseFastMutex(&lock); ExReleaseFastMutex(&lock);
#define nfs41_GetFirstMountEntry(lock,pList,pEntry) \ #define nfs41_GetFirstMountEntry(lock,pList,pEntry) \
ExAcquireFastMutex(&lock); \ ExAcquireFastMutex(&lock); \
pEntry = (IsListEmpty(&pList->head) \ pEntry = (IsListEmpty(&(pList)->head) \
? NULL \ ? NULL \
: (nfs41_mount_entry *) \ : (nfs41_mount_entry *) \
(CONTAINING_RECORD(pList->head.Flink, \ (CONTAINING_RECORD((pList)->head.Flink, \
nfs41_mount_entry, \ nfs41_mount_entry, \
next))); \ next))); \
ExReleaseFastMutex(&lock); ExReleaseFastMutex(&lock);
@ -364,7 +364,7 @@ typedef struct _NFS41_NETROOT_EXTENSION {
DWORD nfs41d_version; DWORD nfs41d_version;
BOOLEAN mounts_init; BOOLEAN mounts_init;
FAST_MUTEX mountLock; FAST_MUTEX mountLock;
nfs41_mount_list *mounts; nfs41_mount_list mounts;
FILE_FS_ATTRIBUTE_INFORMATION FsAttrs; FILE_FS_ATTRIBUTE_INFORMATION FsAttrs;
} NFS41_NETROOT_EXTENSION, *PNFS41_NETROOT_EXTENSION; } NFS41_NETROOT_EXTENSION, *PNFS41_NETROOT_EXTENSION;
#define NFS41GetNetRootExtension(pNetRoot) \ #define NFS41GetNetRootExtension(pNetRoot) \
@ -2995,19 +2995,13 @@ NTSTATUS nfs41_CreateVNetRoot(
DbgP("Initializing mount array\n"); DbgP("Initializing mount array\n");
#endif #endif
ExInitializeFastMutex(&pNetRootContext->mountLock); ExInitializeFastMutex(&pNetRootContext->mountLock);
pNetRootContext->mounts = RxAllocatePoolWithTag(NonPagedPool, InitializeListHead(&pNetRootContext->mounts.head);
sizeof(nfs41_mount_list), NFS41_MM_POOLTAG_MOUNT);
if (pNetRootContext->mounts == NULL) {
status = STATUS_INSUFFICIENT_RESOURCES;
goto out_free;
}
InitializeListHead(&pNetRootContext->mounts->head);
pNetRootContext->mounts_init = TRUE; pNetRootContext->mounts_init = TRUE;
} else { } else {
PLIST_ENTRY pEntry; PLIST_ENTRY pEntry;
ExAcquireFastMutex(&pNetRootContext->mountLock); ExAcquireFastMutex(&pNetRootContext->mountLock);
pEntry = &pNetRootContext->mounts->head; pEntry = &pNetRootContext->mounts.head;
pEntry = pEntry->Flink; pEntry = pEntry->Flink;
while (pEntry != NULL) { while (pEntry != NULL) {
existing_mount = (nfs41_mount_entry *)CONTAINING_RECORD(pEntry, existing_mount = (nfs41_mount_entry *)CONTAINING_RECORD(pEntry,
@ -3043,9 +3037,9 @@ NTSTATUS nfs41_CreateVNetRoot(
if (pVNetRootContext->session && if (pVNetRootContext->session &&
pVNetRootContext->session != INVALID_HANDLE_VALUE) pVNetRootContext->session != INVALID_HANDLE_VALUE)
found_matching_flavor = 1; found_matching_flavor = 1;
break; break;
} }
if (pEntry->Flink == &pNetRootContext->mounts->head) if (pEntry->Flink == &pNetRootContext->mounts.head)
break; break;
pEntry = pEntry->Flink; pEntry = pEntry->Flink;
} }
@ -3063,8 +3057,7 @@ NTSTATUS nfs41_CreateVNetRoot(
&pVNetRootContext->FsAttrs); &pVNetRootContext->FsAttrs);
if (status != STATUS_SUCCESS) { if (status != STATUS_SUCCESS) {
if (!found_existing_mount && if (!found_existing_mount &&
IsListEmpty(&pNetRootContext->mounts->head)) { IsListEmpty(&pNetRootContext->mounts.head)) {
RxFreePool(pNetRootContext->mounts);
pNetRootContext->mounts_init = FALSE; pNetRootContext->mounts_init = FALSE;
pVNetRootContext->session = INVALID_HANDLE_VALUE; pVNetRootContext->session = INVALID_HANDLE_VALUE;
} }
@ -3082,7 +3075,6 @@ NTSTATUS nfs41_CreateVNetRoot(
NFS41_MM_POOLTAG_MOUNT); NFS41_MM_POOLTAG_MOUNT);
if (entry == NULL) { if (entry == NULL) {
status = STATUS_INSUFFICIENT_RESOURCES; status = STATUS_INSUFFICIENT_RESOURCES;
RxFreePool(pNetRootContext->mounts);
goto out_free; goto out_free;
} }
entry->authsys_session = entry->gss_session = entry->authsys_session = entry->gss_session =
@ -3098,7 +3090,7 @@ NTSTATUS nfs41_CreateVNetRoot(
entry->gssp_session = pVNetRootContext->session; break; entry->gssp_session = pVNetRootContext->session; break;
} }
RtlCopyLuid(&entry->login_id, &luid); RtlCopyLuid(&entry->login_id, &luid);
nfs41_AddEntry(pNetRootContext->mountLock, pNetRootContext->mounts, entry); nfs41_AddEntry(pNetRootContext->mountLock, &pNetRootContext->mounts, entry);
} else if (!found_matching_flavor) { } else if (!found_matching_flavor) {
ASSERT(existing_mount != NULL); ASSERT(existing_mount != NULL);
/* modify existing mount entry */ /* modify existing mount entry */
@ -3239,8 +3231,8 @@ NTSTATUS nfs41_FinalizeNetRoot(
} }
do { do {
nfs41_GetFirstMountEntry(pNetRootContext->mountLock, nfs41_GetFirstMountEntry(pNetRootContext->mountLock,
pNetRootContext->mounts, mount_tmp); &pNetRootContext->mounts, mount_tmp);
if (mount_tmp == NULL) if (mount_tmp == NULL)
break; break;
#ifdef DEBUG_MOUNT #ifdef DEBUG_MOUNT
@ -3274,13 +3266,12 @@ NTSTATUS nfs41_FinalizeNetRoot(
print_error("nfs41_unmount RPCSEC_GSS_KRB5P failed with %d\n", print_error("nfs41_unmount RPCSEC_GSS_KRB5P failed with %d\n",
status); status);
} }
nfs41_RemoveEntry(pNetRootContext->mountLock, pNetRootContext->mounts, nfs41_RemoveEntry(pNetRootContext->mountLock, &pNetRootContext->mounts,
mount_tmp); mount_tmp);
RxFreePool(mount_tmp); RxFreePool(mount_tmp);
} while (1); } while (1);
/* ignore any errors from unmount */ /* ignore any errors from unmount */
status = STATUS_SUCCESS; status = STATUS_SUCCESS;
RxFreePool(pNetRootContext->mounts);
// check if there is anything waiting in the upcall or downcall queue // check if there is anything waiting in the upcall or downcall queue
do { do {