Block cache metadata staticly alocated.
[lwext4.git] / lwext4 / ext4_bitmap.c
1 /*
2  * Copyright (c) 2013 Grzegorz Kostka (kostka.grzegorz@gmail.com)
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * - Redistributions of source code must retain the above copyright
10  *   notice, this list of conditions and the following disclaimer.
11  * - Redistributions in binary form must reproduce the above copyright
12  *   notice, this list of conditions and the following disclaimer in the
13  *   documentation and/or other materials provided with the distribution.
14  * - The name of the author may not be used to endorse or promote products
15  *   derived from this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28
29 /** @addtogroup lwext4
30  * @{
31  */
32 /**
33  * @file  ext4_bitmap.c
34  * @brief Block/inode bitmap allocator.
35  */
36
37 #include <ext4_config.h>
38 #include <ext4_bitmap.h>
39
40 #include <ext4_errno.h>
41
42
43 void ext4_bmap_bits_free(uint8_t *bmap, uint32_t sbit, uint32_t bcnt)
44 {
45     uint32_t i = sbit;
46
47     while(i & 7){
48
49         if(!bcnt)
50             return;
51
52         ext4_bmap_bit_clr(bmap, i);
53
54         bcnt--;
55         i++;
56     }
57     sbit  = i;
58     bmap += (sbit >> 3);
59
60     while(bcnt >= 32){
61         *(uint32_t *)bmap = 0;
62         bmap += 4;
63         bcnt -= 32;
64         sbit += 32;
65     }
66
67     while(bcnt >= 16){
68         *(uint16_t *)bmap = 0;
69         bmap += 2;
70         bcnt -= 16;
71         sbit += 16;
72     }
73
74     while(bcnt >= 8){
75         *bmap = 0;
76         bmap += 1;
77         bcnt -= 8;
78         sbit += 8;
79     }
80
81     for (i = 0; i < bcnt; ++i) {
82         ext4_bmap_bit_clr(bmap, i);
83     }
84 }
85
86
87
88 int ext4_bmap_bit_find_clr(uint8_t *bmap, uint32_t sbit, uint32_t ebit,
89     uint32_t *bit_id)
90 {
91     uint32_t i;
92     uint32_t bcnt = ebit - sbit;
93
94     i = sbit;
95
96     while(i & 7){
97
98         if(!bcnt)
99             return ENOSPC;
100
101         if(ext4_bmap_is_bit_clr(bmap, i)){
102             *bit_id = sbit;
103             return EOK;
104         }
105
106         i++;
107         bcnt--;
108     }
109
110     sbit  = i;
111     bmap += (sbit >> 3);
112
113
114     while(bcnt >= 32){
115         if(*(uint32_t *)bmap != 0xFFFFFFFF)
116             goto finish_it;
117
118         bmap += 4;
119         bcnt -= 32;
120         sbit += 32;
121     }
122
123     while(bcnt >= 16){
124         if(*(uint16_t *)bmap != 0xFFFF)
125             goto finish_it;
126
127         bmap += 2;
128         bcnt -= 16;
129         sbit += 16;
130     }
131
132     finish_it:
133     while(bcnt >= 8){
134         if(*bmap != 0xFF){
135             for (i = 0; i < 8; ++i) {
136                 if(ext4_bmap_is_bit_clr(bmap, i)){
137                     *bit_id = sbit + i;
138                     return EOK;
139                 }
140             }
141         }
142
143         bmap += 1;
144         bcnt -= 8;
145         sbit += 8;
146     }
147
148     for (i = 0; i < bcnt; ++i) {
149         if(ext4_bmap_is_bit_clr(bmap, i)){
150             *bit_id = sbit + i;
151             return EOK;
152         }
153     }
154
155     return ENOSPC;
156 }
157
158 /**
159  * @}
160  */
161
162