REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3737 Apply uncrustify changes to .c/.h files in the OvmfPkg package Cc: Andrew Fish <afish@apple.com> Cc: Leif Lindholm <leif@nuviainc.com> Cc: Michael D Kinney <michael.d.kinney@intel.com> Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com> Reviewed-by: Andrew Fish <afish@apple.com>
		
			
				
	
	
		
			85 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  EFI_FILE_PROTOCOL.Write() member function for the Virtio Filesystem driver.
 | 
						|
 | 
						|
  Copyright (C) 2020, Red Hat, Inc.
 | 
						|
 | 
						|
  SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
						|
**/
 | 
						|
 | 
						|
#include "VirtioFsDxe.h"
 | 
						|
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
VirtioFsSimpleFileWrite (
 | 
						|
  IN     EFI_FILE_PROTOCOL  *This,
 | 
						|
  IN OUT UINTN              *BufferSize,
 | 
						|
  IN     VOID               *Buffer
 | 
						|
  )
 | 
						|
{
 | 
						|
  VIRTIO_FS_FILE  *VirtioFsFile;
 | 
						|
  VIRTIO_FS       *VirtioFs;
 | 
						|
  EFI_STATUS      Status;
 | 
						|
  UINTN           Transferred;
 | 
						|
  UINTN           Left;
 | 
						|
 | 
						|
  VirtioFsFile = VIRTIO_FS_FILE_FROM_SIMPLE_FILE (This);
 | 
						|
  VirtioFs     = VirtioFsFile->OwnerFs;
 | 
						|
 | 
						|
  if (VirtioFsFile->IsDirectory) {
 | 
						|
    return EFI_UNSUPPORTED;
 | 
						|
  }
 | 
						|
 | 
						|
  if (!VirtioFsFile->IsOpenForWriting) {
 | 
						|
    return EFI_ACCESS_DENIED;
 | 
						|
  }
 | 
						|
 | 
						|
  Status      = EFI_SUCCESS;
 | 
						|
  Transferred = 0;
 | 
						|
  Left        = *BufferSize;
 | 
						|
  while (Left > 0) {
 | 
						|
    UINT32  WriteSize;
 | 
						|
 | 
						|
    //
 | 
						|
    // Honor the write buffer size limit.
 | 
						|
    //
 | 
						|
    WriteSize = (UINT32)MIN ((UINTN)VirtioFs->MaxWrite, Left);
 | 
						|
    Status    = VirtioFsFuseWrite (
 | 
						|
                  VirtioFs,
 | 
						|
                  VirtioFsFile->NodeId,
 | 
						|
                  VirtioFsFile->FuseHandle,
 | 
						|
                  VirtioFsFile->FilePosition + Transferred,
 | 
						|
                  &WriteSize,
 | 
						|
                  (UINT8 *)Buffer + Transferred
 | 
						|
                  );
 | 
						|
    if (!EFI_ERROR (Status) && (WriteSize == 0)) {
 | 
						|
      //
 | 
						|
      // Progress should have been made.
 | 
						|
      //
 | 
						|
      Status = EFI_DEVICE_ERROR;
 | 
						|
    }
 | 
						|
 | 
						|
    if (EFI_ERROR (Status)) {
 | 
						|
      break;
 | 
						|
    }
 | 
						|
 | 
						|
    Transferred += WriteSize;
 | 
						|
    Left        -= WriteSize;
 | 
						|
  }
 | 
						|
 | 
						|
  *BufferSize                 = Transferred;
 | 
						|
  VirtioFsFile->FilePosition += Transferred;
 | 
						|
  //
 | 
						|
  // According to the UEFI spec,
 | 
						|
  //
 | 
						|
  // - 'Partial writes only occur when there has been a data error during the
 | 
						|
  //    write attempt (such as "file space full")', and
 | 
						|
  //
 | 
						|
  // - (as an example) EFI_VOLUME_FULL is returned when 'The volume is full'.
 | 
						|
  //
 | 
						|
  // These together imply that after a partial write, we have to return an
 | 
						|
  // error. In other words, (Transferred > 0) is inconsequential for the return
 | 
						|
  // value.
 | 
						|
  //
 | 
						|
  return Status;
 | 
						|
}
 |