busybox/e2fsprogs/old_e2fsprogs/ext2fs/ext2fs_inline.c
<<
>>
Prefs
   1/* vi: set sw=4 ts=4: */
   2/*
   3 * ext2fs.h --- ext2fs
   4 *
   5 * 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%
  11 */
  12
  13#include "ext2fs.h"
  14#include "bitops.h"
  15#include <string.h>
  16
  17/*
  18 *  Allocate memory
  19 */
  20errcode_t ext2fs_get_mem(unsigned long size, void *ptr)
  21{
  22        void **pp = (void **)ptr;
  23
  24        *pp = malloc(size);
  25        if (!*pp)
  26                return EXT2_ET_NO_MEMORY;
  27        return 0;
  28}
  29
  30/*
  31 * Free memory
  32 */
  33errcode_t ext2fs_free_mem(void *ptr)
  34{
  35        void **pp = (void **)ptr;
  36
  37        free(*pp);
  38        *pp = 0;
  39        return 0;
  40}
  41
  42/*
  43 *  Resize memory
  44 */
  45errcode_t ext2fs_resize_mem(unsigned long EXT2FS_ATTR((unused)) old_size,
  46                                     unsigned long size, void *ptr)
  47{
  48        void *p;
  49
  50        /* Use "memcpy" for pointer assignments here to avoid problems
  51         * with C99 strict type aliasing rules. */
  52        memcpy(&p, ptr, sizeof (p));
  53        p = xrealloc(p, size);
  54        memcpy(ptr, &p, sizeof (p));
  55        return 0;
  56}
  57
  58/*
  59 * Mark a filesystem superblock as dirty
  60 */
  61void ext2fs_mark_super_dirty(ext2_filsys fs)
  62{
  63        fs->flags |= EXT2_FLAG_DIRTY | EXT2_FLAG_CHANGED;
  64}
  65
  66/*
  67 * Mark a filesystem as changed
  68 */
  69void ext2fs_mark_changed(ext2_filsys fs)
  70{
  71        fs->flags |= EXT2_FLAG_CHANGED;
  72}
  73
  74/*
  75 * Check to see if a filesystem has changed
  76 */
  77int ext2fs_test_changed(ext2_filsys fs)
  78{
  79        return (fs->flags & EXT2_FLAG_CHANGED);
  80}
  81
  82/*
  83 * Mark a filesystem as valid
  84 */
  85void ext2fs_mark_valid(ext2_filsys fs)
  86{
  87        fs->flags |= EXT2_FLAG_VALID;
  88}
  89
  90/*
  91 * Mark a filesystem as NOT valid
  92 */
  93void ext2fs_unmark_valid(ext2_filsys fs)
  94{
  95        fs->flags &= ~EXT2_FLAG_VALID;
  96}
  97
  98/*
  99 * Check to see if a filesystem is valid
 100 */
 101int ext2fs_test_valid(ext2_filsys fs)
 102{
 103        return (fs->flags & EXT2_FLAG_VALID);
 104}
 105
 106/*
 107 * Mark the inode bitmap as dirty
 108 */
 109void ext2fs_mark_ib_dirty(ext2_filsys fs)
 110{
 111        fs->flags |= EXT2_FLAG_IB_DIRTY | EXT2_FLAG_CHANGED;
 112}
 113
 114/*
 115 * Mark the block bitmap as dirty
 116 */
 117void ext2fs_mark_bb_dirty(ext2_filsys fs)
 118{
 119        fs->flags |= EXT2_FLAG_BB_DIRTY | EXT2_FLAG_CHANGED;
 120}
 121
 122/*
 123 * Check to see if a filesystem's inode bitmap is dirty
 124 */
 125int ext2fs_test_ib_dirty(ext2_filsys fs)
 126{
 127        return (fs->flags & EXT2_FLAG_IB_DIRTY);
 128}
 129
 130/*
 131 * Check to see if a filesystem's block bitmap is dirty
 132 */
 133int ext2fs_test_bb_dirty(ext2_filsys fs)
 134{
 135        return (fs->flags & EXT2_FLAG_BB_DIRTY);
 136}
 137
 138/*
 139 * Return the group # of a block
 140 */
 141int ext2fs_group_of_blk(ext2_filsys fs, blk_t blk)
 142{
 143        return (blk - fs->super->s_first_data_block) /
 144                fs->super->s_blocks_per_group;
 145}
 146
 147/*
 148 * Return the group # of an inode number
 149 */
 150int ext2fs_group_of_ino(ext2_filsys fs, ext2_ino_t ino)
 151{
 152        return (ino - 1) / fs->super->s_inodes_per_group;
 153}
 154
 155blk_t ext2fs_inode_data_blocks(ext2_filsys fs,
 156                                        struct ext2_inode *inode)
 157{
 158       return inode->i_blocks -
 159              (inode->i_file_acl ? fs->blocksize >> 9 : 0);
 160}
 161
 162
 163
 164
 165
 166
 167
 168
 169
 170__u16 ext2fs_swab16(__u16 val)
 171{
 172        return (val >> 8) | (val << 8);
 173}
 174
 175__u32 ext2fs_swab32(__u32 val)
 176{
 177        return ((val>>24) | ((val>>8)&0xFF00) |
 178                ((val<<8)&0xFF0000) | (val<<24));
 179}
 180
 181int ext2fs_test_generic_bitmap(ext2fs_generic_bitmap bitmap,
 182                                        blk_t bitno);
 183
 184int ext2fs_test_generic_bitmap(ext2fs_generic_bitmap bitmap,
 185                                        blk_t bitno)
 186{
 187        if ((bitno < bitmap->start) || (bitno > bitmap->end)) {
 188                ext2fs_warn_bitmap2(bitmap, EXT2FS_TEST_ERROR, bitno);
 189                return 0;
 190        }
 191        return ext2fs_test_bit(bitno - bitmap->start, bitmap->bitmap);
 192}
 193
 194int ext2fs_mark_block_bitmap(ext2fs_block_bitmap bitmap,
 195                                       blk_t block)
 196{
 197        return ext2fs_mark_generic_bitmap((ext2fs_generic_bitmap)
 198                                       bitmap,
 199                                          block);
 200}
 201
 202int ext2fs_unmark_block_bitmap(ext2fs_block_bitmap bitmap,
 203                                         blk_t block)
 204{
 205        return ext2fs_unmark_generic_bitmap((ext2fs_generic_bitmap) bitmap,
 206                                            block);
 207}
 208
 209int ext2fs_test_block_bitmap(ext2fs_block_bitmap bitmap,
 210                                       blk_t block)
 211{
 212        return ext2fs_test_generic_bitmap((ext2fs_generic_bitmap) bitmap,
 213                                          block);
 214}
 215
 216int ext2fs_mark_inode_bitmap(ext2fs_inode_bitmap bitmap,
 217                                       ext2_ino_t inode)
 218{
 219        return ext2fs_mark_generic_bitmap((ext2fs_generic_bitmap) bitmap,
 220                                          inode);
 221}
 222
 223int ext2fs_unmark_inode_bitmap(ext2fs_inode_bitmap bitmap,
 224                                         ext2_ino_t inode)
 225{
 226        return ext2fs_unmark_generic_bitmap((ext2fs_generic_bitmap) bitmap,
 227                                     inode);
 228}
 229
 230int ext2fs_test_inode_bitmap(ext2fs_inode_bitmap bitmap,
 231                                       ext2_ino_t inode)
 232{
 233        return ext2fs_test_generic_bitmap((ext2fs_generic_bitmap) bitmap,
 234                                          inode);
 235}
 236
 237void ext2fs_fast_mark_block_bitmap(ext2fs_block_bitmap bitmap,
 238                                            blk_t block)
 239{
 240        ext2fs_set_bit(block - bitmap->start, bitmap->bitmap);
 241}
 242
 243void ext2fs_fast_unmark_block_bitmap(ext2fs_block_bitmap bitmap,
 244                                              blk_t block)
 245{
 246        ext2fs_clear_bit(block - bitmap->start, bitmap->bitmap);
 247}
 248
 249int ext2fs_fast_test_block_bitmap(ext2fs_block_bitmap bitmap,
 250                                            blk_t block)
 251{
 252        return ext2fs_test_bit(block - bitmap->start, bitmap->bitmap);
 253}
 254
 255void ext2fs_fast_mark_inode_bitmap(ext2fs_inode_bitmap bitmap,
 256                                            ext2_ino_t inode)
 257{
 258        ext2fs_set_bit(inode - bitmap->start, bitmap->bitmap);
 259}
 260
 261void ext2fs_fast_unmark_inode_bitmap(ext2fs_inode_bitmap bitmap,
 262                                              ext2_ino_t inode)
 263{
 264        ext2fs_clear_bit(inode - bitmap->start, bitmap->bitmap);
 265}
 266
 267int ext2fs_fast_test_inode_bitmap(ext2fs_inode_bitmap bitmap,
 268                                           ext2_ino_t inode)
 269{
 270        return ext2fs_test_bit(inode - bitmap->start, bitmap->bitmap);
 271}
 272
 273blk_t ext2fs_get_block_bitmap_start(ext2fs_block_bitmap bitmap)
 274{
 275        return bitmap->start;
 276}
 277
 278ext2_ino_t ext2fs_get_inode_bitmap_start(ext2fs_inode_bitmap bitmap)
 279{
 280        return bitmap->start;
 281}
 282
 283blk_t ext2fs_get_block_bitmap_end(ext2fs_block_bitmap bitmap)
 284{
 285        return bitmap->end;
 286}
 287
 288ext2_ino_t ext2fs_get_inode_bitmap_end(ext2fs_inode_bitmap bitmap)
 289{
 290        return bitmap->end;
 291}
 292
 293int ext2fs_test_block_bitmap_range(ext2fs_block_bitmap bitmap,
 294                                            blk_t block, int num)
 295{
 296        int     i;
 297
 298        if ((block < bitmap->start) || (block+num-1 > bitmap->end)) {
 299                ext2fs_warn_bitmap(EXT2_ET_BAD_BLOCK_TEST,
 300                                   block, bitmap->description);
 301                return 0;
 302        }
 303        for (i=0; i < num; i++) {
 304                if (ext2fs_fast_test_block_bitmap(bitmap, block+i))
 305                        return 0;
 306        }
 307        return 1;
 308}
 309
 310int ext2fs_fast_test_block_bitmap_range(ext2fs_block_bitmap bitmap,
 311                                                 blk_t block, int num)
 312{
 313        int     i;
 314
 315        for (i=0; i < num; i++) {
 316                if (ext2fs_fast_test_block_bitmap(bitmap, block+i))
 317                        return 0;
 318        }
 319        return 1;
 320}
 321
 322void ext2fs_mark_block_bitmap_range(ext2fs_block_bitmap bitmap,
 323                                             blk_t block, int num)
 324{
 325        int     i;
 326
 327        if ((block < bitmap->start) || (block+num-1 > bitmap->end)) {
 328                ext2fs_warn_bitmap(EXT2_ET_BAD_BLOCK_MARK, block,
 329                                   bitmap->description);
 330                return;
 331        }
 332        for (i=0; i < num; i++)
 333                ext2fs_set_bit(block + i - bitmap->start, bitmap->bitmap);
 334}
 335
 336void ext2fs_fast_mark_block_bitmap_range(ext2fs_block_bitmap bitmap,
 337                                                  blk_t block, int num)
 338{
 339        int     i;
 340
 341        for (i=0; i < num; i++)
 342                ext2fs_set_bit(block + i - bitmap->start, bitmap->bitmap);
 343}
 344
 345void ext2fs_unmark_block_bitmap_range(ext2fs_block_bitmap bitmap,
 346                                               blk_t block, int num)
 347{
 348        int     i;
 349
 350        if ((block < bitmap->start) || (block+num-1 > bitmap->end)) {
 351                ext2fs_warn_bitmap(EXT2_ET_BAD_BLOCK_UNMARK, block,
 352                                   bitmap->description);
 353                return;
 354        }
 355        for (i=0; i < num; i++)
 356                ext2fs_clear_bit(block + i - bitmap->start, bitmap->bitmap);
 357}
 358
 359void ext2fs_fast_unmark_block_bitmap_range(ext2fs_block_bitmap bitmap,
 360                                                    blk_t block, int num)
 361{
 362        int     i;
 363        for (i=0; i < num; i++)
 364                ext2fs_clear_bit(block + i - bitmap->start, bitmap->bitmap);
 365}
 366