ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

flush.c
Go to the documentation of this file.
00001 /*
00002  * COPYRIGHT:        See COPYING in the top level directory
00003  * PROJECT:          ReactOS kernel
00004  * FILE:             drivers/fs/vfat/flush.c
00005  * PURPOSE:          VFAT Filesystem
00006  * PROGRAMMER:
00007  */
00008 
00009 /* INCLUDES *****************************************************************/
00010 
00011 #define NDEBUG
00012 #include "vfat.h"
00013 
00014 /* FUNCTIONS ****************************************************************/
00015 
00016 static NTSTATUS VfatFlushFile(PDEVICE_EXTENSION DeviceExt, PVFATFCB Fcb)
00017 {
00018    IO_STATUS_BLOCK IoStatus;
00019    NTSTATUS Status;
00020 
00021    DPRINT("VfatFlushFile(DeviceExt %p, Fcb %p) for '%wZ'\n", DeviceExt, Fcb, &Fcb->PathNameU);
00022 
00023    CcFlushCache(&Fcb->SectionObjectPointers, NULL, 0, &IoStatus);
00024    if (IoStatus.Status == STATUS_INVALID_PARAMETER)
00025    {
00026       /* FIXME: Caching was possible not initialized */
00027       IoStatus.Status = STATUS_SUCCESS;
00028    }
00029    if (Fcb->Flags & FCB_IS_DIRTY)
00030      {
00031        Status = VfatUpdateEntry(Fcb);
00032        if (!NT_SUCCESS(Status))
00033          {
00034        IoStatus.Status = Status;
00035      }
00036      }
00037    return IoStatus.Status;
00038 }
00039 
00040 NTSTATUS VfatFlushVolume(PDEVICE_EXTENSION DeviceExt, PVFATFCB VolumeFcb)
00041 {
00042    PLIST_ENTRY ListEntry;
00043    PVFATFCB Fcb;
00044    NTSTATUS Status, ReturnStatus = STATUS_SUCCESS;
00045 
00046    DPRINT("VfatFlushVolume(DeviceExt %p, FatFcb %p)\n", DeviceExt, VolumeFcb);
00047 
00048    ListEntry = DeviceExt->FcbListHead.Flink;
00049    while (ListEntry != &DeviceExt->FcbListHead)
00050      {
00051        Fcb = CONTAINING_RECORD(ListEntry, VFATFCB, FcbListEntry);
00052        ListEntry = ListEntry->Flink;
00053        if (!vfatFCBIsDirectory(Fcb))
00054          {
00055            ExAcquireResourceExclusiveLite(&Fcb->MainResource, TRUE);
00056            Status = VfatFlushFile(DeviceExt, Fcb);
00057            ExReleaseResourceLite (&Fcb->MainResource);
00058            if (!NT_SUCCESS(Status))
00059              {
00060                DPRINT1("VfatFlushFile failed, status = %x\n", Status);
00061            ReturnStatus = Status;
00062              }
00063      }
00064        /* FIXME: Stop flushing if this is a removable media and the media was removed */
00065      }
00066    ListEntry = DeviceExt->FcbListHead.Flink;
00067    while (ListEntry != &DeviceExt->FcbListHead)
00068      {
00069        Fcb = CONTAINING_RECORD(ListEntry, VFATFCB, FcbListEntry);
00070        ListEntry = ListEntry->Flink;
00071        if (vfatFCBIsDirectory(Fcb))
00072          {
00073            ExAcquireResourceExclusiveLite(&Fcb->MainResource, TRUE);
00074            Status = VfatFlushFile(DeviceExt, Fcb);
00075            ExReleaseResourceLite (&Fcb->MainResource);
00076            if (!NT_SUCCESS(Status))
00077              {
00078                DPRINT1("VfatFlushFile failed, status = %x\n", Status);
00079            ReturnStatus = Status;
00080              }
00081      }
00082        /* FIXME: Stop flushing if this is a removable media and the media was removed */
00083      }
00084 
00085    Fcb = (PVFATFCB) DeviceExt->FATFileObject->FsContext;
00086 
00087    ExAcquireResourceExclusiveLite(&DeviceExt->FatResource, TRUE);
00088    Status = VfatFlushFile(DeviceExt, Fcb);
00089    ExReleaseResourceLite(&DeviceExt->FatResource);
00090 
00091    /* FIXME: Flush the buffers from storage device */
00092 
00093    if (!NT_SUCCESS(Status))
00094    {
00095       DPRINT1("VfatFlushFile failed, status = %x\n", Status);
00096       ReturnStatus = Status;
00097    }
00098 
00099    return ReturnStatus;
00100 }
00101 
00102 NTSTATUS VfatFlush(PVFAT_IRP_CONTEXT IrpContext)
00103 {
00104   NTSTATUS Status;
00105   PVFATFCB Fcb;
00106   /*
00107    * This request is not allowed on the main device object.
00108    */
00109   if (IrpContext->DeviceObject == VfatGlobalData->DeviceObject)
00110   {
00111      Status = STATUS_INVALID_DEVICE_REQUEST;
00112      goto ByeBye;
00113   }
00114 
00115   Fcb = (PVFATFCB)IrpContext->FileObject->FsContext;
00116   ASSERT(Fcb);
00117 
00118   if (Fcb->Flags & FCB_IS_VOLUME)
00119   {
00120      ExAcquireResourceExclusiveLite(&IrpContext->DeviceExt->DirResource, TRUE);
00121      Status = VfatFlushVolume(IrpContext->DeviceExt, Fcb);
00122      ExReleaseResourceLite(&IrpContext->DeviceExt->DirResource);
00123   }
00124   else
00125   {
00126      ExAcquireResourceExclusiveLite(&Fcb->MainResource, TRUE);
00127      Status = VfatFlushFile(IrpContext->DeviceExt, Fcb);
00128      ExReleaseResourceLite (&Fcb->MainResource);
00129   }
00130 
00131 ByeBye:
00132   IrpContext->Irp->IoStatus.Status = Status;
00133   IrpContext->Irp->IoStatus.Information = 0;
00134   IoCompleteRequest (IrpContext->Irp, IO_NO_INCREMENT);
00135   VfatFreeIrpContext(IrpContext);
00136 
00137   return (Status);
00138 }
00139 
00140 /* EOF */

Generated on Sat May 26 2012 04:26:19 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.