static NTSTATUS PvfsSetAllocationWithContext( PVOID pContext ) { NTSTATUS ntError = STATUS_UNSUCCESSFUL; PPVFS_PENDING_SET_ALLOCATION pSetAllocationCtx = (PPVFS_PENDING_SET_ALLOCATION)pContext; PIRP pIrp = pSetAllocationCtx->pIrpContext->pIrp; PPVFS_CCB pCcb = pSetAllocationCtx->pCcb; IRP_ARGS_QUERY_SET_INFORMATION Args = {0}; PFILE_ALLOCATION_INFORMATION pFileInfo = NULL; Args = pSetAllocationCtx->pIrpContext->pIrp->Args.QuerySetInformation; pFileInfo = (PFILE_ALLOCATION_INFORMATION)Args.FileInformation; ntError = PvfsSysFtruncate(pCcb->fd, (off_t)pFileInfo->AllocationSize); BAIL_ON_NT_STATUS(ntError); pIrp->IoStatusBlock.BytesTransferred = sizeof(*pFileInfo); ntError = STATUS_SUCCESS; cleanup: return ntError; error: goto cleanup; }
static NTSTATUS PvfsSetEndOfFileWithContext( PVOID pContext ) { NTSTATUS ntError = STATUS_UNSUCCESSFUL; PPVFS_PENDING_SET_END_OF_FILE pSetEoFCtx = (PPVFS_PENDING_SET_END_OF_FILE)pContext; PIRP pIrp = pSetEoFCtx->pIrpContext->pIrp; PPVFS_CCB pCcb = pSetEoFCtx->pCcb; IRP_ARGS_QUERY_SET_INFORMATION Args = {0}; PFILE_END_OF_FILE_INFORMATION pFileInfo = NULL; Args = pSetEoFCtx->pIrpContext->pIrp->Args.QuerySetInformation; pFileInfo = (PFILE_END_OF_FILE_INFORMATION)Args.FileInformation; ntError = PvfsSysFtruncate(pCcb->fd, (off_t)pFileInfo->EndOfFile); BAIL_ON_NT_STATUS(ntError); pIrp->IoStatusBlock.BytesTransferred = sizeof(*pFileInfo); ntError = STATUS_SUCCESS; PvfsNotifyScheduleFullReport( pCcb->pScb->pOwnerFcb, FILE_NOTIFY_CHANGE_SIZE, FILE_ACTION_MODIFIED, pCcb->pScb->pOwnerFcb->pszFilename); cleanup: return ntError; error: goto cleanup; }
NTSTATUS PvfsCreateFileDoSysOpen( IN PVOID pContext ) { NTSTATUS ntError = STATUS_UNSUCCESSFUL; PPVFS_PENDING_CREATE pCreateContext = (PPVFS_PENDING_CREATE)pContext; PIRP pIrp = pCreateContext->pIrpContext->pIrp; IRP_ARGS_CREATE Args = pIrp->Args.Create; int fd = -1; int unixFlags = 0; PIO_CREATE_SECURITY_CONTEXT pSecCtx = Args.SecurityContext; FILE_CREATE_RESULT CreateResult = 0; PIO_SECURITY_CONTEXT_PROCESS_INFORMATION pProcess = NULL; pProcess = IoSecurityGetProcessInfo(pSecCtx); /* Fail any create that requires setting the security but doesn't have the Unix uid/gid information */ if ((pCreateContext->SetPropertyFlags & PVFS_SET_PROP_SECURITY) && (pProcess == NULL)) { ntError = STATUS_ACCESS_DENIED; BAIL_ON_NT_STATUS(ntError); } ntError = PvfsEnforceShareMode( pCreateContext->pFcb, Args.ShareAccess, pCreateContext->GrantedAccess); BAIL_ON_NT_STATUS(ntError); /* Do the open() */ ntError = MapPosixOpenFlags(&unixFlags, pCreateContext->GrantedAccess, Args); BAIL_ON_NT_STATUS(ntError); do { ntError = PvfsSysOpen( &fd, pCreateContext->pszDiskFilename, unixFlags, (mode_t)gPvfsDriverConfig.CreateFileMode); } while (ntError == STATUS_MORE_PROCESSING_REQUIRED); BAIL_ON_NT_STATUS(ntError); /* Perform preallocation is requested */ if (Args.AllocationSize > 0) { BOOLEAN bAllocate = FALSE; switch (Args.CreateDisposition) { case FILE_SUPERSEDE: case FILE_CREATE: case FILE_OVERWRITE: case FILE_OVERWRITE_IF: bAllocate = TRUE; break; case FILE_OPEN_IF: if (!pCreateContext->bFileExisted) { bAllocate = TRUE; } break; } if (bAllocate) { ntError = PvfsSysFtruncate(fd, (off_t)Args.AllocationSize); BAIL_ON_NT_STATUS(ntError); } } /* Save our state */ pCreateContext->pCcb->fd = fd; pCreateContext->pCcb->ShareFlags = Args.ShareAccess; pCreateContext->pCcb->AccessGranted = pCreateContext->GrantedAccess; pCreateContext->pCcb->CreateOptions = Args.CreateOptions; pCreateContext->pCcb->pszFilename = pCreateContext->pszDiskFilename; pCreateContext->pszDiskFilename = NULL; ntError = PvfsAddCCBToFCB(pCreateContext->pFcb, pCreateContext->pCcb); BAIL_ON_NT_STATUS(ntError); ntError = PvfsSaveFileDeviceInfo(pCreateContext->pCcb); BAIL_ON_NT_STATUS(ntError); /* CCB is now complete */ if ((pCreateContext->SetPropertyFlags & PVFS_SET_PROP_SECURITY) && pSecCtx) { /* Unix Security */ ntError = PvfsSysChown( pCreateContext->pCcb, pProcess->Uid, pProcess->Gid); BAIL_ON_NT_STATUS(ntError); /* Security Descriptor */ ntError = PvfsCreateFileSecurity( pCreateContext->pCcb->pUserToken, pCreateContext->pCcb, Args.SecurityDescriptor, FALSE); BAIL_ON_NT_STATUS(ntError); } if ((pCreateContext->SetPropertyFlags & PVFS_SET_PROP_ATTRIB) && (Args.FileAttributes != 0)) { ntError = PvfsSetFileAttributes( pCreateContext->pCcb, Args.FileAttributes); BAIL_ON_NT_STATUS(ntError); } /* Save the delete-on-close flag to the FCB */ if (Args.CreateOptions & FILE_DELETE_ON_CLOSE) { pCreateContext->pCcb->bPendingDeleteHandle = TRUE; } ntError = PvfsStoreCCB(pIrp->FileHandle, pCreateContext->pCcb); BAIL_ON_NT_STATUS(ntError); PvfsInitializeZctSupport(pCreateContext->pCcb, pIrp->FileHandle); CreateResult = PvfsSetCreateResult( Args.CreateDisposition, pCreateContext->bFileExisted, STATUS_SUCCESS); if (CreateResult == FILE_CREATED) { PvfsNotifyScheduleFullReport( pCreateContext->pCcb->pFcb, FILE_NOTIFY_CHANGE_FILE_NAME, FILE_ACTION_ADDED, pCreateContext->pCcb->pszFilename); } /* The CCB has been handled off to the FileHandle so make sure we don't think we still own it */ pCreateContext->pCcb = NULL; cleanup: pIrp->IoStatusBlock.CreateResult = CreateResult; return ntError; error: CreateResult = PvfsSetCreateResult( Args.CreateDisposition, pCreateContext->bFileExisted, ntError); if (fd != -1) { PSTR pszRemovePath = NULL; /* Pick up where we started the pathname */ pszRemovePath = pCreateContext->pszDiskFilename ? pCreateContext->pszDiskFilename : pCreateContext->pCcb->pszFilename; PvfsCleanupFailedCreate( fd, pszRemovePath, !pCreateContext->bFileExisted); } goto cleanup; }