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