blob: 91a8c969dd54ec3e69eed45be2e370238f35a94e [file] [log] [blame]
Theodore Ts'o3839e651997-04-26 13:21:57 +00001/*
2 * bitmaps.c --- routines to read, write, and manipulate the inode and
3 * block bitmaps.
4 *
Theodore Ts'o21c84b71997-04-29 16:15:03 +00005 * Copyright (C) 1993, 1994, 1995, 1996 Theodore Ts'o.
6 *
7 * %Begin-Header%
8 * This file may be redistributed under the terms of the GNU Public
9 * License.
10 * %End-Header%
Theodore Ts'o3839e651997-04-26 13:21:57 +000011 */
12
13#include <stdio.h>
14#include <string.h>
Theodore Ts'o4cbe8af1997-08-10 23:07:40 +000015#if HAVE_UNISTD_H
Theodore Ts'o3839e651997-04-26 13:21:57 +000016#include <unistd.h>
Theodore Ts'o4cbe8af1997-08-10 23:07:40 +000017#endif
Theodore Ts'o3839e651997-04-26 13:21:57 +000018#include <fcntl.h>
19#include <time.h>
Theodore Ts'o1d2ff461997-10-19 23:00:21 +000020#if HAVE_SYS_STAT_H
Theodore Ts'o3839e651997-04-26 13:21:57 +000021#include <sys/stat.h>
Theodore Ts'o1d2ff461997-10-19 23:00:21 +000022#endif
23#if HAVE_SYS_TYPES_H
Theodore Ts'o3839e651997-04-26 13:21:57 +000024#include <sys/types.h>
Theodore Ts'o1d2ff461997-10-19 23:00:21 +000025#endif
Theodore Ts'o3839e651997-04-26 13:21:57 +000026
Theodore Ts'ob5abe6f1998-01-19 14:47:53 +000027#include "ext2_fs.h"
Theodore Ts'o3839e651997-04-26 13:21:57 +000028#include "ext2fs.h"
Valerie Aurora Henson8f82ef92009-08-05 00:27:10 -040029#include "ext2fsP.h"
Theodore Ts'o3839e651997-04-26 13:21:57 +000030
Theodore Ts'oa0553c92007-07-22 22:59:50 -040031void ext2fs_free_inode_bitmap(ext2fs_inode_bitmap bitmap)
Theodore Ts'o3839e651997-04-26 13:21:57 +000032{
Valerie Aurora Henson8f82ef92009-08-05 00:27:10 -040033 ext2fs_free_generic_bmap(bitmap);
Theodore Ts'o3839e651997-04-26 13:21:57 +000034}
35
Theodore Ts'oa0553c92007-07-22 22:59:50 -040036void ext2fs_free_block_bitmap(ext2fs_block_bitmap bitmap)
Theodore Ts'oa29f4d31997-04-29 21:26:48 +000037{
Valerie Aurora Henson8f82ef92009-08-05 00:27:10 -040038 ext2fs_free_generic_bmap(bitmap);
Theodore Ts'oa29f4d31997-04-29 21:26:48 +000039}
40
41errcode_t ext2fs_copy_bitmap(ext2fs_generic_bitmap src,
42 ext2fs_generic_bitmap *dest)
43{
Valerie Aurora Henson8f82ef92009-08-05 00:27:10 -040044 return (ext2fs_copy_generic_bmap(src, dest));
Theodore Ts'oa29f4d31997-04-29 21:26:48 +000045}
Theodore Ts'offf876b1997-09-13 00:32:29 +000046void ext2fs_set_bitmap_padding(ext2fs_generic_bitmap map)
47{
Valerie Aurora Henson8f82ef92009-08-05 00:27:10 -040048 ext2fs_set_generic_bmap_padding(map);
Theodore Ts'oefc6f622008-08-27 23:07:54 -040049}
Theodore Ts'oa29f4d31997-04-29 21:26:48 +000050
Theodore Ts'o1e3472c1997-04-29 14:53:37 +000051errcode_t ext2fs_allocate_inode_bitmap(ext2_filsys fs,
Theodore Ts'of3db3561997-04-26 13:34:30 +000052 const char *descr,
Theodore Ts'o1e3472c1997-04-29 14:53:37 +000053 ext2fs_inode_bitmap *ret)
Theodore Ts'o3839e651997-04-26 13:21:57 +000054{
Valerie Aurora Henson8f82ef92009-08-05 00:27:10 -040055 __u64 start, end, real_end;
Theodore Ts'of3db3561997-04-26 13:34:30 +000056
57 EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS);
Theodore Ts'o3839e651997-04-26 13:21:57 +000058
59 fs->write_bitmaps = ext2fs_write_bitmaps;
60
Theodore Ts'o1e3472c1997-04-29 14:53:37 +000061 start = 1;
62 end = fs->super->s_inodes_count;
63 real_end = (EXT2_INODES_PER_GROUP(fs->super) * fs->group_desc_count);
64
Valerie Aurora Henson8f82ef92009-08-05 00:27:10 -040065 /* Are we permitted to use new-style bitmaps? */
66 if (fs->flags & EXT2_FLAG_64BITS)
67 return (ext2fs_alloc_generic_bmap(fs,
68 EXT2_ET_MAGIC_INODE_BITMAP64,
69 EXT2FS_BMAP64_BITARRAY,
70 start, end, real_end, descr, ret));
71
72 /* Otherwise, check to see if the file system is small enough
73 * to use old-style 32-bit bitmaps */
74 if ((end > ~0U) || (real_end > ~0U))
75 return EXT2_ET_CANT_USE_LEGACY_BITMAPS;
76
Theodore Ts'oa0553c92007-07-22 22:59:50 -040077 return (ext2fs_make_generic_bitmap(EXT2_ET_MAGIC_INODE_BITMAP, fs,
Valerie Aurora Henson8f82ef92009-08-05 00:27:10 -040078 start, end, real_end,
79 descr, 0,
80 (ext2fs_generic_bitmap *) ret));
Theodore Ts'o1e3472c1997-04-29 14:53:37 +000081}
82
83errcode_t ext2fs_allocate_block_bitmap(ext2_filsys fs,
84 const char *descr,
85 ext2fs_block_bitmap *ret)
86{
Valerie Aurora Henson8f82ef92009-08-05 00:27:10 -040087 __u64 start, end, real_end;
Theodore Ts'o1e3472c1997-04-29 14:53:37 +000088
89 EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS);
90
91 fs->write_bitmaps = ext2fs_write_bitmaps;
92
93 start = fs->super->s_first_data_block;
Valerie Aurora Henson8f82ef92009-08-05 00:27:10 -040094 end = ext2fs_blocks_count(fs->super)-1;
Valerie Aurora Hensonc5b7b6b2009-09-07 21:23:03 -040095 real_end = ((__u64) EXT2_BLOCKS_PER_GROUP(fs->super)
96 * (__u64) fs->group_desc_count)-1 + start;
Theodore Ts'oefc6f622008-08-27 23:07:54 -040097
Valerie Aurora Henson8f82ef92009-08-05 00:27:10 -040098 if (fs->flags & EXT2_FLAG_64BITS)
99 return (ext2fs_alloc_generic_bmap(fs,
100 EXT2_ET_MAGIC_BLOCK_BITMAP64,
101 EXT2FS_BMAP64_BITARRAY,
102 start, end, real_end, descr, ret));
103
104 if ((end > ~0U) || (real_end > ~0U))
105 return EXT2_ET_CANT_USE_LEGACY_BITMAPS;
106
Theodore Ts'oa0553c92007-07-22 22:59:50 -0400107 return (ext2fs_make_generic_bitmap(EXT2_ET_MAGIC_BLOCK_BITMAP, fs,
108 start, end, real_end,
Valerie Aurora Henson8f82ef92009-08-05 00:27:10 -0400109 descr, 0,
110 (ext2fs_generic_bitmap *) ret));
Theodore Ts'o3839e651997-04-26 13:21:57 +0000111}
112
Theodore Ts'of3db3561997-04-26 13:34:30 +0000113errcode_t ext2fs_fudge_inode_bitmap_end(ext2fs_inode_bitmap bitmap,
Theodore Ts'o31dbecd2001-01-11 04:54:39 +0000114 ext2_ino_t end, ext2_ino_t *oend)
Theodore Ts'o3839e651997-04-26 13:21:57 +0000115{
Valerie Aurora Henson8f82ef92009-08-05 00:27:10 -0400116 __u64 tmp_oend;
117 int retval;
Theodore Ts'oa0553c92007-07-22 22:59:50 -0400118
Valerie Aurora Henson8f82ef92009-08-05 00:27:10 -0400119 retval = ext2fs_fudge_generic_bmap_end((ext2fs_generic_bitmap) bitmap,
120 EXT2_ET_FUDGE_INODE_BITMAP_END,
121 end, &tmp_oend);
122 if (oend)
123 *oend = tmp_oend;
124 return retval;
Theodore Ts'of3db3561997-04-26 13:34:30 +0000125}
Theodore Ts'o3839e651997-04-26 13:21:57 +0000126
Theodore Ts'of3db3561997-04-26 13:34:30 +0000127errcode_t ext2fs_fudge_block_bitmap_end(ext2fs_block_bitmap bitmap,
128 blk_t end, blk_t *oend)
129{
Theodore Ts'oa0553c92007-07-22 22:59:50 -0400130 return (ext2fs_fudge_generic_bitmap_end(bitmap,
131 EXT2_ET_MAGIC_BLOCK_BITMAP,
132 EXT2_ET_FUDGE_BLOCK_BITMAP_END,
133 end, oend));
Theodore Ts'of3db3561997-04-26 13:34:30 +0000134}
Theodore Ts'o3839e651997-04-26 13:21:57 +0000135
Valerie Aurora Henson8f82ef92009-08-05 00:27:10 -0400136errcode_t ext2fs_fudge_block_bitmap_end2(ext2fs_block_bitmap bitmap,
137 blk64_t end, blk64_t *oend)
138{
139 return (ext2fs_fudge_generic_bmap_end(bitmap,
140 EXT2_ET_FUDGE_BLOCK_BITMAP_END,
141 end, oend));
142}
143
Theodore Ts'of3db3561997-04-26 13:34:30 +0000144void ext2fs_clear_inode_bitmap(ext2fs_inode_bitmap bitmap)
145{
Valerie Aurora Henson8f82ef92009-08-05 00:27:10 -0400146 ext2fs_clear_generic_bmap(bitmap);
Theodore Ts'of3db3561997-04-26 13:34:30 +0000147}
Theodore Ts'o3839e651997-04-26 13:21:57 +0000148
Theodore Ts'of3db3561997-04-26 13:34:30 +0000149void ext2fs_clear_block_bitmap(ext2fs_block_bitmap bitmap)
150{
Valerie Aurora Henson8f82ef92009-08-05 00:27:10 -0400151 ext2fs_clear_generic_bmap(bitmap);
Theodore Ts'of3db3561997-04-26 13:34:30 +0000152}
Theodore Ts'o50448d32007-07-22 23:42:14 -0400153
154errcode_t ext2fs_resize_inode_bitmap(__u32 new_end, __u32 new_real_end,
155 ext2fs_inode_bitmap bmap)
156{
157 return (ext2fs_resize_generic_bitmap(EXT2_ET_MAGIC_INODE_BITMAP,
158 new_end, new_real_end, bmap));
159}
160
Valerie Aurora Henson8f82ef92009-08-05 00:27:10 -0400161errcode_t ext2fs_resize_inode_bitmap2(__u64 new_end, __u64 new_real_end,
162 ext2fs_inode_bitmap bmap)
163{
164 return (ext2fs_resize_generic_bmap(bmap, new_end, new_real_end));
165}
166
Theodore Ts'o50448d32007-07-22 23:42:14 -0400167errcode_t ext2fs_resize_block_bitmap(__u32 new_end, __u32 new_real_end,
168 ext2fs_block_bitmap bmap)
169{
170 return (ext2fs_resize_generic_bitmap(EXT2_ET_MAGIC_BLOCK_BITMAP,
171 new_end, new_real_end, bmap));
172}
173
Valerie Aurora Henson8f82ef92009-08-05 00:27:10 -0400174errcode_t ext2fs_resize_block_bitmap2(__u64 new_end, __u64 new_real_end,
175 ext2fs_block_bitmap bmap)
176{
177 return (ext2fs_resize_generic_bmap(bmap, new_end, new_real_end));
178}
179
Theodore Ts'o50448d32007-07-22 23:42:14 -0400180errcode_t ext2fs_compare_block_bitmap(ext2fs_block_bitmap bm1,
181 ext2fs_block_bitmap bm2)
182{
Valerie Aurora Henson8f82ef92009-08-05 00:27:10 -0400183 return (ext2fs_compare_generic_bmap(EXT2_ET_NEQ_BLOCK_BITMAP,
184 bm1, bm2));
Theodore Ts'o50448d32007-07-22 23:42:14 -0400185}
186
187errcode_t ext2fs_compare_inode_bitmap(ext2fs_inode_bitmap bm1,
188 ext2fs_inode_bitmap bm2)
189{
Valerie Aurora Henson8f82ef92009-08-05 00:27:10 -0400190 return (ext2fs_compare_generic_bmap(EXT2_ET_NEQ_INODE_BITMAP,
191 bm1, bm2));
Theodore Ts'o50448d32007-07-22 23:42:14 -0400192}
193
Theodore Ts'of1f115a2007-07-23 04:32:48 -0400194errcode_t ext2fs_set_inode_bitmap_range(ext2fs_inode_bitmap bmap,
195 ext2_ino_t start, unsigned int num,
196 void *in)
197{
198 return (ext2fs_set_generic_bitmap_range(bmap,
199 EXT2_ET_MAGIC_INODE_BITMAP,
200 start, num, in));
201}
202
Valerie Aurora Henson8f82ef92009-08-05 00:27:10 -0400203errcode_t ext2fs_set_inode_bitmap_range2(ext2fs_inode_bitmap bmap,
204 __u64 start, size_t num,
205 void *in)
206{
207 return (ext2fs_set_generic_bmap_range(bmap, start, num, in));
208}
209
Theodore Ts'of1f115a2007-07-23 04:32:48 -0400210errcode_t ext2fs_get_inode_bitmap_range(ext2fs_inode_bitmap bmap,
211 ext2_ino_t start, unsigned int num,
212 void *out)
213{
214 return (ext2fs_get_generic_bitmap_range(bmap,
215 EXT2_ET_MAGIC_INODE_BITMAP,
216 start, num, out));
217}
218
Valerie Aurora Henson8f82ef92009-08-05 00:27:10 -0400219errcode_t ext2fs_get_inode_bitmap_range2(ext2fs_inode_bitmap bmap,
220 __u64 start, size_t num,
221 void *out)
222{
223 return (ext2fs_get_generic_bmap_range(bmap, start, num, out));
224}
225
Theodore Ts'of1f115a2007-07-23 04:32:48 -0400226errcode_t ext2fs_set_block_bitmap_range(ext2fs_block_bitmap bmap,
227 blk_t start, unsigned int num,
228 void *in)
229{
Theodore Ts'oefc6f622008-08-27 23:07:54 -0400230 return (ext2fs_set_generic_bitmap_range(bmap,
Theodore Ts'of1f115a2007-07-23 04:32:48 -0400231 EXT2_ET_MAGIC_BLOCK_BITMAP,
232 start, num, in));
233}
234
Valerie Aurora Henson8f82ef92009-08-05 00:27:10 -0400235errcode_t ext2fs_set_block_bitmap_range2(ext2fs_block_bitmap bmap,
236 blk64_t start, size_t num,
237 void *in)
238{
239 return (ext2fs_set_generic_bmap_range(bmap, start, num, in));
240}
241
Theodore Ts'of1f115a2007-07-23 04:32:48 -0400242errcode_t ext2fs_get_block_bitmap_range(ext2fs_block_bitmap bmap,
243 blk_t start, unsigned int num,
244 void *out)
245{
246 return (ext2fs_get_generic_bitmap_range(bmap,
247 EXT2_ET_MAGIC_BLOCK_BITMAP,
248 start, num, out));
249}
Valerie Aurora Henson8f82ef92009-08-05 00:27:10 -0400250
251errcode_t ext2fs_get_block_bitmap_range2(ext2fs_block_bitmap bmap,
252 blk64_t start, size_t num,
253 void *out)
254{
255 return (ext2fs_get_generic_bmap_range(bmap, start, num, out));
256}