:pserver:cvsanon@mok.lvcm.com:/CVS/ReactOS reactos
[reactos.git] / drivers / fs / 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 <ddk/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 }