No need to define __USE_W32API
[reactos.git] / rosapps / ext2 / inode.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: services/fs/ext2/inode.c
5 * PURPOSE: Manipulating inodes
6 * PROGRAMMER: David Welch (welch@cwcom.net)
7 * UPDATE HISTORY:
8 * 26/12/98: Created
9 */
10
11 /* INCLUDES ****************************************************************/
12
13 #include <ntddk.h>
14
15 //#define NDEBUG
16 #include <debug.h>
17
18 #include "ext2fs.h"
19
20 /* FUNCTIONS ***************************************************************/
21
22 struct ext2_group_desc* Ext2LoadGroupDesc(PDEVICE_EXTENSION DeviceExt,
23 ULONG block_group)
24 {
25 struct ext2_group_desc* buffer;
26 ULONG block;
27 struct ext2_group_desc* gdp;
28
29 buffer = ExAllocatePool(NonPagedPool, BLOCKSIZE);
30
31 block = block_group / (BLOCKSIZE / sizeof(struct ext2_group_desc));
32
33 Ext2ReadSectors(DeviceExt->StorageDevice,
34 2 + block,
35 1,
36 buffer);
37
38 gdp = &buffer[block_group % (BLOCKSIZE / sizeof(struct ext2_group_desc))];
39
40 DPRINT("gdp->bg_free_blocks_count %d\n",gdp->bg_free_blocks_count);
41 DPRINT("gdp->bg_inode_table %d\n",gdp->bg_inode_table);
42
43 return(gdp);
44
45 }
46
47 #define INODES_PER_PAGE (PAGE_SIZE / sizeof(struct ext2_inode))
48 #define INODES_PER_BLOCK (BLOCKSIZE / sizeof(struct ext2_inode))
49
50 VOID Ext2LoadInode(PDEVICE_EXTENSION DeviceExt,
51 ULONG ino,
52 PEXT2_INODE Inode)
53 {
54 ULONG block_group;
55 struct ext2_group_desc* gdp;
56 ULONG offset;
57 ULONG dsec;
58 BOOLEAN Uptodate;
59 struct ext2_inode* ibuffer;
60
61 DPRINT("Ext2LoadInode(DeviceExt %x, ino %d, Inode %x)\n",
62 DeviceExt, ino, Inode);
63
64 block_group = (ino - 1) / DeviceExt->superblock->s_inodes_per_group;
65
66 DPRINT("block_group %d\n",block_group);
67
68 gdp = Ext2LoadGroupDesc(DeviceExt, block_group);
69
70 offset = (ino - 1) % DeviceExt->superblock->s_inodes_per_group;
71
72 DPRINT("offset %d\n", offset);
73
74 dsec = (gdp->bg_inode_table + (offset / INODES_PER_BLOCK)) * BLOCKSIZE;
75
76 DPRINT("dsec %d (dsec/BLOCKSIZE) %d PAGE_ROUND_DOWN(dsec) %d\n",
77 dsec, (dsec/BLOCKSIZE), PAGE_ROUND_DOWN(dsec));
78
79 CcRequestCachePage(DeviceExt->Bcb,
80 PAGE_ROUND_DOWN(dsec),
81 &Inode->BaseAddress,
82 &Uptodate,
83 &Inode->CacheSeg);
84 DPRINT("PAGE_ROUND_DOWN(dsec)/BLOCKSIZE %d\n",
85 PAGE_ROUND_DOWN(dsec)/BLOCKSIZE);
86 if (!Uptodate)
87 {
88 Ext2ReadSectors(DeviceExt->StorageDevice,
89 PAGE_ROUND_DOWN(dsec) / BLOCKSIZE,
90 4,
91 Inode->BaseAddress);
92 }
93 ibuffer = ((struct ext2_inode *)Inode->BaseAddress) +
94 (dsec - PAGE_ROUND_DOWN(dsec));
95 DPRINT("Inode->BaseAddress 0x%x ibuffer 0x%x\n",
96 Inode->BaseAddress, ibuffer);
97 Inode->inode = &ibuffer[offset % INODES_PER_PAGE];
98
99 DPRINT("inode->i_uid %d\n",Inode->inode->i_uid);
100 DPRINT("inode->i_links_count %d\n",Inode->inode->i_links_count);
101 DPRINT("inode->i_blocks %d\n",Inode->inode->i_blocks);
102
103 DPRINT("Ext2LoadInode() finished\n");
104 }
105
106 VOID Ext2ReleaseInode(PDEVICE_EXTENSION DeviceExt,
107 PEXT2_INODE Inode)
108 {
109 CcReleaseCachePage(DeviceExt->Bcb,
110 Inode->CacheSeg,
111 TRUE);
112 Inode->CacheSeg = NULL;
113 Inode->BaseAddress = NULL;
114 Inode->inode = NULL;
115 }
116
117 VOID Ext2ReadInode(PDEVICE_EXTENSION DeviceExt,
118 ULONG ino,
119 struct ext2_inode* inode)
120 {
121 ULONG block_group;
122 struct ext2_group_desc* gdp;
123 ULONG offset;
124 struct ext2_inode* buffer;
125
126 DPRINT("Ext2ReadInode(DeviceExt %x, ino %d, inode %x)\n",
127 DeviceExt,ino,inode);
128
129 block_group = (ino - 1) / DeviceExt->superblock->s_inodes_per_group;
130
131 gdp = Ext2LoadGroupDesc(DeviceExt, block_group);
132
133
134
135 offset = (ino - 1) % DeviceExt->superblock->s_inodes_per_group;
136
137 buffer = ExAllocatePool(NonPagedPool, BLOCKSIZE);
138 Ext2ReadSectors(DeviceExt->StorageDevice,
139 gdp->bg_inode_table + (offset / INODES_PER_BLOCK),
140 1,
141 buffer);
142 memcpy(inode,&buffer[offset % INODES_PER_BLOCK],sizeof(struct ext2_inode));
143
144 DPRINT("inode->i_uid %d\n",inode->i_uid);
145 DPRINT("inode->i_links_count %d\n",inode->i_links_count);
146 DPRINT("inode->i_blocks %d\n",inode->i_blocks);
147
148 }