remove whitespace from end of lines
[reactos.git] / reactos / drivers / fs / ext2 / super.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: services/fs/ext2/super.c
5 * PURPOSE: ext2 filesystem
6 * PROGRAMMER: David Welch (welch@mcmail.com)
7 * UPDATE HISTORY:
8 */
9
10 /* INCLUDES *****************************************************************/
11
12 #include <ddk/ntddk.h>
13 #include <rosrtl/string.h>
14
15 //#define NDEBUG
16 #include <debug.h>
17
18 #include "ext2fs.h"
19
20 /* GLOBALS *****************************************************************/
21
22 static PDRIVER_OBJECT DriverObject;
23
24 /* FUNCTIONS ****************************************************************/
25
26 NTSTATUS STDCALL
27 Ext2Close(PDEVICE_OBJECT DeviceObject, PIRP Irp)
28 {
29 PIO_STACK_LOCATION Stack;
30 PFILE_OBJECT FileObject;
31 PDEVICE_EXTENSION DeviceExtension;
32 NTSTATUS Status;
33 PEXT2_FCB Fcb;
34
35 DbgPrint("Ext2Close(DeviceObject %x, Irp %x)\n",DeviceObject,Irp);
36
37 Stack = IoGetCurrentIrpStackLocation(Irp);
38 FileObject = Stack->FileObject;
39 DeviceExtension = DeviceObject->DeviceExtension;
40
41 if (FileObject == DeviceExtension->FileObject)
42 {
43 Status = STATUS_SUCCESS;
44
45 Irp->IoStatus.Status = Status;
46 Irp->IoStatus.Information = 0;
47
48 IoCompleteRequest(Irp, IO_NO_INCREMENT);
49 return(Status);
50 }
51
52 Fcb = (PEXT2_FCB)FileObject->FsContext;
53 if (Fcb != NULL)
54 {
55 if (Fcb->Bcb != NULL)
56 {
57 CcRosReleaseFileCache(FileObject, Fcb->Bcb);
58 }
59 ExFreePool(Fcb);
60 FileObject->FsContext = NULL;
61 }
62
63 Status = STATUS_SUCCESS;
64
65 Irp->IoStatus.Status = Status;
66 Irp->IoStatus.Information = 0;
67
68 IoCompleteRequest(Irp, IO_NO_INCREMENT);
69 return(Status);
70 }
71
72 NTSTATUS Ext2Mount(PDEVICE_OBJECT DeviceToMount)
73 {
74 PDEVICE_OBJECT DeviceObject;
75 PDEVICE_EXTENSION DeviceExt;
76 PVOID BlockBuffer;
77 struct ext2_super_block* superblock;
78
79 DPRINT("Ext2Mount(DeviceToMount %x)\n",DeviceToMount);
80
81 BlockBuffer = ExAllocatePool(NonPagedPool,BLOCKSIZE);
82 Ext2ReadSectors(DeviceToMount,
83 1,
84 1,
85 BlockBuffer);
86 superblock = BlockBuffer;
87
88 if (superblock->s_magic != EXT2_SUPER_MAGIC)
89 {
90 ExFreePool(BlockBuffer);
91 return(STATUS_UNRECOGNIZED_VOLUME);
92 }
93 DPRINT("Volume recognized\n");
94 DPRINT("s_inodes_count %d\n",superblock->s_inodes_count);
95 DPRINT("s_blocks_count %d\n",superblock->s_blocks_count);
96
97 IoCreateDevice(DriverObject,
98 sizeof(DEVICE_EXTENSION),
99 NULL,
100 FILE_DEVICE_FILE_SYSTEM,
101 0,
102 FALSE,
103 &DeviceObject);
104 DPRINT("DeviceObject %x\n",DeviceObject);
105 DeviceObject->Flags = DeviceObject->Flags | DO_DIRECT_IO;
106 DeviceExt = (PVOID)DeviceObject->DeviceExtension;
107 DPRINT("DeviceExt %x\n",DeviceExt);
108
109 DeviceExt->StorageDevice = DeviceToMount;
110 DeviceExt->StorageDevice->Vpb->DeviceObject = DeviceObject;
111 DeviceExt->StorageDevice->Vpb->RealDevice = DeviceExt->StorageDevice;
112 DeviceExt->StorageDevice->Vpb->Flags |= VPB_MOUNTED;
113 DeviceObject->StackSize = DeviceExt->StorageDevice->StackSize + 1;
114 DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
115
116 DPRINT("DeviceExt->StorageDevice %x\n", DeviceExt->StorageDevice);
117 DeviceExt->FileObject = IoCreateStreamFileObject(NULL, DeviceObject);
118 DeviceExt->superblock = superblock;
119 CcRosInitializeFileCache(DeviceExt->FileObject,
120 &DeviceExt->Bcb,
121 PAGE_SIZE * 3);
122
123 DPRINT("Ext2Mount() = STATUS_SUCCESS\n");
124
125 return(STATUS_SUCCESS);
126 }
127
128 NTSTATUS STDCALL
129 Ext2FileSystemControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
130 {
131 PIO_STACK_LOCATION Stack = IoGetCurrentIrpStackLocation(Irp);
132 PVPB vpb = Stack->Parameters.Mount.Vpb;
133 PDEVICE_OBJECT DeviceToMount = Stack->Parameters.Mount.DeviceObject;
134 NTSTATUS Status;
135
136 Status = Ext2Mount(DeviceToMount);
137
138 Irp->IoStatus.Status = Status;
139 Irp->IoStatus.Information = 0;
140
141 IoCompleteRequest(Irp, IO_NO_INCREMENT);
142 return(Status);
143 }
144
145 NTSTATUS STDCALL
146 DriverEntry(PDRIVER_OBJECT _DriverObject,
147 PUNICODE_STRING RegistryPath)
148 /*
149 * FUNCTION: Called by the system to initalize the driver
150 * ARGUMENTS:
151 * DriverObject = object describing this driver
152 * RegistryPath = path to our configuration entries
153 * RETURNS: Success or failure
154 */
155 {
156 PDEVICE_OBJECT DeviceObject;
157 NTSTATUS ret;
158 UNICODE_STRING DeviceName = ROS_STRING_INITIALIZER(L"\\Device\\Ext2Fsd");
159
160 DbgPrint("Ext2 FSD 0.0.1\n");
161
162 DriverObject = _DriverObject;
163
164 ret = IoCreateDevice(DriverObject,
165 0,
166 &DeviceName,
167 FILE_DEVICE_FILE_SYSTEM,
168 0,
169 FALSE,
170 &DeviceObject);
171 if (ret!=STATUS_SUCCESS)
172 {
173 return(ret);
174 }
175
176 DeviceObject->Flags=0;
177 DriverObject->MajorFunction[IRP_MJ_CLOSE] = Ext2Close;
178 DriverObject->MajorFunction[IRP_MJ_CREATE] = Ext2Create;
179 DriverObject->MajorFunction[IRP_MJ_READ] = Ext2Read;
180 DriverObject->MajorFunction[IRP_MJ_WRITE] = Ext2Write;
181 DriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] =
182 Ext2FileSystemControl;
183 DriverObject->MajorFunction[IRP_MJ_DIRECTORY_CONTROL] =
184 Ext2DirectoryControl;
185 DriverObject->MajorFunction[IRP_MJ_QUERY_INFORMATION] =
186 Ext2QueryInformation;
187 DriverObject->MajorFunction[IRP_MJ_SET_INFORMATION] = Ext2SetInformation;
188 DriverObject->MajorFunction[IRP_MJ_FLUSH_BUFFERS] = Ext2FlushBuffers;
189 DriverObject->MajorFunction[IRP_MJ_SHUTDOWN] = Ext2Shutdown;
190 DriverObject->MajorFunction[IRP_MJ_CLEANUP] = Ext2Cleanup;
191 DriverObject->MajorFunction[IRP_MJ_QUERY_SECURITY] = Ext2QuerySecurity;
192 DriverObject->MajorFunction[IRP_MJ_SET_SECURITY] = Ext2SetSecurity;
193 DriverObject->MajorFunction[IRP_MJ_QUERY_QUOTA] = Ext2QueryQuota;
194 DriverObject->MajorFunction[IRP_MJ_SET_QUOTA] = Ext2SetQuota;
195
196 DriverObject->DriverUnload = NULL;
197
198 IoRegisterFileSystem(DeviceObject);
199
200 return(STATUS_SUCCESS);
201 }
202