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
);