xref: /reactos/sdk/lib/fslib/ext2lib/Group.c (revision 1734f297)
1 /*
2  * PROJECT:          Mke2fs
3  * FILE:             Group.c
4  * PROGRAMMER:       Matt Wu <mattwu@163.com>
5  * HOMEPAGE:         http://ext2.yeah.net
6  */
7 
8 /* INCLUDES **************************************************************/
9 
10 #include "Mke2fs.h"
11 
12 /* DEFINITIONS ***********************************************************/
13 
14 /* FUNCTIONS *************************************************************/
15 
16 int test_root(int a, int b)
17 {
18     if (a == 0)
19         return 1;
20     while (1)
21     {
22         if (a == 1)
23             return 1;
24         if (a % b)
25             return 0;
26         a = a / b;
27     }
28 }
29 
30 bool ext2_bg_has_super(PEXT2_SUPER_BLOCK pExt2Sb, int group_block)
31 {
32     if (!(pExt2Sb->s_feature_ro_compat & EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER))
33         return true;
34 
35     if (test_root(group_block, 3) || (test_root(group_block, 5)) ||
36         test_root(group_block, 7))
37         return true;
38 
39     return false;
40 }
41 
42 
43 bool ext2_allocate_group_desc(PEXT2_FILESYS Ext2Sys)
44 {
45     ULONG size;
46 
47     size = Ext2Sys->desc_blocks * Ext2Sys->blocksize;
48 
49     Ext2Sys->group_desc =
50         (PEXT2_GROUP_DESC)RtlAllocateHeap(RtlGetProcessHeap(), 0, size);
51 
52     if (Ext2Sys->group_desc)
53     {
54         memset(Ext2Sys->group_desc, 0, size);
55         return true;
56     }
57 
58     return false;
59 }
60 
61 void ext2_free_group_desc(PEXT2_FILESYS Ext2Sys)
62 {
63     if (Ext2Sys->group_desc)
64     {
65         RtlFreeHeap(RtlGetProcessHeap(), 0, Ext2Sys->group_desc);
66         Ext2Sys->group_desc = NULL;
67     }
68 }
69