[BTRFS]
[reactos.git] / reactos / drivers / filesystems / btrfs / fastio.c
index acb13a1..2b0608d 100644 (file)
@@ -15,7 +15,6 @@
  * You should have received a copy of the GNU Lesser General Public Licence
  * along with WinBtrfs.  If not, see <http://www.gnu.org/licenses/>. */
 
-#include <ntifs.h>
 #include "btrfs_drv.h"
 
 FAST_IO_DISPATCH FastIoDispatch;
@@ -28,20 +27,128 @@ static void STDCALL release_file_for_create_section(PFILE_OBJECT FileObject) {
     TRACE("STUB: release_file_for_create_section\n");
 }
 
-static BOOLEAN STDCALL fast_query_basic_info(PFILE_OBJECT FileObject, BOOLEAN wait, PFILE_BASIC_INFORMATION buf,
-                                     PIO_STATUS_BLOCK IoStatus, PDEVICE_OBJECT DeviceObject) {
+static BOOLEAN STDCALL fast_query_basic_info(PFILE_OBJECT FileObject, BOOLEAN wait, PFILE_BASIC_INFORMATION fbi,
+                                             PIO_STATUS_BLOCK IoStatus, PDEVICE_OBJECT DeviceObject) {
+    fcb* fcb;
+    ccb* ccb;
     
-    TRACE("STUB: fast_query_basic_info\n");
+    TRACE("(%p, %u, %p, %p, %p)\n", FileObject, wait, fbi, IoStatus, DeviceObject);
     
-    return FALSE;
+    if (!FileObject)
+        return FALSE;
+    
+    fcb = FileObject->FsContext;
+    
+    if (!fcb)
+        return FALSE;
+    
+    ccb = FileObject->FsContext2;
+    
+    if (!ccb)
+        return FALSE;
+    
+    if (!(ccb->access & (FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES)))
+        return FALSE;
+    
+    if (fcb->ads) {
+        if (!ccb || !ccb->fileref || !ccb->fileref->parent || !ccb->fileref->parent->fcb)
+            return FALSE;
+        
+        fcb = ccb->fileref->parent->fcb;
+    }
+    
+    FsRtlEnterFileSystem();
+    
+    if (!ExAcquireResourceSharedLite(fcb->Header.Resource, wait)) {
+        FsRtlExitFileSystem();
+        return FALSE;
+    }
+
+    fbi->CreationTime.QuadPart = unix_time_to_win(&fcb->inode_item.otime);
+    fbi->LastAccessTime.QuadPart = unix_time_to_win(&fcb->inode_item.st_atime);
+    fbi->LastWriteTime.QuadPart = unix_time_to_win(&fcb->inode_item.st_mtime);
+    fbi->ChangeTime.QuadPart = unix_time_to_win(&fcb->inode_item.st_ctime);
+    fbi->FileAttributes = fcb->atts;
+
+    IoStatus->Status = STATUS_SUCCESS;
+    IoStatus->Information = sizeof(FILE_BASIC_INFORMATION);
+    
+    ExReleaseResourceLite(fcb->Header.Resource);
+
+    FsRtlExitFileSystem();
+    
+    return TRUE;
 }
 
-static BOOLEAN STDCALL fast_query_standard_info(PFILE_OBJECT FileObject, BOOLEAN wait, PFILE_STANDARD_INFORMATION buf,
-                                     PIO_STATUS_BLOCK IoStatus, PDEVICE_OBJECT DeviceObject) {
+static BOOLEAN STDCALL fast_query_standard_info(PFILE_OBJECT FileObject, BOOLEAN wait, PFILE_STANDARD_INFORMATION fsi,
+                                                PIO_STATUS_BLOCK IoStatus, PDEVICE_OBJECT DeviceObject) {
+    fcb* fcb;
+    ccb* ccb;
+    BOOL ads;
+    ULONG adssize;
     
-    TRACE("STUB: fast_query_standard_info\n");
+    TRACE("(%p, %u, %p, %p, %p)\n", FileObject, wait, fsi, IoStatus, DeviceObject);
     
-    return FALSE;
+    if (!FileObject)
+        return FALSE;
+    
+    fcb = FileObject->FsContext;
+    ccb = FileObject->FsContext2;
+    
+    if (!fcb)
+        return FALSE;
+    
+    FsRtlEnterFileSystem();
+    
+    if (!ExAcquireResourceSharedLite(fcb->Header.Resource, wait)) {
+        FsRtlExitFileSystem();
+        return FALSE;
+    }
+    
+    ads = fcb->ads;
+    
+    if (ads) {
+        struct _fcb* fcb2;
+        
+        if (!ccb || !ccb->fileref || !ccb->fileref->parent || !ccb->fileref->parent->fcb) {
+            ExReleaseResourceLite(fcb->Header.Resource);
+            FsRtlExitFileSystem();
+            return FALSE;
+        }
+        
+        adssize = fcb->adsdata.Length;
+        
+        fcb2 = ccb->fileref->parent->fcb;
+        
+        ExReleaseResourceLite(fcb->Header.Resource);
+        
+        fcb = fcb2;
+        
+        if (!ExAcquireResourceSharedLite(fcb->Header.Resource, wait)) {
+            FsRtlExitFileSystem();
+            return FALSE;
+        }
+
+        fsi->AllocationSize.QuadPart = fsi->EndOfFile.QuadPart = adssize;
+        fsi->NumberOfLinks = fcb->inode_item.st_nlink;
+        fsi->Directory = S_ISDIR(fcb->inode_item.st_mode);
+    } else {
+        fsi->AllocationSize.QuadPart = S_ISDIR(fcb->inode_item.st_mode) ? 0 : sector_align(fcb->inode_item.st_size, fcb->Vcb->superblock.sector_size);
+        fsi->EndOfFile.QuadPart = S_ISDIR(fcb->inode_item.st_mode) ? 0 : fcb->inode_item.st_size;
+        fsi->NumberOfLinks = fcb->inode_item.st_nlink;
+        fsi->Directory = S_ISDIR(fcb->inode_item.st_mode);
+    }
+    
+    fsi->DeletePending = ccb->fileref ? ccb->fileref->delete_on_close : FALSE;
+
+    IoStatus->Status = STATUS_SUCCESS;
+    IoStatus->Information = sizeof(FILE_STANDARD_INFORMATION);
+    
+    ExReleaseResourceLite(fcb->Header.Resource);
+
+    FsRtlExitFileSystem();
+    
+    return TRUE;
 }
 
 static BOOLEAN STDCALL fast_io_query_open(PIRP Irp, PFILE_NETWORK_OPEN_INFORMATION  NetworkInformation, PDEVICE_OBJECT DeviceObject) {
@@ -105,9 +212,22 @@ static BOOLEAN STDCALL fast_io_query_network_open_info(PFILE_OBJECT FileObject,
     return FALSE;
 }
 
-static NTSTATUS STDCALL fast_io_acquire_for_mod_write(PFILE_OBJECT FileObject, PLARGE_INTEGER EndingOffset, struct _ERESOURCE **ResourceToRelease, PDEVICE_OBJECT DeviceObject){
-    TRACE("STUB: fast_io_acquire_for_mod_write\n");
-    return STATUS_NOT_IMPLEMENTED;
+static NTSTATUS STDCALL fast_io_acquire_for_mod_write(PFILE_OBJECT FileObject, PLARGE_INTEGER EndingOffset, struct _ERESOURCE **ResourceToRelease, PDEVICE_OBJECT DeviceObject) {
+    fcb* fcb;
+    
+    TRACE("(%p, %llx, %p, %p)\n", FileObject, EndingOffset->QuadPart, ResourceToRelease, DeviceObject);
+    
+    fcb = FileObject->FsContext;
+    
+    if (!fcb)
+        return STATUS_INVALID_PARAMETER;
+    
+    *ResourceToRelease = fcb->Header.PagingIoResource;
+    
+    if (!ExAcquireResourceSharedLite(*ResourceToRelease, FALSE))
+        return STATUS_CANT_WAIT;
+    
+    return STATUS_SUCCESS;
 }
 
 static BOOLEAN STDCALL fast_io_read_compressed(PFILE_OBJECT FileObject, PLARGE_INTEGER FileOffset, ULONG Length, ULONG LockKey, PVOID Buffer, PMDL *MdlChain, PIO_STATUS_BLOCK IoStatus, struct _COMPRESSED_DATA_INFO *CompressedDataInfo, ULONG CompressedDataInfoLength, PDEVICE_OBJECT DeviceObject){
@@ -137,22 +257,58 @@ static NTSTATUS STDCALL fast_io_release_for_mod_write(PFILE_OBJECT FileObject, s
 
 static NTSTATUS STDCALL fast_io_acquire_for_ccflush(PFILE_OBJECT FileObject, PDEVICE_OBJECT DeviceObject){
     TRACE("STUB: fast_io_acquire_for_ccflush\n");
-    return STATUS_NOT_IMPLEMENTED;
+    return STATUS_SUCCESS;
 }
 
 static NTSTATUS STDCALL fast_io_release_for_ccflush(PFILE_OBJECT FileObject, PDEVICE_OBJECT DeviceObject){
     TRACE("STUB: fast_io_release_for_ccflush\n");
-    return STATUS_NOT_IMPLEMENTED;
+    return STATUS_SUCCESS;
+}
+
+#ifdef DEBUG
+static BOOLEAN STDCALL fast_io_read(PFILE_OBJECT FileObject, PLARGE_INTEGER FileOffset, ULONG Length, BOOLEAN Wait, ULONG LockKey, PVOID Buffer, PIO_STATUS_BLOCK IoStatus, PDEVICE_OBJECT DeviceObject) {
+    TRACE("(%p, %p, %x, %x, %x, %p, %p, %p)\n", FileObject, FileOffset, Length, Wait, LockKey, Buffer, IoStatus, DeviceObject);
+
+    return FsRtlCopyRead(FileObject, FileOffset, Length, Wait, LockKey, Buffer, IoStatus, DeviceObject);
+}
+
+static BOOLEAN STDCALL fast_io_write(PFILE_OBJECT FileObject, PLARGE_INTEGER FileOffset, ULONG Length, BOOLEAN Wait, ULONG LockKey, PVOID Buffer, PIO_STATUS_BLOCK IoStatus, PDEVICE_OBJECT DeviceObject) {
+    TRACE("(%p, %p, %x, %x, %x, %p, %p, %p)\n", FileObject, FileOffset, Length, Wait, LockKey, Buffer, IoStatus, DeviceObject);
+
+    return FsRtlCopyWrite(FileObject, FileOffset, Length, Wait, LockKey, Buffer, IoStatus, DeviceObject);
+}
+
+static BOOLEAN STDCALL fast_io_mdl_read(PFILE_OBJECT FileObject, PLARGE_INTEGER FileOffset, ULONG Length, ULONG LockKey, PMDL* MdlChain, PIO_STATUS_BLOCK IoStatus, PDEVICE_OBJECT DeviceObject) {
+    TRACE("(%p, %p, %x, %x, %p, %p, %p)\n", FileObject, FileOffset, Length, LockKey, MdlChain, IoStatus, DeviceObject);
+
+    return FsRtlMdlReadDev(FileObject, FileOffset, Length, LockKey, MdlChain, IoStatus, DeviceObject);
+}
+
+static BOOLEAN STDCALL fast_io_mdl_read_complete(PFILE_OBJECT FileObject, PMDL* MdlChain, PDEVICE_OBJECT DeviceObject) {
+    TRACE("(%p, %p, %p)\n", FileObject, MdlChain, DeviceObject);
+
+    return FsRtlMdlReadCompleteDev(FileObject, MdlChain, DeviceObject);
+}
+
+static BOOLEAN STDCALL fast_io_prepare_mdl_write(PFILE_OBJECT FileObject, PLARGE_INTEGER FileOffset, ULONG Length, ULONG LockKey, PMDL* MdlChain, PIO_STATUS_BLOCK IoStatus, PDEVICE_OBJECT DeviceObject) {
+    TRACE("(%p, %p, %x, %x, %p, %p, %p)\n", FileObject, FileOffset, Length, LockKey, MdlChain, IoStatus, DeviceObject);
+
+    return FsRtlPrepareMdlWriteDev(FileObject, FileOffset, Length, LockKey, MdlChain, IoStatus, DeviceObject);
 }
 
+static BOOLEAN STDCALL fast_io_mdl_write_complete(PFILE_OBJECT FileObject, PLARGE_INTEGER FileOffset, PMDL* MdlChain, PDEVICE_OBJECT DeviceObject) {
+    TRACE("(%p, %p, %p, %p)\n", FileObject, FileOffset, MdlChain, DeviceObject);
+
+    return FsRtlMdlWriteCompleteDev(FileObject, FileOffset, MdlChain, DeviceObject);
+}
+#endif
+
 void __stdcall init_fast_io_dispatch(FAST_IO_DISPATCH** fiod) {
     RtlZeroMemory(&FastIoDispatch, sizeof(FastIoDispatch));
 
     FastIoDispatch.SizeOfFastIoDispatch = sizeof(FAST_IO_DISPATCH);
 
     FastIoDispatch.FastIoCheckIfPossible = fast_io_check_if_possible;
-    FastIoDispatch.FastIoRead = FsRtlCopyRead;
-    FastIoDispatch.FastIoWrite = FsRtlCopyWrite;
     FastIoDispatch.FastIoQueryBasicInfo = fast_query_basic_info;
     FastIoDispatch.FastIoQueryStandardInfo = fast_query_standard_info;
     FastIoDispatch.FastIoLock = fast_io_lock;
@@ -165,10 +321,6 @@ void __stdcall init_fast_io_dispatch(FAST_IO_DISPATCH** fiod) {
     FastIoDispatch.FastIoDetachDevice = fast_io_detach_device;
     FastIoDispatch.FastIoQueryNetworkOpenInfo = fast_io_query_network_open_info;
     FastIoDispatch.AcquireForModWrite = fast_io_acquire_for_mod_write;
-    FastIoDispatch.MdlRead = FsRtlMdlReadDev;
-    FastIoDispatch.MdlReadComplete = FsRtlMdlReadCompleteDev;
-    FastIoDispatch.PrepareMdlWrite = FsRtlPrepareMdlWriteDev;
-    FastIoDispatch.MdlWriteComplete = FsRtlMdlWriteCompleteDev;
     FastIoDispatch.FastIoReadCompressed = fast_io_read_compressed;
     FastIoDispatch.FastIoWriteCompressed = fast_io_write_compressed;
     FastIoDispatch.MdlReadCompleteCompressed = fast_io_mdl_read_complete_compressed;
@@ -178,5 +330,21 @@ void __stdcall init_fast_io_dispatch(FAST_IO_DISPATCH** fiod) {
     FastIoDispatch.AcquireForCcFlush = fast_io_acquire_for_ccflush;
     FastIoDispatch.ReleaseForCcFlush = fast_io_release_for_ccflush;
     
+#ifdef DEBUG
+    FastIoDispatch.FastIoRead = fast_io_read;
+    FastIoDispatch.FastIoWrite = fast_io_write;
+    FastIoDispatch.MdlRead = fast_io_mdl_read;
+    FastIoDispatch.MdlReadComplete = fast_io_mdl_read_complete;
+    FastIoDispatch.PrepareMdlWrite = fast_io_prepare_mdl_write;
+    FastIoDispatch.MdlWriteComplete = fast_io_mdl_write_complete;
+#else
+    FastIoDispatch.FastIoRead = FsRtlCopyRead;
+    FastIoDispatch.FastIoWrite = FsRtlCopyWrite;
+    FastIoDispatch.MdlRead = FsRtlMdlReadDev;
+    FastIoDispatch.MdlReadComplete = FsRtlMdlReadCompleteDev;
+    FastIoDispatch.PrepareMdlWrite = FsRtlPrepareMdlWriteDev;
+    FastIoDispatch.MdlWriteComplete = FsRtlMdlWriteCompleteDev;
+#endif
+    
     *fiod = &FastIoDispatch;
-}
\ No newline at end of file
+}