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)
11 /* INCLUDES ****************************************************************/
13 #include <ddk/ntddk.h>
20 /* FUNCTIONS ***************************************************************/
22 struct ext2_group_desc* Ext2LoadGroupDesc(PDEVICE_EXTENSION DeviceExt,
25 struct ext2_group_desc* buffer;
27 struct ext2_group_desc* gdp;
29 buffer = ExAllocatePool(NonPagedPool, BLOCKSIZE);
31 block = block_group / (BLOCKSIZE / sizeof(struct ext2_group_desc));
33 Ext2ReadSectors(DeviceExt->StorageDevice,
38 gdp = &buffer[block_group % (BLOCKSIZE / sizeof(struct ext2_group_desc))];
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);
47 #define INODES_PER_PAGE (PAGE_SIZE / sizeof(struct ext2_inode))
48 #define INODES_PER_BLOCK (BLOCKSIZE / sizeof(struct ext2_inode))
50 VOID Ext2LoadInode(PDEVICE_EXTENSION DeviceExt,
55 struct ext2_group_desc* gdp;
59 struct ext2_inode* ibuffer;
61 DPRINT("Ext2LoadInode(DeviceExt %x, ino %d, Inode %x)\n",
62 DeviceExt, ino, Inode);
64 block_group = (ino - 1) / DeviceExt->superblock->s_inodes_per_group;
66 DPRINT("block_group %d\n",block_group);
68 gdp = Ext2LoadGroupDesc(DeviceExt, block_group);
70 offset = (ino - 1) % DeviceExt->superblock->s_inodes_per_group;
72 DPRINT("offset %d\n", offset);
74 dsec = (gdp->bg_inode_table + (offset / INODES_PER_BLOCK)) * BLOCKSIZE;
76 DPRINT("dsec %d (dsec/BLOCKSIZE) %d PAGE_ROUND_DOWN(dsec) %d\n",
77 dsec, (dsec/BLOCKSIZE), PAGE_ROUND_DOWN(dsec));
79 CcRequestCachePage(DeviceExt->Bcb,
80 PAGE_ROUND_DOWN(dsec),
84 DPRINT("PAGE_ROUND_DOWN(dsec)/BLOCKSIZE %d\n",
85 PAGE_ROUND_DOWN(dsec)/BLOCKSIZE);
88 Ext2ReadSectors(DeviceExt->StorageDevice,
89 PAGE_ROUND_DOWN(dsec) / BLOCKSIZE,
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];
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);
103 DPRINT("Ext2LoadInode() finished\n");
106 VOID Ext2ReleaseInode(PDEVICE_EXTENSION DeviceExt,
109 CcReleaseCachePage(DeviceExt->Bcb,
112 Inode->CacheSeg = NULL;
113 Inode->BaseAddress = NULL;
117 VOID Ext2ReadInode(PDEVICE_EXTENSION DeviceExt,
119 struct ext2_inode* inode)
122 struct ext2_group_desc* gdp;
124 struct ext2_inode* buffer;
126 DPRINT("Ext2ReadInode(DeviceExt %x, ino %d, inode %x)\n",
127 DeviceExt,ino,inode);
129 block_group = (ino - 1) / DeviceExt->superblock->s_inodes_per_group;
131 gdp = Ext2LoadGroupDesc(DeviceExt, block_group);
135 offset = (ino - 1) % DeviceExt->superblock->s_inodes_per_group;
137 buffer = ExAllocatePool(NonPagedPool, BLOCKSIZE);
138 Ext2ReadSectors(DeviceExt->StorageDevice,
139 gdp->bg_inode_table + (offset / INODES_PER_BLOCK),
142 memcpy(inode,&buffer[offset % INODES_PER_BLOCK],sizeof(struct ext2_inode));
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);