initialize.c revision d4f34d41be97e23db07d5ed606fcc1a26f5a3c76
15208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI/* 25208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI * initialize.c --- initialize a filesystem handle given superblock 35208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI * parameters. Used by mke2fs when initializing a filesystem. 45208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI * 55208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI * Copyright (C) 1994, 1995, 1996 Theodore Ts'o. 65208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI * 75208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI * %Begin-Header% 85208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI * This file may be redistributed under the terms of the GNU Public 95208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI * License. 105208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI * %End-Header% 115208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI */ 125208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI 135208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI#include <stdio.h> 145208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI#include <string.h> 155208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI#if HAVE_UNISTD_H 165208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI#include <unistd.h> 175208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI#endif 185208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI#include <fcntl.h> 193dfa4488b032fc32aaf2470f48ac1fc3a534794fYasuyuki KOZAKAI#include <time.h> 200b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI#if HAVE_SYS_STAT_H 2104f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI#include <sys/stat.h> 22aafd269675fc45bac6340027c866ea6073643c3bJan Engelhardt#endif 23cd9e7aa106e80c44bd526af74b616701b0772d05Jan Engelhardt#if HAVE_SYS_TYPES_H 243dfa4488b032fc32aaf2470f48ac1fc3a534794fYasuyuki KOZAKAI#include <sys/types.h> 253dfa4488b032fc32aaf2470f48ac1fc3a534794fYasuyuki KOZAKAI#endif 260b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI 270b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI#include "ext2_fs.h" 280d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI#include "ext2fs.h" 290b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI 300b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI#if defined(__linux__) && defined(EXT2_OS_LINUX) 310b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI#define CREATOR_OS EXT2_OS_LINUX 3208b1616e068166e016b3ee7110db10ae5d853422Jan Engelhardt#else 333dfa4488b032fc32aaf2470f48ac1fc3a534794fYasuyuki KOZAKAI#if defined(__GNU__) && defined(EXT2_OS_HURD) 345208806f2708f761e97e62550561e3164b541770Yasuyuki KOZAKAI#define CREATOR_OS EXT2_OS_HURD 353dfa4488b032fc32aaf2470f48ac1fc3a534794fYasuyuki KOZAKAI#else 365a26b5fd7bf11ca93d54fe7dc24b3423fb7d89b2Mike Frysinger#if defined(__FreeBSD__) && defined(EXT2_OS_FREEBSD) 375a26b5fd7bf11ca93d54fe7dc24b3423fb7d89b2Mike Frysinger#define CREATOR_OS EXT2_OS_FREEBSD 385a26b5fd7bf11ca93d54fe7dc24b3423fb7d89b2Mike Frysinger#else 395a26b5fd7bf11ca93d54fe7dc24b3423fb7d89b2Mike Frysinger#if defined(LITES) && defined(EXT2_OS_LITES) 400d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI#define CREATOR_OS EXT2_OS_LITES 410d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI#else 420b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI#define CREATOR_OS EXT2_OS_LINUX /* by default */ 430b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI#endif /* defined(LITES) && defined(EXT2_OS_LITES) */ 440b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI#endif /* defined(__FreeBSD__) && defined(EXT2_OS_FREEBSD) */ 450b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI#endif /* defined(__GNU__) && defined(EXT2_OS_HURD) */ 460d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI#endif /* defined(__linux__) && defined(EXT2_OS_LINUX) */ 470d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI 480b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI/* 49dbb77543ad6afe29e9a1881b2d4fc212de621a55Jan Engelhardt * Note we override the kernel include file's idea of what the default 500b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI * check interval (never) should be. It's a good idea to check at 510d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI * least *occasionally*, specially since servers will never rarely get 520d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI * to reboot, since Linux is so robust these days. :-) 530d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI * 540d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI * 180 days (six months) seems like a good value. 553dfa4488b032fc32aaf2470f48ac1fc3a534794fYasuyuki KOZAKAI */ 563dfa4488b032fc32aaf2470f48ac1fc3a534794fYasuyuki KOZAKAI#ifdef EXT2_DFL_CHECKINTERVAL 573dfa4488b032fc32aaf2470f48ac1fc3a534794fYasuyuki KOZAKAI#undef EXT2_DFL_CHECKINTERVAL 583dfa4488b032fc32aaf2470f48ac1fc3a534794fYasuyuki KOZAKAI#endif 593dfa4488b032fc32aaf2470f48ac1fc3a534794fYasuyuki KOZAKAI#define EXT2_DFL_CHECKINTERVAL (86400L * 180L) 603dfa4488b032fc32aaf2470f48ac1fc3a534794fYasuyuki KOZAKAI 613dfa4488b032fc32aaf2470f48ac1fc3a534794fYasuyuki KOZAKAI/* 623dfa4488b032fc32aaf2470f48ac1fc3a534794fYasuyuki KOZAKAI * Calculate the number of GDT blocks to reserve for online filesystem growth. 633dfa4488b032fc32aaf2470f48ac1fc3a534794fYasuyuki KOZAKAI * The absolute maximum number of GDT blocks we can reserve is determined by 643dfa4488b032fc32aaf2470f48ac1fc3a534794fYasuyuki KOZAKAI * the number of block pointers that can fit into a single block. 653dfa4488b032fc32aaf2470f48ac1fc3a534794fYasuyuki KOZAKAI */ 663dfa4488b032fc32aaf2470f48ac1fc3a534794fYasuyuki KOZAKAIstatic unsigned int calc_reserved_gdt_blocks(ext2_filsys fs) 673dfa4488b032fc32aaf2470f48ac1fc3a534794fYasuyuki KOZAKAI{ 683dfa4488b032fc32aaf2470f48ac1fc3a534794fYasuyuki KOZAKAI struct ext2_super_block *sb = fs->super; 693dfa4488b032fc32aaf2470f48ac1fc3a534794fYasuyuki KOZAKAI unsigned long bpg = sb->s_blocks_per_group; 703dfa4488b032fc32aaf2470f48ac1fc3a534794fYasuyuki KOZAKAI unsigned int gdpb = EXT2_DESC_PER_BLOCK(sb); 713dfa4488b032fc32aaf2470f48ac1fc3a534794fYasuyuki KOZAKAI unsigned long max_blocks = 0xffffffff; 723dfa4488b032fc32aaf2470f48ac1fc3a534794fYasuyuki KOZAKAI unsigned long rsv_groups; 733dfa4488b032fc32aaf2470f48ac1fc3a534794fYasuyuki KOZAKAI unsigned int rsv_gdb; 743dfa4488b032fc32aaf2470f48ac1fc3a534794fYasuyuki KOZAKAI 753dfa4488b032fc32aaf2470f48ac1fc3a534794fYasuyuki KOZAKAI /* We set it at 1024x the current filesystem size, or 763dfa4488b032fc32aaf2470f48ac1fc3a534794fYasuyuki KOZAKAI * the upper block count limit (2^32), whichever is lower. 773dfa4488b032fc32aaf2470f48ac1fc3a534794fYasuyuki KOZAKAI */ 780b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI if (sb->s_blocks_count < max_blocks / 1024) 790b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI max_blocks = sb->s_blocks_count * 1024; 800b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI rsv_groups = ext2fs_div_ceil(max_blocks - sb->s_first_data_block, bpg); 810b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI rsv_gdb = ext2fs_div_ceil(rsv_groups, gdpb) - fs->desc_blocks; 820b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI if (rsv_gdb > EXT2_ADDR_PER_BLOCK(sb)) 830b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI rsv_gdb = EXT2_ADDR_PER_BLOCK(sb); 840b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI#ifdef RES_GDT_DEBUG 850b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI printf("max_blocks %lu, rsv_groups = %lu, rsv_gdb = %u\n", 860b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI max_blocks, rsv_groups, rsv_gdb); 870b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI#endif 880b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI 890b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI return rsv_gdb; 900b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI} 910b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI 920b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAIerrcode_t ext2fs_initialize(const char *name, int flags, 930b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI struct ext2_super_block *param, 940b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI io_manager manager, ext2_filsys *ret_fs) 950b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI{ 960b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI ext2_filsys fs; 970b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI errcode_t retval; 980b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI struct ext2_super_block *super; 990b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI int frags_per_block; 1000b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI unsigned int rem; 1010b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI unsigned int overhead = 0; 1020b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI unsigned int ipg; 1030b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI dgrp_t i; 1040b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI blk_t numblocks; 1050b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI int rsv_gdt; 1060b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI int io_flags; 1070b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI char *buf; 1080b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI char c; 1090b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI 1100b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI if (!param || !param->s_blocks_count) 1110b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI return EXT2_ET_INVALID_ARGUMENT; 1120b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI 1130b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI retval = ext2fs_get_mem(sizeof(struct struct_ext2_filsys), &fs); 1140b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI if (retval) 1150b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI return retval; 1160b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI 1170b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI memset(fs, 0, sizeof(struct struct_ext2_filsys)); 1180b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI fs->magic = EXT2_ET_MAGIC_EXT2FS_FILSYS; 1190b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI fs->flags = flags | EXT2_FLAG_RW; 1200b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI fs->umask = 022; 1210b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI#ifdef WORDS_BIGENDIAN 1220b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI fs->flags |= EXT2_FLAG_SWAP_BYTES; 1230b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI#endif 1240b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI io_flags = IO_FLAG_RW; 1250b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI if (flags & EXT2_FLAG_EXCLUSIVE) 1260b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI io_flags |= IO_FLAG_EXCLUSIVE; 1270b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI retval = manager->open(name, io_flags, &fs->io); 1280b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI if (retval) 1290b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI goto cleanup; 1300b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI fs->image_io = fs->io; 1310b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI fs->io->app_data = fs; 1320b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI retval = ext2fs_get_mem(strlen(name)+1, &fs->device_name); 1330b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI if (retval) 1340b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI goto cleanup; 1350b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI 1360b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI strcpy(fs->device_name, name); 1370b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI retval = ext2fs_get_mem(SUPERBLOCK_SIZE, &super); 1380b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI if (retval) 1390b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI goto cleanup; 1400b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI fs->super = super; 1410b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI 1420b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI memset(super, 0, SUPERBLOCK_SIZE); 1430b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI 1440b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI#define set_field(field, default) (super->field = param->field ? \ 1450b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI param->field : (default)) 1460b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI 1470b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI super->s_magic = EXT2_SUPER_MAGIC; 1480b82e8e81e887843011c8771f70d2302901f7e5eYasuyuki KOZAKAI super->s_state = EXT2_VALID_FS; 1490d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI 1500d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI set_field(s_log_block_size, 0); /* default blocksize: 1024 bytes */ 1510d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI set_field(s_log_frag_size, 0); /* default fragsize: 1024 bytes */ 1520d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI set_field(s_first_data_block, super->s_log_block_size ? 0 : 1); 1530d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI set_field(s_max_mnt_count, EXT2_DFL_MAX_MNT_COUNT); 1540d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI set_field(s_errors, EXT2_ERRORS_DEFAULT); 1550d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI set_field(s_feature_compat, 0); 1560d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI set_field(s_feature_incompat, 0); 1570d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI set_field(s_feature_ro_compat, 0); 1580d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI set_field(s_first_meta_bg, 0); 1590d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI set_field(s_raid_stride, 0); /* default stride size: 0 */ 1600d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI set_field(s_raid_stripe_width, 0); /* default stripe width: 0 */ 1610d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI set_field(s_flags, 0); 16204f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI if (super->s_feature_incompat & ~EXT2_LIB_FEATURE_INCOMPAT_SUPP) { 16304f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI retval = EXT2_ET_UNSUPP_FEATURE; 16404f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI goto cleanup; 16504f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI } 16604f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI if (super->s_feature_ro_compat & ~EXT2_LIB_FEATURE_RO_COMPAT_SUPP) { 16704f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI retval = EXT2_ET_RO_UNSUPP_FEATURE; 16804f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI goto cleanup; 16904f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI } 17004f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI 17104f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI set_field(s_rev_level, EXT2_GOOD_OLD_REV); 17204f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI if (super->s_rev_level >= EXT2_DYNAMIC_REV) { 17304f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI set_field(s_first_ino, EXT2_GOOD_OLD_FIRST_INO); 17404f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI set_field(s_inode_size, EXT2_GOOD_OLD_INODE_SIZE); 17504f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI } 17604f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI 17704f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI set_field(s_checkinterval, EXT2_DFL_CHECKINTERVAL); 17804f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI super->s_mkfs_time = super->s_lastcheck = fs->now ? fs->now : time(NULL); 17904f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI 18004f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI super->s_creator_os = CREATOR_OS; 18104f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI 18204f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI fs->blocksize = EXT2_BLOCK_SIZE(super); 18304f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI fs->fragsize = EXT2_FRAG_SIZE(super); 18404f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI frags_per_block = fs->blocksize / fs->fragsize; 18504f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI 18604f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI /* default: (fs->blocksize*8) blocks/group, up to 2^16 (GDT limit) */ 18704f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI set_field(s_blocks_per_group, fs->blocksize * 8); 18804f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI if (super->s_blocks_per_group > EXT2_MAX_BLOCKS_PER_GROUP(super)) 18904f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI super->s_blocks_per_group = EXT2_MAX_BLOCKS_PER_GROUP(super); 19004f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI super->s_frags_per_group = super->s_blocks_per_group * frags_per_block; 19104f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI 19204f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI super->s_blocks_count = param->s_blocks_count; 19304f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI super->s_r_blocks_count = param->s_r_blocks_count; 19404f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI if (super->s_r_blocks_count >= param->s_blocks_count) { 19504f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI retval = EXT2_ET_INVALID_ARGUMENT; 19604f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI goto cleanup; 19704f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI } 19804f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI 19904f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI /* 20004f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI * If we're creating an external journal device, we don't need 20104f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI * to bother with the rest. 20204f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI */ 20304f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI if (super->s_feature_incompat & EXT3_FEATURE_INCOMPAT_JOURNAL_DEV) { 20404f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI fs->group_desc_count = 0; 205cd9e7aa106e80c44bd526af74b616701b0772d05Jan Engelhardt ext2fs_mark_super_dirty(fs); 206cd9e7aa106e80c44bd526af74b616701b0772d05Jan Engelhardt *ret_fs = fs; 207cd9e7aa106e80c44bd526af74b616701b0772d05Jan Engelhardt return 0; 208cd9e7aa106e80c44bd526af74b616701b0772d05Jan Engelhardt } 209cd9e7aa106e80c44bd526af74b616701b0772d05Jan Engelhardt 210cd9e7aa106e80c44bd526af74b616701b0772d05Jan Engelhardtretry: 211cd9e7aa106e80c44bd526af74b616701b0772d05Jan Engelhardt fs->group_desc_count = ext2fs_div_ceil(super->s_blocks_count - 212cd9e7aa106e80c44bd526af74b616701b0772d05Jan Engelhardt super->s_first_data_block, 213cd9e7aa106e80c44bd526af74b616701b0772d05Jan Engelhardt EXT2_BLOCKS_PER_GROUP(super)); 214cd9e7aa106e80c44bd526af74b616701b0772d05Jan Engelhardt if (fs->group_desc_count == 0) { 215cd9e7aa106e80c44bd526af74b616701b0772d05Jan Engelhardt retval = EXT2_ET_TOOSMALL; 216cd9e7aa106e80c44bd526af74b616701b0772d05Jan Engelhardt goto cleanup; 217cd9e7aa106e80c44bd526af74b616701b0772d05Jan Engelhardt } 218cd9e7aa106e80c44bd526af74b616701b0772d05Jan Engelhardt fs->desc_blocks = ext2fs_div_ceil(fs->group_desc_count, 219cd9e7aa106e80c44bd526af74b616701b0772d05Jan Engelhardt EXT2_DESC_PER_BLOCK(super)); 220cd9e7aa106e80c44bd526af74b616701b0772d05Jan Engelhardt 221cd9e7aa106e80c44bd526af74b616701b0772d05Jan Engelhardt i = fs->blocksize >= 4096 ? 1 : 4096 / fs->blocksize; 222cd9e7aa106e80c44bd526af74b616701b0772d05Jan Engelhardt set_field(s_inodes_count, super->s_blocks_count / i); 223cd9e7aa106e80c44bd526af74b616701b0772d05Jan Engelhardt 224cd9e7aa106e80c44bd526af74b616701b0772d05Jan Engelhardt /* 225cd9e7aa106e80c44bd526af74b616701b0772d05Jan Engelhardt * Make sure we have at least EXT2_FIRST_INO + 1 inodes, so 226cd9e7aa106e80c44bd526af74b616701b0772d05Jan Engelhardt * that we have enough inodes for the filesystem(!) 227cd9e7aa106e80c44bd526af74b616701b0772d05Jan Engelhardt */ 228cd9e7aa106e80c44bd526af74b616701b0772d05Jan Engelhardt if (super->s_inodes_count < EXT2_FIRST_INODE(super)+1) 229cd9e7aa106e80c44bd526af74b616701b0772d05Jan Engelhardt super->s_inodes_count = EXT2_FIRST_INODE(super)+1; 230cd9e7aa106e80c44bd526af74b616701b0772d05Jan Engelhardt 231cd9e7aa106e80c44bd526af74b616701b0772d05Jan Engelhardt /* 232cd9e7aa106e80c44bd526af74b616701b0772d05Jan Engelhardt * There should be at least as many inodes as the user 233cd9e7aa106e80c44bd526af74b616701b0772d05Jan Engelhardt * requested. Figure out how many inodes per group that 234cd9e7aa106e80c44bd526af74b616701b0772d05Jan Engelhardt * should be. But make sure that we don't allocate more than 235cd9e7aa106e80c44bd526af74b616701b0772d05Jan Engelhardt * one bitmap's worth of inodes each group. 236cd9e7aa106e80c44bd526af74b616701b0772d05Jan Engelhardt */ 237cd9e7aa106e80c44bd526af74b616701b0772d05Jan Engelhardt ipg = ext2fs_div_ceil(super->s_inodes_count, fs->group_desc_count); 238cd9e7aa106e80c44bd526af74b616701b0772d05Jan Engelhardt if (ipg > fs->blocksize * 8) { 239cd9e7aa106e80c44bd526af74b616701b0772d05Jan Engelhardt if (super->s_blocks_per_group >= 256) { 240cd9e7aa106e80c44bd526af74b616701b0772d05Jan Engelhardt /* Try again with slightly different parameters */ 241cd9e7aa106e80c44bd526af74b616701b0772d05Jan Engelhardt super->s_blocks_per_group -= 8; 242cd9e7aa106e80c44bd526af74b616701b0772d05Jan Engelhardt super->s_blocks_count = param->s_blocks_count; 243cd9e7aa106e80c44bd526af74b616701b0772d05Jan Engelhardt super->s_frags_per_group = super->s_blocks_per_group * 244cd9e7aa106e80c44bd526af74b616701b0772d05Jan Engelhardt frags_per_block; 245cd9e7aa106e80c44bd526af74b616701b0772d05Jan Engelhardt goto retry; 246cd9e7aa106e80c44bd526af74b616701b0772d05Jan Engelhardt } else 247cd9e7aa106e80c44bd526af74b616701b0772d05Jan Engelhardt return EXT2_ET_TOO_MANY_INODES; 24804f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI } 24904f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI 25004f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI if (ipg > (unsigned) EXT2_MAX_INODES_PER_GROUP(super)) 25104f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI ipg = EXT2_MAX_INODES_PER_GROUP(super); 25204f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI 25304f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAIipg_retry: 25404f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI super->s_inodes_per_group = ipg; 25504f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI 25604f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI /* 25704f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI * Make sure the number of inodes per group completely fills 25804f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI * the inode table blocks in the descriptor. If not, add some 25904f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI * additional inodes/group. Waste not, want not... 2607a236f4cc685a420c1a782a5db614a93baf37ccfJan Engelhardt */ 26104f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI fs->inode_blocks_per_group = (((super->s_inodes_per_group * 26204f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI EXT2_INODE_SIZE(super)) + 2639ee386a1b6d7704b259460152c959ab0e79e02aaMax Kellermann EXT2_BLOCK_SIZE(super) - 1) / 26404f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI EXT2_BLOCK_SIZE(super)); 26504f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI super->s_inodes_per_group = ((fs->inode_blocks_per_group * 26604f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI EXT2_BLOCK_SIZE(super)) / 26704f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI EXT2_INODE_SIZE(super)); 26804f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI /* 26904f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI * Finally, make sure the number of inodes per group is a 27004f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI * multiple of 8. This is needed to simplify the bitmap 27104f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI * splicing code. 27204f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI */ 27304f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI super->s_inodes_per_group &= ~7; 27404f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI fs->inode_blocks_per_group = (((super->s_inodes_per_group * 27504f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI EXT2_INODE_SIZE(super)) + 27604f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI EXT2_BLOCK_SIZE(super) - 1) / 27704f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI EXT2_BLOCK_SIZE(super)); 27804f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI 27904f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI /* 28004f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI * adjust inode count to reflect the adjusted inodes_per_group 28104f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI */ 28204f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI if ((__u64)super->s_inodes_per_group * fs->group_desc_count > ~0U) { 28304f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI ipg--; 28404f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI goto ipg_retry; 28504f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI } 28604f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI super->s_inodes_count = super->s_inodes_per_group * 28704f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI fs->group_desc_count; 28804f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI super->s_free_inodes_count = super->s_inodes_count; 28904f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI 29004f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI /* 29104f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI * check the number of reserved group descriptor table blocks 29204f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI */ 29304f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI if (super->s_feature_compat & EXT2_FEATURE_COMPAT_RESIZE_INODE) 29404f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI rsv_gdt = calc_reserved_gdt_blocks(fs); 29504f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI else 29604f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI rsv_gdt = 0; 29704f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI set_field(s_reserved_gdt_blocks, rsv_gdt); 298aae4f82eb83d923f59a328d6e13396f424be28f9Max Kellermann if (super->s_reserved_gdt_blocks > EXT2_ADDR_PER_BLOCK(super)) { 299aae4f82eb83d923f59a328d6e13396f424be28f9Max Kellermann retval = EXT2_ET_RES_GDT_BLOCKS; 300aae4f82eb83d923f59a328d6e13396f424be28f9Max Kellermann goto cleanup; 301aae4f82eb83d923f59a328d6e13396f424be28f9Max Kellermann } 30204f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI 30304f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI /* 30404f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI * Calculate the maximum number of bookkeeping blocks per 30504f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI * group. It includes the superblock, the block group 30604f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI * descriptors, the block bitmap, the inode bitmap, the inode 30704f8c54dc52e19096d31d94593bd1040716afe4dYasuyuki KOZAKAI * table, and the reserved gdt blocks. 308cb25af809a8734c4766b6bfa4cca99596cbf01dbJan Engelhardt */ 30921b41eea4724c57d2b6e5998cf38255046e43ad3Jan Engelhardt overhead = (int) (3 + fs->inode_blocks_per_group + 31021b41eea4724c57d2b6e5998cf38255046e43ad3Jan Engelhardt fs->desc_blocks + super->s_reserved_gdt_blocks); 31121b41eea4724c57d2b6e5998cf38255046e43ad3Jan Engelhardt 31221b41eea4724c57d2b6e5998cf38255046e43ad3Jan Engelhardt /* This can only happen if the user requested too many inodes */ 31321b41eea4724c57d2b6e5998cf38255046e43ad3Jan Engelhardt if (overhead > super->s_blocks_per_group) 31421b41eea4724c57d2b6e5998cf38255046e43ad3Jan Engelhardt return EXT2_ET_TOO_MANY_INODES; 31521b41eea4724c57d2b6e5998cf38255046e43ad3Jan Engelhardt 31621b41eea4724c57d2b6e5998cf38255046e43ad3Jan Engelhardt /* 31721b41eea4724c57d2b6e5998cf38255046e43ad3Jan Engelhardt * See if the last group is big enough to support the 31821b41eea4724c57d2b6e5998cf38255046e43ad3Jan Engelhardt * necessary data structures. If not, we need to get rid of 31921b41eea4724c57d2b6e5998cf38255046e43ad3Jan Engelhardt * it. We need to recalculate the overhead for the last block 32021b41eea4724c57d2b6e5998cf38255046e43ad3Jan Engelhardt * group, since it might or might not have a superblock 32121b41eea4724c57d2b6e5998cf38255046e43ad3Jan Engelhardt * backup. 3222c0a0c9eba1d1ab39dcde54bc822d4788f9531fcJan Engelhardt */ 32321b41eea4724c57d2b6e5998cf38255046e43ad3Jan Engelhardt overhead = (int) (2 + fs->inode_blocks_per_group); 32421b41eea4724c57d2b6e5998cf38255046e43ad3Jan Engelhardt if (ext2fs_bg_has_super(fs, fs->group_desc_count - 1)) 32521b41eea4724c57d2b6e5998cf38255046e43ad3Jan Engelhardt overhead += 1 + fs->desc_blocks + super->s_reserved_gdt_blocks; 32621b41eea4724c57d2b6e5998cf38255046e43ad3Jan Engelhardt rem = ((super->s_blocks_count - super->s_first_data_block) % 32721b41eea4724c57d2b6e5998cf38255046e43ad3Jan Engelhardt super->s_blocks_per_group); 32821b41eea4724c57d2b6e5998cf38255046e43ad3Jan Engelhardt if ((fs->group_desc_count == 1) && rem && (rem < overhead)) 32921b41eea4724c57d2b6e5998cf38255046e43ad3Jan Engelhardt return EXT2_ET_TOOSMALL; 33021b41eea4724c57d2b6e5998cf38255046e43ad3Jan Engelhardt if (rem && (rem < overhead+50)) { 33121b41eea4724c57d2b6e5998cf38255046e43ad3Jan Engelhardt super->s_blocks_count -= rem; 33221b41eea4724c57d2b6e5998cf38255046e43ad3Jan Engelhardt goto retry; 33321b41eea4724c57d2b6e5998cf38255046e43ad3Jan Engelhardt } 33421b41eea4724c57d2b6e5998cf38255046e43ad3Jan Engelhardt 33521b41eea4724c57d2b6e5998cf38255046e43ad3Jan Engelhardt /* 33621b41eea4724c57d2b6e5998cf38255046e43ad3Jan Engelhardt * At this point we know how big the filesystem will be. So 33721b41eea4724c57d2b6e5998cf38255046e43ad3Jan Engelhardt * we can do any and all allocations that depend on the block 33821b41eea4724c57d2b6e5998cf38255046e43ad3Jan Engelhardt * count. 3392c0a0c9eba1d1ab39dcde54bc822d4788f9531fcJan Engelhardt */ 34021b41eea4724c57d2b6e5998cf38255046e43ad3Jan Engelhardt 34121b41eea4724c57d2b6e5998cf38255046e43ad3Jan Engelhardt retval = ext2fs_get_mem(strlen(fs->device_name) + 80, &buf); 34221b41eea4724c57d2b6e5998cf38255046e43ad3Jan Engelhardt if (retval) 34321b41eea4724c57d2b6e5998cf38255046e43ad3Jan Engelhardt goto cleanup; 34421b41eea4724c57d2b6e5998cf38255046e43ad3Jan Engelhardt 34521b41eea4724c57d2b6e5998cf38255046e43ad3Jan Engelhardt sprintf(buf, "block bitmap for %s", fs->device_name); 34621b41eea4724c57d2b6e5998cf38255046e43ad3Jan Engelhardt retval = ext2fs_allocate_block_bitmap(fs, buf, &fs->block_map); 34721b41eea4724c57d2b6e5998cf38255046e43ad3Jan Engelhardt if (retval) 34821b41eea4724c57d2b6e5998cf38255046e43ad3Jan Engelhardt goto cleanup; 34921b41eea4724c57d2b6e5998cf38255046e43ad3Jan Engelhardt 35021b41eea4724c57d2b6e5998cf38255046e43ad3Jan Engelhardt sprintf(buf, "inode bitmap for %s", fs->device_name); 35121b41eea4724c57d2b6e5998cf38255046e43ad3Jan Engelhardt retval = ext2fs_allocate_inode_bitmap(fs, buf, &fs->inode_map); 35221b41eea4724c57d2b6e5998cf38255046e43ad3Jan Engelhardt if (retval) 35321b41eea4724c57d2b6e5998cf38255046e43ad3Jan Engelhardt goto cleanup; 35421b41eea4724c57d2b6e5998cf38255046e43ad3Jan Engelhardt 35521b41eea4724c57d2b6e5998cf38255046e43ad3Jan Engelhardt ext2fs_free_mem(&buf); 35621b41eea4724c57d2b6e5998cf38255046e43ad3Jan Engelhardt 357cb25af809a8734c4766b6bfa4cca99596cbf01dbJan Engelhardt retval = ext2fs_get_array(fs->desc_blocks, fs->blocksize, 35821b41eea4724c57d2b6e5998cf38255046e43ad3Jan Engelhardt &fs->group_desc); 3590d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI if (retval) 3600d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI goto cleanup; 3610d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI 3620d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI memset(fs->group_desc, 0, (size_t) fs->desc_blocks * fs->blocksize); 3630d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI 3640d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI /* 3650d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI * Reserve the superblock and group descriptors for each 3660d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI * group, and fill in the correct group statistics for group. 3670d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI * Note that although the block bitmap, inode bitmap, and 3680d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI * inode table have not been allocated (and in fact won't be 3690d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI * by this routine), they are accounted for nevertheless. 3700d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI */ 3710d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI super->s_free_blocks_count = 0; 3720d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI for (i = 0; i < fs->group_desc_count; i++) { 3730d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI numblocks = ext2fs_reserve_super_and_bgd(fs, i, fs->block_map); 3740d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI 3750d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI super->s_free_blocks_count += numblocks; 3760d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI fs->group_desc[i].bg_free_blocks_count = numblocks; 3770d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI fs->group_desc[i].bg_free_inodes_count = 3780d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI fs->super->s_inodes_per_group; 3790d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI fs->group_desc[i].bg_used_dirs_count = 0; 3800d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI ext2fs_group_desc_csum_set(fs, i); 3810d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI } 3820d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI 3830d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI c = (char) 255; 3840d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI if (((int) c) == -1) { 3850d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI super->s_flags |= EXT2_FLAGS_SIGNED_HASH; 3860d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI } else { 3870d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI super->s_flags |= EXT2_FLAGS_UNSIGNED_HASH; 3880d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI } 3890d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI 3900d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI ext2fs_mark_super_dirty(fs); 3910d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI ext2fs_mark_bb_dirty(fs); 3920d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI ext2fs_mark_ib_dirty(fs); 3930d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI 39421b41eea4724c57d2b6e5998cf38255046e43ad3Jan Engelhardt io_channel_set_blksize(fs->io, fs->blocksize); 395170af8c566faa9605c1ead558792a031f1d0d48dYasuyuki KOZAKAI 396170af8c566faa9605c1ead558792a031f1d0d48dYasuyuki KOZAKAI *ret_fs = fs; 3970d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI return 0; 3980d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAIcleanup: 3990d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI ext2fs_free(fs); 4000d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI return retval; 4010d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI} 4020d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI