13839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/* 23839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * mke2fs.c - Make a ext2fs filesystem. 3efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o * 455f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o * Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 555f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o * 2003, 2004, 2005 by Theodore Ts'o. 619c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o * 719c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o * %Begin-Header% 819c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o * This file may be redistributed under the terms of the GNU Public 919c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o * License. 1019c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o * %End-Header% 113839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */ 123839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 133839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/* Usage: mke2fs [options] device 14efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o * 153839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * The device may be a block device or a image of one, but this isn't 16efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o * enforced (but it's not much fun on a character device :-). 173839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */ 183839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 19ebabf2ad6d19af5c674b624bafe619dedbc94403Theodore Ts'o#define _XOPEN_SOURCE 600 /* for inclusion of PATH_MAX in Solaris */ 20ebabf2ad6d19af5c674b624bafe619dedbc94403Theodore Ts'o 21a418d3ad819323f871005d253f7f9ac378e78ba5Theodore Ts'o#include <stdio.h> 223839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <string.h> 23d0c537748d5a9799dd0658b0a5cceaafc28084bbTheodore Ts'o#include <strings.h> 243839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <fcntl.h> 253839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <ctype.h> 263839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <time.h> 27756df353e8ffd010fcca8cef8972cf27006edb6aTheodore Ts'o#ifdef __linux__ 282740156bd12747389eaf745529653b26a3a9d73dTheodore Ts'o#include <sys/utsname.h> 292740156bd12747389eaf745529653b26a3a9d73dTheodore Ts'o#endif 30a418d3ad819323f871005d253f7f9ac378e78ba5Theodore Ts'o#ifdef HAVE_GETOPT_H 313839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <getopt.h> 32373b8337c7b6c6243810be250083fa4773891e92Theodore Ts'o#else 33373b8337c7b6c6243810be250083fa4773891e92Theodore Ts'oextern char *optarg; 34373b8337c7b6c6243810be250083fa4773891e92Theodore Ts'oextern int optind; 35a418d3ad819323f871005d253f7f9ac378e78ba5Theodore Ts'o#endif 36a418d3ad819323f871005d253f7f9ac378e78ba5Theodore Ts'o#ifdef HAVE_UNISTD_H 373839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <unistd.h> 38a418d3ad819323f871005d253f7f9ac378e78ba5Theodore Ts'o#endif 39a418d3ad819323f871005d253f7f9ac378e78ba5Theodore Ts'o#ifdef HAVE_STDLIB_H 403839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <stdlib.h> 41a418d3ad819323f871005d253f7f9ac378e78ba5Theodore Ts'o#endif 42a418d3ad819323f871005d253f7f9ac378e78ba5Theodore Ts'o#ifdef HAVE_ERRNO_H 43a418d3ad819323f871005d253f7f9ac378e78ba5Theodore Ts'o#include <errno.h> 44a418d3ad819323f871005d253f7f9ac378e78ba5Theodore Ts'o#endif 453839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <sys/ioctl.h> 46f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o#include <sys/types.h> 4713b0b1231ed28aac75ba336de7a8cb3b4611ce68Eric Sandeen#include <sys/stat.h> 48b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V#include <libgen.h> 49365857912e27914afa8857af5adf74ee19ca9e03Theodore Ts'o#include <limits.h> 509ed8e5fec226aa53634ed95cbeac736d90a518e5Eric Sandeen#include <blkid/blkid.h> 51f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o 5254c637d4d29af3e6365779f8b12976abe95a4753Theodore Ts'o#include "ext2fs/ext2_fs.h" 53e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#include "ext2fs/ext2fsP.h" 543839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include "et/com_err.h" 551e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o#include "uuid/uuid.h" 56896938d57e7091e7a032674dfeeb91f2a17fd78bTheodore Ts'o#include "e2p/e2p.h" 573839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include "ext2fs/ext2fs.h" 5863985320384bf143eaac9857af424800d9867a1aTheodore Ts'o#include "util.h" 599dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o#include "profile.h" 60a6d8302b4873527798a77c1ba3106a04b71dfeacTheodore Ts'o#include "prof_err.h" 613839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include "../version.h" 62d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o#include "nls-enable.h" 63e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#include "quota/mkquota.h" 643839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 653839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#define STRIDE_LENGTH 8 663839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 67e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#define MAX_32_NUM ((((unsigned long long) 1) << 32) - 1) 68e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 696733c2fd0046c525203034f58fc0a8c69fdf480bTheodore Ts'o#ifndef __sparc__ 701e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o#define ZAP_BOOTBLOCK 711e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o#endif 721e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o 7318a1444b4f1e6a0948fd38fa0de382d86cfe04deBernhard Rosenkränzer#ifndef ROOT_SYSCONFDIR 7418a1444b4f1e6a0948fd38fa0de382d86cfe04deBernhard Rosenkränzer#define ROOT_SYSCONFDIR "/etc" 7518a1444b4f1e6a0948fd38fa0de382d86cfe04deBernhard Rosenkränzer#endif 7618a1444b4f1e6a0948fd38fa0de382d86cfe04deBernhard Rosenkränzer 77e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#define DISCARD_STEP_MB (2048) 78e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 793839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern int isatty(int); 80f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'oextern FILE *fpopen(const char *cmd, const char *mode); 813839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 82e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic const char * program_name = "mke2fs"; 83e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic const char * device_name /* = NULL */; 843839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 853839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/* Command line options */ 86e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic int cflag; 87e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic int verbose; 88e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic int quiet; 89e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic int super_only; 90e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic int discard = 1; /* attempt to discard device before fs creation */ 91e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic int direct_io; 92e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic int force; 93e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic int noaction; 94e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic uid_t root_uid; 95e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic gid_t root_gid; 9616ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'oint journal_size; 9716ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'oint journal_flags; 98e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic int lazy_itable_init; 99e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic char *bad_blocks_filename = NULL; 100e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic __u32 fs_stride; 101e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic int quotatype = -1; /* Initialize both user and group quotas by default */ 102e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 103e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic struct ext2_super_block fs_param; 104e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic char *fs_uuid = NULL; 105e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic char *creator_os; 106e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic char *volume_label; 107e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic char *mount_dir; 10816ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'ochar *journal_device; 109e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic int sync_kludge; /* Set using the MKE2FS_SYNC env. option */ 110e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic char **fs_types; 1113839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 112e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic profile_t profile; 1139dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o 114e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic int sys_page_size = 4096; 115e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic int linux_version_code = 0; 11631e29a12d1e22745c74afe47bf172a3c73280dd9Theodore Ts'o 11763985320384bf143eaac9857af424800d9867a1aTheodore Ts'ostatic void usage(void) 1183839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 119bdd80f28d759cda94bab13af689d4aee0328dd7fTheodore Ts'o fprintf(stderr, _("Usage: %s [-c|-l filename] [-b block-size] " 120e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "[-C cluster-size]\n\t[-i bytes-per-inode] [-I inode-size] " 121bdd80f28d759cda94bab13af689d4aee0328dd7fTheodore Ts'o "[-J journal-options]\n" 122e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "\t[-G flex-group-size] [-N number-of-inodes]\n" 1239ba400027fb00ce43d14673346bbfb6f5719985aTheodore Ts'o "\t[-m reserved-blocks-percentage] [-o creator-os]\n" 1249ba400027fb00ce43d14673346bbfb6f5719985aTheodore Ts'o "\t[-g blocks-per-group] [-L volume-label] " 125067911ae734bb5fef7c5780a639533847b5b578cAndreas Dilger "[-M last-mounted-directory]\n\t[-O feature[,...]] " 126bdd80f28d759cda94bab13af689d4aee0328dd7fTheodore Ts'o "[-r fs-revision] [-E extended-option[,...]]\n" 127e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "\t[-t fs-type] [-T usage-type ] [-U UUID] " 128e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "[-jnqvDFKSV] device [blocks-count]\n"), 1293839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o program_name); 1303839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o exit(1); 1313839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 1323839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 133e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic int int_log2(unsigned long long arg) 1343839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 1353839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o int l = 0; 1363839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 1373839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o arg >>= 1; 1383839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o while (arg) { 1393839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o l++; 1403839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o arg >>= 1; 1413839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 1423839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return l; 1433839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 1443839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 145e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic int int_log10(unsigned long long arg) 1461dde43f0c1176f61dd0bf91aff265ce8cd1c5fd6Theodore Ts'o{ 1471dde43f0c1176f61dd0bf91aff265ce8cd1c5fd6Theodore Ts'o int l; 1481dde43f0c1176f61dd0bf91aff265ce8cd1c5fd6Theodore Ts'o 1491dde43f0c1176f61dd0bf91aff265ce8cd1c5fd6Theodore Ts'o for (l=0; arg ; l++) 1501dde43f0c1176f61dd0bf91aff265ce8cd1c5fd6Theodore Ts'o arg = arg / 10; 1511dde43f0c1176f61dd0bf91aff265ce8cd1c5fd6Theodore Ts'o return l; 1521dde43f0c1176f61dd0bf91aff265ce8cd1c5fd6Theodore Ts'o} 1531dde43f0c1176f61dd0bf91aff265ce8cd1c5fd6Theodore Ts'o 154e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef __linux__ 155d99225ecceb580d497c649daa4894fa2e10019adTheodore Ts'ostatic int parse_version_number(const char *s) 156d99225ecceb580d497c649daa4894fa2e10019adTheodore Ts'o{ 157d99225ecceb580d497c649daa4894fa2e10019adTheodore Ts'o int major, minor, rev; 158d99225ecceb580d497c649daa4894fa2e10019adTheodore Ts'o char *endptr; 159d99225ecceb580d497c649daa4894fa2e10019adTheodore Ts'o const char *cp = s; 160d99225ecceb580d497c649daa4894fa2e10019adTheodore Ts'o 161d99225ecceb580d497c649daa4894fa2e10019adTheodore Ts'o if (!s) 162d99225ecceb580d497c649daa4894fa2e10019adTheodore Ts'o return 0; 163d99225ecceb580d497c649daa4894fa2e10019adTheodore Ts'o major = strtol(cp, &endptr, 10); 164d99225ecceb580d497c649daa4894fa2e10019adTheodore Ts'o if (cp == endptr || *endptr != '.') 165d99225ecceb580d497c649daa4894fa2e10019adTheodore Ts'o return 0; 166d99225ecceb580d497c649daa4894fa2e10019adTheodore Ts'o cp = endptr + 1; 167d99225ecceb580d497c649daa4894fa2e10019adTheodore Ts'o minor = strtol(cp, &endptr, 10); 168d99225ecceb580d497c649daa4894fa2e10019adTheodore Ts'o if (cp == endptr || *endptr != '.') 169d99225ecceb580d497c649daa4894fa2e10019adTheodore Ts'o return 0; 170d99225ecceb580d497c649daa4894fa2e10019adTheodore Ts'o cp = endptr + 1; 171d99225ecceb580d497c649daa4894fa2e10019adTheodore Ts'o rev = strtol(cp, &endptr, 10); 172d99225ecceb580d497c649daa4894fa2e10019adTheodore Ts'o if (cp == endptr) 173d99225ecceb580d497c649daa4894fa2e10019adTheodore Ts'o return 0; 174d99225ecceb580d497c649daa4894fa2e10019adTheodore Ts'o return ((((major * 256) + minor) * 256) + rev); 175d99225ecceb580d497c649daa4894fa2e10019adTheodore Ts'o} 176e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif 177d99225ecceb580d497c649daa4894fa2e10019adTheodore Ts'o 17850787ea22edd8b4662203daf3569411d9dcf4287Theodore Ts'o/* 1793839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Helper function for read_bb_file and test_disk 1803839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */ 181544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'ostatic void invalid_block(ext2_filsys fs EXT2FS_ATTR((unused)), blk_t blk) 1823839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 1836693837e59cc7b5397a0d46d2753c309382c76f9Theodore Ts'o fprintf(stderr, _("Bad block %u out of range; ignored.\n"), blk); 1843839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 1853839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 1863839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 1873839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/* 1883839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Reads the bad blocks list from a file 1893839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */ 1903839e65723771b85975f4263102dd3ceec4523cTheodore Ts'ostatic void read_bb_file(ext2_filsys fs, badblocks_list *bb_list, 1913839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o const char *bad_blocks_file) 1923839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 1933839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o FILE *f; 1943839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o errcode_t retval; 1953839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 1963839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o f = fopen(bad_blocks_file, "r"); 1973839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (!f) { 1983839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o com_err("read_bad_blocks_file", errno, 199d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o _("while trying to open %s"), bad_blocks_file); 2003839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o exit(1); 2013839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 2023839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o retval = ext2fs_read_bb_FILE(fs, f, bb_list, invalid_block); 2033839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o fclose (f); 2043839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (retval) { 205e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err("ext2fs_read_bb_FILE", retval, "%s", 206d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o _("while reading in list of bad blocks from file")); 2073839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o exit(1); 2083839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 2093839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 2103839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 2113839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/* 2123839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Runs the badblocks program to test the disk 2133839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */ 2143839e65723771b85975f4263102dd3ceec4523cTheodore Ts'ostatic void test_disk(ext2_filsys fs, badblocks_list *bb_list) 2153839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 2163839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o FILE *f; 2173839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o errcode_t retval; 2183839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o char buf[1024]; 2193839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 220e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall sprintf(buf, "badblocks -b %d -X %s%s%s %llu", fs->blocksize, 2213ed57c27df0ba0942a19c71bc065c8eec3036567Theodore Ts'o quiet ? "" : "-s ", (cflag > 1) ? "-w " : "", 222e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fs->device_name, ext2fs_blocks_count(fs->super)-1); 2233839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (verbose) 224d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o printf(_("Running command: %s\n"), buf); 2253839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o f = popen(buf, "r"); 2263839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (!f) { 2273839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o com_err("popen", errno, 228f37ab68a26bacf4f5cc7643b8373e40292b7682aTheodore Ts'o _("while trying to run '%s'"), buf); 2293839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o exit(1); 2303839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 2313839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o retval = ext2fs_read_bb_FILE(fs, f, bb_list, invalid_block); 232f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o pclose(f); 2333839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (retval) { 234e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err("ext2fs_read_bb_FILE", retval, "%s", 235d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o _("while processing list of bad blocks from program")); 2363839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o exit(1); 2373839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 2383839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 2393839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 2403839e65723771b85975f4263102dd3ceec4523cTheodore Ts'ostatic void handle_bad_blocks(ext2_filsys fs, badblocks_list bb_list) 2413839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 242544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o dgrp_t i; 243544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o blk_t j; 244544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o unsigned must_be_good; 2453839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o blk_t blk; 2463839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o badblocks_iterate bb_iter; 2473839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o errcode_t retval; 248f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o blk_t group_block; 249f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o int group; 250f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o int group_bad; 2513839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 2523839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (!bb_list) 2533839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 254efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 2553839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o /* 2563839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * The primary superblock and group descriptors *must* be 2573839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * good; if not, abort. 2583839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */ 2593839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o must_be_good = fs->super->s_first_data_block + 1 + fs->desc_blocks; 2603839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o for (i = fs->super->s_first_data_block; i <= must_be_good; i++) { 261cbbf031b6edf9bdf5511af2193e44cff7fdaa66aTheodore Ts'o if (ext2fs_badblocks_list_test(bb_list, i)) { 262d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o fprintf(stderr, _("Block %d in primary " 263d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o "superblock/group descriptor area bad.\n"), i); 264d0ff90d5202428583c78a60c3042e7b60d88bc45Eric Sandeen fprintf(stderr, _("Blocks %u through %u must be good " 265d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o "in order to build a filesystem.\n"), 2663839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o fs->super->s_first_data_block, must_be_good); 267544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o fputs(_("Aborting....\n"), stderr); 2683839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o exit(1); 2693839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 2703839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 271f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o 272f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o /* 273f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o * See if any of the bad blocks are showing up in the backup 274f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o * superblocks and/or group descriptors. If so, issue a 275f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o * warning and adjust the block counts appropriately. 276f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o */ 277f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o group_block = fs->super->s_first_data_block + 278f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o fs->super->s_blocks_per_group; 279efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 280f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o for (i = 1; i < fs->group_desc_count; i++) { 28192bcc595dcb31ad15e12d8c72e6edfc70545c204Theodore Ts'o group_bad = 0; 282f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o for (j=0; j < fs->desc_blocks+1; j++) { 283cbbf031b6edf9bdf5511af2193e44cff7fdaa66aTheodore Ts'o if (ext2fs_badblocks_list_test(bb_list, 284cbbf031b6edf9bdf5511af2193e44cff7fdaa66aTheodore Ts'o group_block + j)) { 285efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o if (!group_bad) 286f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o fprintf(stderr, 2878deb80a5d1078cbe43eaffcdeebf0a1a549d6a54Takashi Sato_("Warning: the backup superblock/group descriptors at block %u contain\n" 288d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o" bad blocks.\n\n"), 289f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o group_block); 290f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o group_bad++; 291e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall group = ext2fs_group_of_blk2(fs, group_block+j); 292e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_bg_free_blocks_count_set(fs, group, ext2fs_bg_free_blocks_count(fs, group) + 1); 2935711ed297b1a3d94086256b5b3b891d4f77b21caTheodore Ts'o ext2fs_group_desc_csum_set(fs, group); 294e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_free_blocks_count_add(fs->super, 1); 295f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o } 296f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o } 297f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o group_block += fs->super->s_blocks_per_group; 298f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o } 299efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 3003839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o /* 3013839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Mark all the bad blocks as used... 3023839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */ 303cbbf031b6edf9bdf5511af2193e44cff7fdaa66aTheodore Ts'o retval = ext2fs_badblocks_list_iterate_begin(bb_list, &bb_iter); 3043839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (retval) { 305e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err("ext2fs_badblocks_list_iterate_begin", retval, "%s", 306d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o _("while marking bad blocks as used")); 3073839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o exit(1); 3083839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 309efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o while (ext2fs_badblocks_list_iterate(bb_iter, &blk)) 310e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_mark_block_bitmap2(fs->block_map, EXT2FS_B2C(fs, blk)); 311cbbf031b6edf9bdf5511af2193e44cff7fdaa66aTheodore Ts'o ext2fs_badblocks_list_iterate_end(bb_iter); 3123839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 3133839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 3146fcd6f84c235f4bf2bd9770f172837da9982eb6eEric Sandeenstatic void write_inode_tables(ext2_filsys fs, int lazy_flag, int itable_zeroed) 31516ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o{ 31616ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o errcode_t retval; 317e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall blk64_t blk; 318544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o dgrp_t i; 319e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall int num; 320e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall struct ext2fs_numeric_progress_struct progress; 32116ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o 322e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_numeric_progress_init(fs, &progress, 323e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall _("Writing inode tables: "), 324e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fs->group_desc_count); 3251dde43f0c1176f61dd0bf91aff265ce8cd1c5fd6Theodore Ts'o 3263839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o for (i = 0; i < fs->group_desc_count; i++) { 327e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_numeric_progress_update(fs, &progress, i); 328efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 329e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall blk = ext2fs_inode_table_loc(fs, i); 33019c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o num = fs->inode_blocks_per_group; 33116ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o 332e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (lazy_flag) 333e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall num = ext2fs_div_ceil((fs->super->s_inodes_per_group - 334e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_bg_itable_unused(fs, i)) * 335e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXT2_INODE_SIZE(fs->super), 336e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXT2_BLOCK_SIZE(fs->super)); 3376fcd6f84c235f4bf2bd9770f172837da9982eb6eEric Sandeen if (!lazy_flag || itable_zeroed) { 338d2d22a29df4632d548149b123f197102eb39d3b0Jose R. Santos /* The kernel doesn't need to zero the itable blocks */ 339e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_bg_flags_set(fs, i, EXT2_BG_INODE_ZEROED); 3405711ed297b1a3d94086256b5b3b891d4f77b21caTheodore Ts'o ext2fs_group_desc_csum_set(fs, i); 34119c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o } 342e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall retval = ext2fs_zero_blocks2(fs, blk, num, &blk, &num); 3430f2794c020b34de391f7a42e3b155ccb0ed2830fTheodore Ts'o if (retval) { 3440f2794c020b34de391f7a42e3b155ccb0ed2830fTheodore Ts'o fprintf(stderr, _("\nCould not write %d " 345e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "blocks in inode table starting at %llu: %s\n"), 3460f2794c020b34de391f7a42e3b155ccb0ed2830fTheodore Ts'o num, blk, error_message(retval)); 3470f2794c020b34de391f7a42e3b155ccb0ed2830fTheodore Ts'o exit(1); 3480f2794c020b34de391f7a42e3b155ccb0ed2830fTheodore Ts'o } 3497d5633cf6ee1be74777cf4b1adfa9738ff33f2b7Theodore Ts'o if (sync_kludge) { 3507d5633cf6ee1be74777cf4b1adfa9738ff33f2b7Theodore Ts'o if (sync_kludge == 1) 3517d5633cf6ee1be74777cf4b1adfa9738ff33f2b7Theodore Ts'o sync(); 3527d5633cf6ee1be74777cf4b1adfa9738ff33f2b7Theodore Ts'o else if ((i % sync_kludge) == 0) 3537d5633cf6ee1be74777cf4b1adfa9738ff33f2b7Theodore Ts'o sync(); 3547d5633cf6ee1be74777cf4b1adfa9738ff33f2b7Theodore Ts'o } 3553839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 356e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_zero_blocks2(0, 0, 0, 0, 0); 357e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_numeric_progress_close(fs, &progress, 358e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall _("done \n")); 3593839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 3603839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 3613839e65723771b85975f4263102dd3ceec4523cTheodore Ts'ostatic void create_root_dir(ext2_filsys fs) 3623839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 3635113a6e32b298671c86ae7da097bcd24540cebc9Eric Sandeen errcode_t retval; 364f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o struct ext2_inode inode; 3653839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 3663839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o retval = ext2fs_mkdir(fs, EXT2_ROOT_INO, EXT2_ROOT_INO, 0); 3673839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (retval) { 368e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err("ext2fs_mkdir", retval, "%s", 369e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall _("while creating root dir")); 3703839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o exit(1); 3713839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 372e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (root_uid != 0 || root_gid != 0) { 373f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o retval = ext2fs_read_inode(fs, EXT2_ROOT_INO, &inode); 374f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o if (retval) { 375e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err("ext2fs_read_inode", retval, "%s", 376d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o _("while reading root inode")); 377f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o exit(1); 378f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o } 379e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 380e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall inode.i_uid = root_uid; 381e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_set_i_uid_high(inode, root_uid >> 16); 382e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall inode.i_gid = root_gid; 383e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_set_i_gid_high(inode, root_gid >> 16); 384e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 385e27b45639aeef964035c1fa78790f761ed31c175Theodore Ts'o retval = ext2fs_write_new_inode(fs, EXT2_ROOT_INO, &inode); 386f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o if (retval) { 387e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err("ext2fs_write_inode", retval, "%s", 388d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o _("while setting root inode ownership")); 389f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o exit(1); 390f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o } 391f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o } 3923839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 3933839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 3943839e65723771b85975f4263102dd3ceec4523cTheodore Ts'ostatic void create_lost_and_found(ext2_filsys fs) 3953839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 3962d328bb76d2d63bdfdba923b54c28bd686bd8fecTheodore Ts'o unsigned int lpf_size = 0; 3973839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o errcode_t retval; 398dfcdc32f8d6623a35a9e66f503c535e4081b7266Theodore Ts'o ext2_ino_t ino; 3993839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o const char *name = "lost+found"; 4003839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o int i; 4013839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 4026a525069a99787ef3ae1156f12230044b3568f4bTheodore Ts'o fs->umask = 077; 4033839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o retval = ext2fs_mkdir(fs, EXT2_ROOT_INO, 0, name); 4043839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (retval) { 405e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err("ext2fs_mkdir", retval, "%s", 406d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o _("while creating /lost+found")); 4073839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o exit(1); 4083839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 4093839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 4103839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o retval = ext2fs_lookup(fs, EXT2_ROOT_INO, name, strlen(name), 0, &ino); 4113839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (retval) { 412e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err("ext2_lookup", retval, "%s", 413d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o _("while looking up /lost+found")); 4143839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o exit(1); 4153839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 416efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 4173839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o for (i=1; i < EXT2_NDIR_BLOCKS; i++) { 4188c7c6eb1675b327387a24bc05ac98dfc890f8073Andreas Dilger /* Ensure that lost+found is at least 2 blocks, so we always 4198c7c6eb1675b327387a24bc05ac98dfc890f8073Andreas Dilger * test large empty blocks for big-block filesystems. */ 4208c7c6eb1675b327387a24bc05ac98dfc890f8073Andreas Dilger if ((lpf_size += fs->blocksize) >= 16*1024 && 4218c7c6eb1675b327387a24bc05ac98dfc890f8073Andreas Dilger lpf_size >= 2 * fs->blocksize) 42250787ea22edd8b4662203daf3569411d9dcf4287Theodore Ts'o break; 4233839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o retval = ext2fs_expand_dir(fs, ino); 4243839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (retval) { 425e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err("ext2fs_expand_dir", retval, "%s", 426d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o _("while expanding /lost+found")); 4273839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o exit(1); 4283839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 4296a525069a99787ef3ae1156f12230044b3568f4bTheodore Ts'o } 4303839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 4313839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 4323839e65723771b85975f4263102dd3ceec4523cTheodore Ts'ostatic void create_bad_block_inode(ext2_filsys fs, badblocks_list bb_list) 4333839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 4343839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o errcode_t retval; 435efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 436e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_mark_inode_bitmap2(fs->inode_map, EXT2_BAD_INO); 4375711ed297b1a3d94086256b5b3b891d4f77b21caTheodore Ts'o ext2fs_inode_alloc_stats2(fs, EXT2_BAD_INO, +1, 0); 4383839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o retval = ext2fs_update_bb_inode(fs, bb_list); 4393839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (retval) { 440e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err("ext2fs_update_bb_inode", retval, "%s", 441d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o _("while setting bad block inode")); 4423839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o exit(1); 4433839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 4443839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 4453839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 4463839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 4473839e65723771b85975f4263102dd3ceec4523cTheodore Ts'ostatic void reserve_inodes(ext2_filsys fs) 4483839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 449dfcdc32f8d6623a35a9e66f503c535e4081b7266Theodore Ts'o ext2_ino_t i; 4503839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 4515711ed297b1a3d94086256b5b3b891d4f77b21caTheodore Ts'o for (i = EXT2_ROOT_INO + 1; i < EXT2_FIRST_INODE(fs->super); i++) 4525711ed297b1a3d94086256b5b3b891d4f77b21caTheodore Ts'o ext2fs_inode_alloc_stats2(fs, i, +1, 0); 4533839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o ext2fs_mark_ib_dirty(fs); 4543839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 4553839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 456756df353e8ffd010fcca8cef8972cf27006edb6aTheodore Ts'o#define BSD_DISKMAGIC (0x82564557UL) /* The disk magic number */ 4577ef3bb838d6fd10452d7c47303c61232bfc4a442Theodore Ts'o#define BSD_MAGICDISK (0x57455682UL) /* The disk magic number reversed */ 458756df353e8ffd010fcca8cef8972cf27006edb6aTheodore Ts'o#define BSD_LABEL_OFFSET 64 459756df353e8ffd010fcca8cef8972cf27006edb6aTheodore Ts'o 46004a968579ee8125c617edee27204cf35c0a169c1Theodore Ts'ostatic void zap_sector(ext2_filsys fs, int sect, int nsect) 461f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o{ 4623f85f65c98183c3871e24f285e5b3e1e97afd9f5Theodore Ts'o char *buf; 463f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o int retval; 464756df353e8ffd010fcca8cef8972cf27006edb6aTheodore Ts'o unsigned int *magic; 465f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o 4663f85f65c98183c3871e24f285e5b3e1e97afd9f5Theodore Ts'o buf = malloc(512*nsect); 467568101f774f9ad61d475969e91dc90da359b5a85Andreas Dilger if (!buf) { 4684ea7bd04390935e1f8b473c8b857e518df2e226bTheodore Ts'o printf(_("Out of memory erasing sectors %d-%d\n"), 4694ea7bd04390935e1f8b473c8b857e518df2e226bTheodore Ts'o sect, sect + nsect - 1); 470568101f774f9ad61d475969e91dc90da359b5a85Andreas Dilger exit(1); 471568101f774f9ad61d475969e91dc90da359b5a85Andreas Dilger } 472756df353e8ffd010fcca8cef8972cf27006edb6aTheodore Ts'o 4737ef3bb838d6fd10452d7c47303c61232bfc4a442Theodore Ts'o if (sect == 0) { 4747ef3bb838d6fd10452d7c47303c61232bfc4a442Theodore Ts'o /* Check for a BSD disklabel, and don't erase it if so */ 475e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall retval = io_channel_read_blk64(fs->io, 0, -512, buf); 4767ef3bb838d6fd10452d7c47303c61232bfc4a442Theodore Ts'o if (retval) 4777ef3bb838d6fd10452d7c47303c61232bfc4a442Theodore Ts'o fprintf(stderr, 4787ef3bb838d6fd10452d7c47303c61232bfc4a442Theodore Ts'o _("Warning: could not read block 0: %s\n"), 4797ef3bb838d6fd10452d7c47303c61232bfc4a442Theodore Ts'o error_message(retval)); 4807ef3bb838d6fd10452d7c47303c61232bfc4a442Theodore Ts'o else { 4817ef3bb838d6fd10452d7c47303c61232bfc4a442Theodore Ts'o magic = (unsigned int *) (buf + BSD_LABEL_OFFSET); 4827ef3bb838d6fd10452d7c47303c61232bfc4a442Theodore Ts'o if ((*magic == BSD_DISKMAGIC) || 4837ef3bb838d6fd10452d7c47303c61232bfc4a442Theodore Ts'o (*magic == BSD_MAGICDISK)) 4847ef3bb838d6fd10452d7c47303c61232bfc4a442Theodore Ts'o return; 4857ef3bb838d6fd10452d7c47303c61232bfc4a442Theodore Ts'o } 486756df353e8ffd010fcca8cef8972cf27006edb6aTheodore Ts'o } 487756df353e8ffd010fcca8cef8972cf27006edb6aTheodore Ts'o 4887098810daf7d1ba9287a51dc596d78d70d270337Theodore Ts'o memset(buf, 0, 512*nsect); 489e41784eb0e47ff5e460b635c86a0cef7250b48b4Theodore Ts'o io_channel_set_blksize(fs->io, 512); 490e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall retval = io_channel_write_blk64(fs->io, sect, -512*nsect, buf); 491e41784eb0e47ff5e460b635c86a0cef7250b48b4Theodore Ts'o io_channel_set_blksize(fs->io, fs->blocksize); 4923f85f65c98183c3871e24f285e5b3e1e97afd9f5Theodore Ts'o free(buf); 493f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o if (retval) 4946693837e59cc7b5397a0d46d2753c309382c76f9Theodore Ts'o fprintf(stderr, _("Warning: could not erase sector %d: %s\n"), 4956693837e59cc7b5397a0d46d2753c309382c76f9Theodore Ts'o sect, error_message(retval)); 496f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o} 49716ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o 49816ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'ostatic void create_journal_dev(ext2_filsys fs) 49916ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o{ 500e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall struct ext2fs_numeric_progress_struct progress; 50116ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o errcode_t retval; 50216ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o char *buf; 503e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall blk64_t blk, err_blk; 504b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V int c, count, err_count; 50516ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o 506d6a27e0048537ab6367a6aa97fbe84a423119eeaTheodore Ts'o retval = ext2fs_create_journal_superblock(fs, 507e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_blocks_count(fs->super), 0, &buf); 508d6a27e0048537ab6367a6aa97fbe84a423119eeaTheodore Ts'o if (retval) { 509e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err("create_journal_dev", retval, "%s", 510d6a27e0048537ab6367a6aa97fbe84a423119eeaTheodore Ts'o _("while initializing journal superblock")); 511d6a27e0048537ab6367a6aa97fbe84a423119eeaTheodore Ts'o exit(1); 512d6a27e0048537ab6367a6aa97fbe84a423119eeaTheodore Ts'o } 5136c54689fadc3fe0b0bcae2cc93946cb7a28b9f15Andreas Dilger 514e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (journal_flags & EXT2_MKJOURNAL_LAZYINIT) 515e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall goto write_superblock; 516e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 517e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_numeric_progress_init(fs, &progress, 518e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall _("Zeroing journal device: "), 519e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_blocks_count(fs->super)); 520b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V blk = 0; 521e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall count = ext2fs_blocks_count(fs->super); 522b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V while (count > 0) { 523b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V if (count > 1024) 524b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V c = 1024; 525b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V else 526b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V c = count; 527e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall retval = ext2fs_zero_blocks2(fs, blk, c, &err_blk, &err_count); 528b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V if (retval) { 529b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V com_err("create_journal_dev", retval, 530b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V _("while zeroing journal device " 531e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "(block %llu, count %d)"), 532b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V err_blk, err_count); 533b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V exit(1); 534b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V } 535b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V blk += c; 536b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V count -= c; 537e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_numeric_progress_update(fs, &progress, blk); 53816ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o } 539e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_zero_blocks2(0, 0, 0, 0, 0); 540dc2ec525f5619bf478d2aae1b406fca2ff4b0d21Theodore Ts'o 541e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_numeric_progress_close(fs, &progress, NULL); 542e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallwrite_superblock: 543e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall retval = io_channel_write_blk64(fs->io, 544e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fs->super->s_first_data_block+1, 545e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 1, buf); 54616ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o if (retval) { 547e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err("create_journal_dev", retval, "%s", 54816ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o _("while writing journal superblock")); 54916ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o exit(1); 55016ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o } 55116ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o} 552f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o 5533839e65723771b85975f4263102dd3ceec4523cTheodore Ts'ostatic void show_stats(ext2_filsys fs) 5543839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 555ef9abe5f2529b3a42b46bf64c5f4232f86e7b390Theodore Ts'o struct ext2_super_block *s = fs->super; 5561e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o char buf[80]; 55763253946309651c1015947d522e2ba4b35a807a5Theodore Ts'o char *os; 558e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall blk64_t group_block; 559544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o dgrp_t i; 560544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o int need, col_left; 561efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 562e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (ext2fs_blocks_count(&fs_param) != ext2fs_blocks_count(s)) 563e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fprintf(stderr, _("warning: %llu blocks unused.\n\n"), 564e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_blocks_count(&fs_param) - ext2fs_blocks_count(s)); 56550787ea22edd8b4662203daf3569411d9dcf4287Theodore Ts'o 56650787ea22edd8b4662203daf3569411d9dcf4287Theodore Ts'o memset(buf, 0, sizeof(buf)); 56750787ea22edd8b4662203daf3569411d9dcf4287Theodore Ts'o strncpy(buf, s->s_volume_name, sizeof(s->s_volume_name)); 568d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o printf(_("Filesystem label=%s\n"), buf); 569e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall os = e2p_os2string(fs->super->s_creator_os); 570e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (os) 571e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf(_("OS type: %s\n"), os); 57263253946309651c1015947d522e2ba4b35a807a5Theodore Ts'o free(os); 573d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o printf(_("Block size=%u (log=%u)\n"), fs->blocksize, 57450787ea22edd8b4662203daf3569411d9dcf4287Theodore Ts'o s->s_log_block_size); 575e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (EXT2_HAS_RO_COMPAT_FEATURE(fs->super, 576e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXT4_FEATURE_RO_COMPAT_BIGALLOC)) 577e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf(_("Cluster size=%u (log=%u)\n"), 578e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fs->blocksize << fs->cluster_ratio_bits, 579e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall s->s_log_cluster_size); 580e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall else 581e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf(_("Fragment size=%u (log=%u)\n"), EXT2_CLUSTER_SIZE(s), 582e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall s->s_log_cluster_size); 5839ed8e5fec226aa53634ed95cbeac736d90a518e5Eric Sandeen printf(_("Stride=%u blocks, Stripe width=%u blocks\n"), 5849ed8e5fec226aa53634ed95cbeac736d90a518e5Eric Sandeen s->s_raid_stride, s->s_raid_stripe_width); 585e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf(_("%u inodes, %llu blocks\n"), s->s_inodes_count, 586e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_blocks_count(s)); 587e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf(_("%llu blocks (%2.2f%%) reserved for the super user\n"), 588e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_r_blocks_count(s), 589e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 100.0 * ext2fs_r_blocks_count(s) / ext2fs_blocks_count(s)); 590d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o printf(_("First data block=%u\n"), s->s_first_data_block); 591e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (root_uid != 0 || root_gid != 0) 592e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf(_("Root directory owner=%u:%u\n"), root_uid, root_gid); 593d323f8fb369089b97d6f3bf0f8d64ceeab0b10f5Theodore Ts'o if (s->s_reserved_gdt_blocks) 594d323f8fb369089b97d6f3bf0f8d64ceeab0b10f5Theodore Ts'o printf(_("Maximum filesystem blocks=%lu\n"), 595d323f8fb369089b97d6f3bf0f8d64ceeab0b10f5Theodore Ts'o (s->s_reserved_gdt_blocks + fs->desc_blocks) * 596f2de1d38d0819b17895977fabc52d81d0ea6ec00Valerie Clement EXT2_DESC_PER_BLOCK(s) * s->s_blocks_per_group); 597d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o if (fs->group_desc_count > 1) 598c8c071a07319939dfd7ae2ff1dedec644d750debTheodore Ts'o printf(_("%u block groups\n"), fs->group_desc_count); 599d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o else 600c8c071a07319939dfd7ae2ff1dedec644d750debTheodore Ts'o printf(_("%u block group\n"), fs->group_desc_count); 601e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (EXT2_HAS_RO_COMPAT_FEATURE(fs->super, 602e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXT4_FEATURE_RO_COMPAT_BIGALLOC)) 603e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf(_("%u blocks per group, %u clusters per group\n"), 604e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall s->s_blocks_per_group, s->s_clusters_per_group); 605e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall else 606e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf(_("%u blocks per group, %u fragments per group\n"), 607e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall s->s_blocks_per_group, s->s_clusters_per_group); 608d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o printf(_("%u inodes per group\n"), s->s_inodes_per_group); 6093839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 6103839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (fs->group_desc_count == 1) { 6113839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o printf("\n"); 6123839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o return; 6133839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 614d323f8fb369089b97d6f3bf0f8d64ceeab0b10f5Theodore Ts'o 615e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf("%s", _("Superblock backups stored on blocks: ")); 6163839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o group_block = s->s_first_data_block; 6173839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o col_left = 0; 6183839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o for (i = 1; i < fs->group_desc_count; i++) { 6193839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o group_block += s->s_blocks_per_group; 620521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o if (!ext2fs_bg_has_super(fs, i)) 621521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o continue; 6227671433a9daad089af037f84b365d640e1adf252Theodore Ts'o if (i != 1) 6237671433a9daad089af037f84b365d640e1adf252Theodore Ts'o printf(", "); 6246733c2fd0046c525203034f58fc0a8c69fdf480bTheodore Ts'o need = int_log10(group_block) + 2; 6251dde43f0c1176f61dd0bf91aff265ce8cd1c5fd6Theodore Ts'o if (need > col_left) { 6263839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o printf("\n\t"); 6271dde43f0c1176f61dd0bf91aff265ce8cd1c5fd6Theodore Ts'o col_left = 72; 6283839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 6291dde43f0c1176f61dd0bf91aff265ce8cd1c5fd6Theodore Ts'o col_left -= need; 630e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf("%llu", group_block); 6313839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 6323839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o printf("\n\n"); 6333839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 6343839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 6351e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o/* 6361e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o * Set the S_CREATOR_OS field. Return true if OS is known, 6371e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o * otherwise, 0. 6381e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o */ 6391e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'ostatic int set_os(struct ext2_super_block *sb, char *os) 6401e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o{ 6411e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o if (isdigit (*os)) 6421e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o sb->s_creator_os = atoi (os); 6431e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o else if (strcasecmp(os, "linux") == 0) 6441e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o sb->s_creator_os = EXT2_OS_LINUX; 6451e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o else if (strcasecmp(os, "GNU") == 0 || strcasecmp(os, "hurd") == 0) 6461e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o sb->s_creator_os = EXT2_OS_HURD; 647ea1e8f471ea7f9e8e8eee002bdd37afee4af14acTheodore Ts'o else if (strcasecmp(os, "freebsd") == 0) 648ea1e8f471ea7f9e8e8eee002bdd37afee4af14acTheodore Ts'o sb->s_creator_os = EXT2_OS_FREEBSD; 649ea1e8f471ea7f9e8e8eee002bdd37afee4af14acTheodore Ts'o else if (strcasecmp(os, "lites") == 0) 650ea1e8f471ea7f9e8e8eee002bdd37afee4af14acTheodore Ts'o sb->s_creator_os = EXT2_OS_LITES; 6511e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o else 6521e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o return 0; 6531e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o return 1; 6541e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o} 6551e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o 656a418d3ad819323f871005d253f7f9ac378e78ba5Theodore Ts'o#define PATH_SET "PATH=/sbin" 657a418d3ad819323f871005d253f7f9ac378e78ba5Theodore Ts'o 658efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'ostatic void parse_extended_opts(struct ext2_super_block *param, 659c6a44136b9b82625e7b36a574ddb3a08b6727e97Theodore Ts'o const char *opts) 660a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o{ 6612d328bb76d2d63bdfdba923b54c28bd686bd8fecTheodore Ts'o char *buf, *token, *next, *p, *arg, *badopt = 0; 662a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o int len; 663d323f8fb369089b97d6f3bf0f8d64ceeab0b10f5Theodore Ts'o int r_usage = 0; 664a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o 665a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o len = strlen(opts); 666a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o buf = malloc(len+1); 667a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o if (!buf) { 668e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fprintf(stderr, "%s", 669d323f8fb369089b97d6f3bf0f8d64ceeab0b10f5Theodore Ts'o _("Couldn't allocate memory to parse options!\n")); 670a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o exit(1); 671a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o } 672a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o strcpy(buf, opts); 673a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o for (token = buf; token && *token; token = next) { 674a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o p = strchr(token, ','); 675a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o next = 0; 676a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o if (p) { 677a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o *p = 0; 678a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o next = p+1; 679d323f8fb369089b97d6f3bf0f8d64ceeab0b10f5Theodore Ts'o } 680a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o arg = strchr(token, '='); 681a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o if (arg) { 682a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o *arg = 0; 683a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o arg++; 684a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o } 685e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (strcmp(token, "desc-size") == 0 || 686e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall strcmp(token, "desc_size") == 0) { 687e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall int desc_size; 688e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 689e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (!(fs_param.s_feature_incompat & 690e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXT4_FEATURE_INCOMPAT_64BIT)) { 691e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fprintf(stderr, 692e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall _("%s requires '-O 64bit'\n"), token); 693e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall r_usage++; 694e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall continue; 695e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 696e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (param->s_reserved_gdt_blocks != 0) { 697e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fprintf(stderr, 698e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall _("'%s' must be before 'resize=%u'\n"), 699e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall token, param->s_reserved_gdt_blocks); 700e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall r_usage++; 701e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall continue; 702e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 703e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (!arg) { 704e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall r_usage++; 705e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall badopt = token; 706e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall continue; 707e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 708e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall desc_size = strtoul(arg, &p, 0); 709e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (*p || (desc_size & (desc_size - 1))) { 710e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fprintf(stderr, 711e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall _("Invalid desc_size: '%s'\n"), arg); 712e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall r_usage++; 713e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall continue; 714e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 715e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall param->s_desc_size = desc_size; 716e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } else if (strcmp(token, "mmp_update_interval") == 0) { 717e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (!arg) { 718e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall r_usage++; 719e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall badopt = token; 720e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall continue; 721e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 722e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall param->s_mmp_update_interval = strtoul(arg, &p, 0); 723e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (*p) { 724e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fprintf(stderr, 725e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall _("Invalid mmp_update_interval: %s\n"), 726e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall arg); 727e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall r_usage++; 728e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall continue; 729e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 730e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } else if (strcmp(token, "stride") == 0) { 731a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o if (!arg) { 732d323f8fb369089b97d6f3bf0f8d64ceeab0b10f5Theodore Ts'o r_usage++; 7330c17cb25f24730dca138a976a390f105d2191736Theodore Ts'o badopt = token; 734a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o continue; 735a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o } 7360c17cb25f24730dca138a976a390f105d2191736Theodore Ts'o param->s_raid_stride = strtoul(arg, &p, 0); 737e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (*p) { 738d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o fprintf(stderr, 739f37ab68a26bacf4f5cc7643b8373e40292b7682aTheodore Ts'o _("Invalid stride parameter: %s\n"), 740f37ab68a26bacf4f5cc7643b8373e40292b7682aTheodore Ts'o arg); 741d323f8fb369089b97d6f3bf0f8d64ceeab0b10f5Theodore Ts'o r_usage++; 742d323f8fb369089b97d6f3bf0f8d64ceeab0b10f5Theodore Ts'o continue; 743d323f8fb369089b97d6f3bf0f8d64ceeab0b10f5Theodore Ts'o } 7440c17cb25f24730dca138a976a390f105d2191736Theodore Ts'o } else if (strcmp(token, "stripe-width") == 0 || 7450c17cb25f24730dca138a976a390f105d2191736Theodore Ts'o strcmp(token, "stripe_width") == 0) { 7460c17cb25f24730dca138a976a390f105d2191736Theodore Ts'o if (!arg) { 7470c17cb25f24730dca138a976a390f105d2191736Theodore Ts'o r_usage++; 7480c17cb25f24730dca138a976a390f105d2191736Theodore Ts'o badopt = token; 7490c17cb25f24730dca138a976a390f105d2191736Theodore Ts'o continue; 7500c17cb25f24730dca138a976a390f105d2191736Theodore Ts'o } 7510c17cb25f24730dca138a976a390f105d2191736Theodore Ts'o param->s_raid_stripe_width = strtoul(arg, &p, 0); 752e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (*p) { 7530c17cb25f24730dca138a976a390f105d2191736Theodore Ts'o fprintf(stderr, 7540c17cb25f24730dca138a976a390f105d2191736Theodore Ts'o _("Invalid stripe-width parameter: %s\n"), 7550c17cb25f24730dca138a976a390f105d2191736Theodore Ts'o arg); 7560c17cb25f24730dca138a976a390f105d2191736Theodore Ts'o r_usage++; 7570c17cb25f24730dca138a976a390f105d2191736Theodore Ts'o continue; 7580c17cb25f24730dca138a976a390f105d2191736Theodore Ts'o } 759d323f8fb369089b97d6f3bf0f8d64ceeab0b10f5Theodore Ts'o } else if (!strcmp(token, "resize")) { 760e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall blk64_t resize; 761e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall unsigned long bpg, rsv_groups; 762c6a44136b9b82625e7b36a574ddb3a08b6727e97Theodore Ts'o unsigned long group_desc_count, desc_blocks; 763c6a44136b9b82625e7b36a574ddb3a08b6727e97Theodore Ts'o unsigned int gdpb, blocksize; 764c6a44136b9b82625e7b36a574ddb3a08b6727e97Theodore Ts'o int rsv_gdb; 765d323f8fb369089b97d6f3bf0f8d64ceeab0b10f5Theodore Ts'o 766d323f8fb369089b97d6f3bf0f8d64ceeab0b10f5Theodore Ts'o if (!arg) { 767d323f8fb369089b97d6f3bf0f8d64ceeab0b10f5Theodore Ts'o r_usage++; 7680c17cb25f24730dca138a976a390f105d2191736Theodore Ts'o badopt = token; 769a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o continue; 770a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o } 771d323f8fb369089b97d6f3bf0f8d64ceeab0b10f5Theodore Ts'o 772e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall resize = parse_num_blocks2(arg, 773e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall param->s_log_block_size); 774d323f8fb369089b97d6f3bf0f8d64ceeab0b10f5Theodore Ts'o 775d323f8fb369089b97d6f3bf0f8d64ceeab0b10f5Theodore Ts'o if (resize == 0) { 776efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o fprintf(stderr, 77755f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o _("Invalid resize parameter: %s\n"), 77855f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o arg); 779d323f8fb369089b97d6f3bf0f8d64ceeab0b10f5Theodore Ts'o r_usage++; 780d323f8fb369089b97d6f3bf0f8d64ceeab0b10f5Theodore Ts'o continue; 781d323f8fb369089b97d6f3bf0f8d64ceeab0b10f5Theodore Ts'o } 782e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (resize <= ext2fs_blocks_count(param)) { 783e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fprintf(stderr, "%s", 784f37ab68a26bacf4f5cc7643b8373e40292b7682aTheodore Ts'o _("The resize maximum must be greater " 785f37ab68a26bacf4f5cc7643b8373e40292b7682aTheodore Ts'o "than the filesystem size.\n")); 786c6a44136b9b82625e7b36a574ddb3a08b6727e97Theodore Ts'o r_usage++; 787c6a44136b9b82625e7b36a574ddb3a08b6727e97Theodore Ts'o continue; 788c6a44136b9b82625e7b36a574ddb3a08b6727e97Theodore Ts'o } 789d323f8fb369089b97d6f3bf0f8d64ceeab0b10f5Theodore Ts'o 790c6a44136b9b82625e7b36a574ddb3a08b6727e97Theodore Ts'o blocksize = EXT2_BLOCK_SIZE(param); 791c6a44136b9b82625e7b36a574ddb3a08b6727e97Theodore Ts'o bpg = param->s_blocks_per_group; 792c6a44136b9b82625e7b36a574ddb3a08b6727e97Theodore Ts'o if (!bpg) 793c6a44136b9b82625e7b36a574ddb3a08b6727e97Theodore Ts'o bpg = blocksize * 8; 794f2de1d38d0819b17895977fabc52d81d0ea6ec00Valerie Clement gdpb = EXT2_DESC_PER_BLOCK(param); 795e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall group_desc_count = (__u32) ext2fs_div64_ceil( 796e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_blocks_count(param), bpg); 797c6a44136b9b82625e7b36a574ddb3a08b6727e97Theodore Ts'o desc_blocks = (group_desc_count + 798c6a44136b9b82625e7b36a574ddb3a08b6727e97Theodore Ts'o gdpb - 1) / gdpb; 799e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall rsv_groups = ext2fs_div64_ceil(resize, bpg); 800efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o rsv_gdb = ext2fs_div_ceil(rsv_groups, gdpb) - 801c6a44136b9b82625e7b36a574ddb3a08b6727e97Theodore Ts'o desc_blocks; 8029b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o if (rsv_gdb > (int) EXT2_ADDR_PER_BLOCK(param)) 803c6a44136b9b82625e7b36a574ddb3a08b6727e97Theodore Ts'o rsv_gdb = EXT2_ADDR_PER_BLOCK(param); 804c6a44136b9b82625e7b36a574ddb3a08b6727e97Theodore Ts'o 805c6a44136b9b82625e7b36a574ddb3a08b6727e97Theodore Ts'o if (rsv_gdb > 0) { 806b290d2dc35411479e09328ef8d9c6220c33f2c49Theodore Ts'o if (param->s_rev_level == EXT2_GOOD_OLD_REV) { 807e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fprintf(stderr, "%s", 808b290d2dc35411479e09328ef8d9c6220c33f2c49Theodore Ts'o _("On-line resizing not supported with revision 0 filesystems\n")); 80921400381d90a1e58443e1e2c3f52f8fd5550be9dBrian Behlendorf free(buf); 810b290d2dc35411479e09328ef8d9c6220c33f2c49Theodore Ts'o exit(1); 811b290d2dc35411479e09328ef8d9c6220c33f2c49Theodore Ts'o } 812c6a44136b9b82625e7b36a574ddb3a08b6727e97Theodore Ts'o param->s_feature_compat |= 813c6a44136b9b82625e7b36a574ddb3a08b6727e97Theodore Ts'o EXT2_FEATURE_COMPAT_RESIZE_INODE; 814c6a44136b9b82625e7b36a574ddb3a08b6727e97Theodore Ts'o 815c6a44136b9b82625e7b36a574ddb3a08b6727e97Theodore Ts'o param->s_reserved_gdt_blocks = rsv_gdb; 816c6a44136b9b82625e7b36a574ddb3a08b6727e97Theodore Ts'o } 8176cb27404f51f97e2665fa0e0c4c0f7bc47e698ecTheodore Ts'o } else if (!strcmp(token, "test_fs")) { 8186cb27404f51f97e2665fa0e0c4c0f7bc47e698ecTheodore Ts'o param->s_flags |= EXT2_FLAGS_TEST_FILESYS; 819a4396e9d5d1351c53212bf7ff10f97edeb576438Theodore Ts'o } else if (!strcmp(token, "lazy_itable_init")) { 82043781b9459f1b511e4cf94358593e097d8fdb795Theodore Ts'o if (arg) 82143781b9459f1b511e4cf94358593e097d8fdb795Theodore Ts'o lazy_itable_init = strtoul(arg, &p, 0); 82243781b9459f1b511e4cf94358593e097d8fdb795Theodore Ts'o else 82343781b9459f1b511e4cf94358593e097d8fdb795Theodore Ts'o lazy_itable_init = 1; 824e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } else if (!strcmp(token, "lazy_journal_init")) { 825e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (arg) 826e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall journal_flags |= strtoul(arg, &p, 0) ? 827e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXT2_MKJOURNAL_LAZYINIT : 0; 828e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall else 829e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall journal_flags |= EXT2_MKJOURNAL_LAZYINIT; 830e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } else if (!strcmp(token, "root_owner")) { 831e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (arg) { 832e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall root_uid = strtoul(arg, &p, 0); 833e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (*p != ':') { 834e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fprintf(stderr, 835e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall _("Invalid root_owner: '%s'\n"), 836e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall arg); 837e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall r_usage++; 838e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall continue; 839e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 840e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall p++; 841e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall root_gid = strtoul(p, &p, 0); 842e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (*p) { 843e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fprintf(stderr, 844e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall _("Invalid root_owner: '%s'\n"), 845e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall arg); 846e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall r_usage++; 847e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall continue; 848e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 849e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } else { 850e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall root_uid = getuid(); 851e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall root_gid = getgid(); 852e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 8530bc85dfb384b470e6170268c8436fcbe58317cbeLukas Czerner } else if (!strcmp(token, "discard")) { 8540bc85dfb384b470e6170268c8436fcbe58317cbeLukas Czerner discard = 1; 8550bc85dfb384b470e6170268c8436fcbe58317cbeLukas Czerner } else if (!strcmp(token, "nodiscard")) { 8560bc85dfb384b470e6170268c8436fcbe58317cbeLukas Czerner discard = 0; 857e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } else if (!strcmp(token, "quotatype")) { 858e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (!arg) { 859e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall r_usage++; 860e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall badopt = token; 861e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall continue; 862e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 863e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (!strncmp(arg, "usr", 3)) { 864e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall quotatype = 0; 865e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } else if (!strncmp(arg, "grp", 3)) { 866e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall quotatype = 1; 867e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } else { 868e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fprintf(stderr, 869e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall _("Invalid quotatype parameter: %s\n"), 870e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall arg); 871e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall r_usage++; 872e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall continue; 873e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 8740c17cb25f24730dca138a976a390f105d2191736Theodore Ts'o } else { 875d323f8fb369089b97d6f3bf0f8d64ceeab0b10f5Theodore Ts'o r_usage++; 8760c17cb25f24730dca138a976a390f105d2191736Theodore Ts'o badopt = token; 8770c17cb25f24730dca138a976a390f105d2191736Theodore Ts'o } 878a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o } 879d323f8fb369089b97d6f3bf0f8d64ceeab0b10f5Theodore Ts'o if (r_usage) { 8800c17cb25f24730dca138a976a390f105d2191736Theodore Ts'o fprintf(stderr, _("\nBad option(s) specified: %s\n\n" 881bb145b01cf5fd27d9afe03c3262d0e1a326e7ec1Theodore Ts'o "Extended options are separated by commas, " 882a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o "and may take an argument which\n" 883a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o "\tis set off by an equals ('=') sign.\n\n" 884bb145b01cf5fd27d9afe03c3262d0e1a326e7ec1Theodore Ts'o "Valid extended options are:\n" 8850c17cb25f24730dca138a976a390f105d2191736Theodore Ts'o "\tstride=<RAID per-disk data chunk in blocks>\n" 8860c17cb25f24730dca138a976a390f105d2191736Theodore Ts'o "\tstripe-width=<RAID stride * data disks in blocks>\n" 887a4396e9d5d1351c53212bf7ff10f97edeb576438Theodore Ts'o "\tresize=<resize maximum size in blocks>\n" 888a4396e9d5d1351c53212bf7ff10f97edeb576438Theodore Ts'o "\tlazy_itable_init=<0 to disable, 1 to enable>\n" 889e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "\tlazy_journal_init=<0 to disable, 1 to enable>\n" 890e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "\troot_uid=<uid of root directory>\n" 891e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "\troot_gid=<gid of root directory>\n" 8920bc85dfb384b470e6170268c8436fcbe58317cbeLukas Czerner "\ttest_fs\n" 8930bc85dfb384b470e6170268c8436fcbe58317cbeLukas Czerner "\tdiscard\n" 894e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "\tnodiscard\n" 895e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "\tquotatype=<usr OR grp>\n\n"), 8962d328bb76d2d63bdfdba923b54c28bd686bd8fecTheodore Ts'o badopt ? badopt : ""); 89721400381d90a1e58443e1e2c3f52f8fd5550be9dBrian Behlendorf free(buf); 898a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o exit(1); 899a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o } 9000c17cb25f24730dca138a976a390f105d2191736Theodore Ts'o if (param->s_raid_stride && 9010c17cb25f24730dca138a976a390f105d2191736Theodore Ts'o (param->s_raid_stripe_width % param->s_raid_stride) != 0) 9020c17cb25f24730dca138a976a390f105d2191736Theodore Ts'o fprintf(stderr, _("\nWarning: RAID stripe-width %u not an even " 9030c17cb25f24730dca138a976a390f105d2191736Theodore Ts'o "multiple of stride %u.\n\n"), 9040c17cb25f24730dca138a976a390f105d2191736Theodore Ts'o param->s_raid_stripe_width, param->s_raid_stride); 9050c17cb25f24730dca138a976a390f105d2191736Theodore Ts'o 90621400381d90a1e58443e1e2c3f52f8fd5550be9dBrian Behlendorf free(buf); 907efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o} 908a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o 909896938d57e7091e7a032674dfeeb91f2a17fd78bTheodore Ts'ostatic __u32 ok_features[3] = { 910558df54458075856b3a76051648323643a56dadcTheodore Ts'o /* Compat */ 911843049c4dbfe8a0dd4332569eff0ac93529e3324Theodore Ts'o EXT3_FEATURE_COMPAT_HAS_JOURNAL | 912d323f8fb369089b97d6f3bf0f8d64ceeab0b10f5Theodore Ts'o EXT2_FEATURE_COMPAT_RESIZE_INODE | 913f5fa20078bfc05b554294fe9c5505375d7913e8cTheodore Ts'o EXT2_FEATURE_COMPAT_DIR_INDEX | 914558df54458075856b3a76051648323643a56dadcTheodore Ts'o EXT2_FEATURE_COMPAT_EXT_ATTR, 915558df54458075856b3a76051648323643a56dadcTheodore Ts'o /* Incompat */ 916558df54458075856b3a76051648323643a56dadcTheodore Ts'o EXT2_FEATURE_INCOMPAT_FILETYPE| 917bf6b848e1247610b4fba091de87b61f4b2b92a11Theodore Ts'o EXT3_FEATURE_INCOMPAT_EXTENTS| 918c046ac7f2e4c53e20cf1e909bbe511f91074b396Theodore Ts'o EXT3_FEATURE_INCOMPAT_JOURNAL_DEV| 919c2d4300b8a4a13d8a78b86c386f76259f23feec2Jose R. Santos EXT2_FEATURE_INCOMPAT_META_BG| 920e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXT4_FEATURE_INCOMPAT_FLEX_BG| 921e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXT4_FEATURE_INCOMPAT_MMP | 922e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXT4_FEATURE_INCOMPAT_64BIT, 923558df54458075856b3a76051648323643a56dadcTheodore Ts'o /* R/O compat */ 924558df54458075856b3a76051648323643a56dadcTheodore Ts'o EXT2_FEATURE_RO_COMPAT_LARGE_FILE| 9252be8fe43976537b75a6ee154ff3ba47e538b55fbTheodore Ts'o EXT4_FEATURE_RO_COMPAT_HUGE_FILE| 9262be8fe43976537b75a6ee154ff3ba47e538b55fbTheodore Ts'o EXT4_FEATURE_RO_COMPAT_DIR_NLINK| 9272be8fe43976537b75a6ee154ff3ba47e538b55fbTheodore Ts'o EXT4_FEATURE_RO_COMPAT_EXTRA_ISIZE| 928d2d22a29df4632d548149b123f197102eb39d3b0Jose R. Santos EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER| 929e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXT4_FEATURE_RO_COMPAT_GDT_CSUM| 930e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXT4_FEATURE_RO_COMPAT_BIGALLOC| 931e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef CONFIG_QUOTA 932e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXT4_FEATURE_RO_COMPAT_QUOTA| 933e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif 934e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 0 935896938d57e7091e7a032674dfeeb91f2a17fd78bTheodore Ts'o}; 936a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o 937a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o 9389dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'ostatic void syntax_err_report(const char *filename, long err, int line_num) 9399dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o{ 940efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o fprintf(stderr, 9419dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o _("Syntax error in mke2fs config file (%s, line #%d)\n\t%s\n"), 9429dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o filename, line_num, error_message(err)); 9439dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o exit(1); 9449dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o} 9459dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o 946abcfdfda7a5932cbb27ff243ed962119db2599a4Matthias Andreestatic const char *config_fn[] = { ROOT_SYSCONFDIR "/mke2fs.conf", 0 }; 9479dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o 948efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'ostatic void edit_feature(const char *str, __u32 *compat_array) 9499dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o{ 9509dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o if (!str) 9519dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o return; 9529dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o 9539dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o if (e2p_edit_feature(str, compat_array, ok_features)) { 954efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o fprintf(stderr, _("Invalid filesystem option set: %s\n"), 9559dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o str); 9569dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o exit(1); 9579dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o } 9589dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o} 9599dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o 960e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic void edit_mntopts(const char *str, __u32 *mntopts) 961e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 962e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (!str) 963e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall return; 964e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 965e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (e2p_edit_mntopts(str, mntopts, ~0)) { 966e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fprintf(stderr, _("Invalid mount option set: %s\n"), 967e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall str); 968e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall exit(1); 969e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 970e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 971e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 9723d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'ostruct str_list { 9733d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o char **list; 9743d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o int num; 9753d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o int max; 9763d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o}; 9773d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o 9783d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'ostatic errcode_t init_list(struct str_list *sl) 9793d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o{ 9803d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o sl->num = 0; 9813d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o sl->max = 0; 9823d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o sl->list = malloc((sl->max+1) * sizeof(char *)); 9833d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o if (!sl->list) 9843d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o return ENOMEM; 9853d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o sl->list[0] = 0; 9863d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o return 0; 9873d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o} 9883d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o 9893d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'ostatic errcode_t push_string(struct str_list *sl, const char *str) 9903d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o{ 9913d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o char **new_list; 9923d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o 9933d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o if (sl->num >= sl->max) { 9943d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o sl->max += 2; 9953d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o new_list = realloc(sl->list, (sl->max+1) * sizeof(char *)); 9963d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o if (!new_list) 9973d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o return ENOMEM; 9983d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o sl->list = new_list; 9993d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o } 10003d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o sl->list[sl->num] = malloc(strlen(str)+1); 10013d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o if (sl->list[sl->num] == 0) 10023d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o return ENOMEM; 10033d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o strcpy(sl->list[sl->num], str); 10043d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o sl->num++; 10053d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o sl->list[sl->num] = 0; 10063d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o return 0; 10073d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o} 10083d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o 10093d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'ostatic void print_str_list(char **list) 10103d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o{ 10113d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o char **cpp; 10123d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o 10133d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o for (cpp = list; *cpp; cpp++) { 10143d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o printf("'%s'", *cpp); 10153d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o if (cpp[1]) 10163d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o fputs(", ", stdout); 10173d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o } 10183d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o fputc('\n', stdout); 10193d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o} 10203d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o 10212ee4544d07af35a6a667400cca35657e37d55c3bTheodore Ts'o/* 10222ee4544d07af35a6a667400cca35657e37d55c3bTheodore Ts'o * Return TRUE if the profile has the given subsection 10232ee4544d07af35a6a667400cca35657e37d55c3bTheodore Ts'o */ 1024e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic int profile_has_subsection(profile_t prof, const char *section, 10252ee4544d07af35a6a667400cca35657e37d55c3bTheodore Ts'o const char *subsection) 10262ee4544d07af35a6a667400cca35657e37d55c3bTheodore Ts'o{ 10272ee4544d07af35a6a667400cca35657e37d55c3bTheodore Ts'o void *state; 10282ee4544d07af35a6a667400cca35657e37d55c3bTheodore Ts'o const char *names[4]; 10292ee4544d07af35a6a667400cca35657e37d55c3bTheodore Ts'o char *name; 10302ee4544d07af35a6a667400cca35657e37d55c3bTheodore Ts'o int ret = 0; 10312ee4544d07af35a6a667400cca35657e37d55c3bTheodore Ts'o 10322ee4544d07af35a6a667400cca35657e37d55c3bTheodore Ts'o names[0] = section; 10332ee4544d07af35a6a667400cca35657e37d55c3bTheodore Ts'o names[1] = subsection; 10342ee4544d07af35a6a667400cca35657e37d55c3bTheodore Ts'o names[2] = 0; 10352ee4544d07af35a6a667400cca35657e37d55c3bTheodore Ts'o 1036e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (profile_iterator_create(prof, names, 10372ee4544d07af35a6a667400cca35657e37d55c3bTheodore Ts'o PROFILE_ITER_LIST_SECTION | 10382ee4544d07af35a6a667400cca35657e37d55c3bTheodore Ts'o PROFILE_ITER_RELATIONS_ONLY, &state)) 10392ee4544d07af35a6a667400cca35657e37d55c3bTheodore Ts'o return 0; 10402ee4544d07af35a6a667400cca35657e37d55c3bTheodore Ts'o 10412ee4544d07af35a6a667400cca35657e37d55c3bTheodore Ts'o if ((profile_iterator(&state, &name, 0) == 0) && name) { 10422ee4544d07af35a6a667400cca35657e37d55c3bTheodore Ts'o free(name); 10432ee4544d07af35a6a667400cca35657e37d55c3bTheodore Ts'o ret = 1; 10442ee4544d07af35a6a667400cca35657e37d55c3bTheodore Ts'o } 10452ee4544d07af35a6a667400cca35657e37d55c3bTheodore Ts'o 10462ee4544d07af35a6a667400cca35657e37d55c3bTheodore Ts'o profile_iterator_free(&state); 10472ee4544d07af35a6a667400cca35657e37d55c3bTheodore Ts'o return ret; 10482ee4544d07af35a6a667400cca35657e37d55c3bTheodore Ts'o} 10492ee4544d07af35a6a667400cca35657e37d55c3bTheodore Ts'o 10503d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'ostatic char **parse_fs_type(const char *fs_type, 10513d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o const char *usage_types, 1052e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall struct ext2_super_block *sb, 1053e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall blk64_t fs_blocks_count, 10543d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o char *progname) 10553d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o{ 10563d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o const char *ext_type = 0; 10573d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o char *parse_str; 10583d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o char *profile_type = 0; 10593d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o char *cp, *t; 10603d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o const char *size_type; 10613d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o struct str_list list; 1062e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall unsigned long long meg; 10637f5601e5b5dd733c23ca73f965d37d49547150abTheodore Ts'o int is_hurd = 0; 10643d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o 10653d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o if (init_list(&list)) 10663d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o return 0; 10673d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o 10687f5601e5b5dd733c23ca73f965d37d49547150abTheodore Ts'o if (creator_os && (!strcasecmp(creator_os, "GNU") || 10697f5601e5b5dd733c23ca73f965d37d49547150abTheodore Ts'o !strcasecmp(creator_os, "hurd"))) 10707f5601e5b5dd733c23ca73f965d37d49547150abTheodore Ts'o is_hurd = 1; 10717f5601e5b5dd733c23ca73f965d37d49547150abTheodore Ts'o 10723d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o if (fs_type) 10733d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o ext_type = fs_type; 10747f5601e5b5dd733c23ca73f965d37d49547150abTheodore Ts'o else if (is_hurd) 10757f5601e5b5dd733c23ca73f965d37d49547150abTheodore Ts'o ext_type = "ext2"; 10761a71bd42003d87ff96e3e0e8c293b44c8783e9baTheodore Ts'o else if (!strcmp(program_name, "mke3fs")) 10771a71bd42003d87ff96e3e0e8c293b44c8783e9baTheodore Ts'o ext_type = "ext3"; 1078e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall else if (!strcmp(program_name, "mke4fs")) 1079e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext_type = "ext4"; 10803d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o else if (progname) { 10813d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o ext_type = strrchr(progname, '/'); 10823d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o if (ext_type) 10833d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o ext_type++; 10843d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o else 10853d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o ext_type = progname; 10863d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o 10873d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o if (!strncmp(ext_type, "mkfs.", 5)) { 10883d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o ext_type += 5; 10893d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o if (ext_type[0] == 0) 10903d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o ext_type = 0; 10913d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o } else 10923d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o ext_type = 0; 10933d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o } 10943d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o 10953d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o if (!ext_type) { 10963d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o profile_get_string(profile, "defaults", "fs_type", 0, 10973d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o "ext2", &profile_type); 10983d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o ext_type = profile_type; 10993d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o if (!strcmp(ext_type, "ext2") && (journal_size != 0)) 11003d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o ext_type = "ext3"; 11013d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o } 11023d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o 11032ee4544d07af35a6a667400cca35657e37d55c3bTheodore Ts'o 11042ee4544d07af35a6a667400cca35657e37d55c3bTheodore Ts'o if (!profile_has_subsection(profile, "fs_types", ext_type) && 11052ee4544d07af35a6a667400cca35657e37d55c3bTheodore Ts'o strcmp(ext_type, "ext2")) { 11062ee4544d07af35a6a667400cca35657e37d55c3bTheodore Ts'o printf(_("\nYour mke2fs.conf file does not define the " 11072ee4544d07af35a6a667400cca35657e37d55c3bTheodore Ts'o "%s filesystem type.\n"), ext_type); 11082ee4544d07af35a6a667400cca35657e37d55c3bTheodore Ts'o if (!strcmp(ext_type, "ext3") || !strcmp(ext_type, "ext4") || 11092ee4544d07af35a6a667400cca35657e37d55c3bTheodore Ts'o !strcmp(ext_type, "ext4dev")) { 1110e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf("%s", _("You probably need to install an " 1111e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "updated mke2fs.conf file.\n\n")); 11122ee4544d07af35a6a667400cca35657e37d55c3bTheodore Ts'o } 11132ee4544d07af35a6a667400cca35657e37d55c3bTheodore Ts'o if (!force) { 1114e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf("%s", _("Aborting...\n")); 11152ee4544d07af35a6a667400cca35657e37d55c3bTheodore Ts'o exit(1); 1116bad89b2af3ffa43c9570d93c3d9d9adacc194f9aTheodore Ts'o } 1117bad89b2af3ffa43c9570d93c3d9d9adacc194f9aTheodore Ts'o } 1118bad89b2af3ffa43c9570d93c3d9d9adacc194f9aTheodore Ts'o 1119e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall meg = (1024 * 1024) / EXT2_BLOCK_SIZE(sb); 1120e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (fs_blocks_count < 3 * meg) 11213d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o size_type = "floppy"; 1122e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall else if (fs_blocks_count < 512 * meg) 11233d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o size_type = "small"; 1124e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall else if (fs_blocks_count < 4 * 1024 * 1024 * meg) 112565f0aab98b20b5994a726ab90d355248bcddfffdJP Abgrall size_type = "default"; 1126e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall else if (fs_blocks_count < 16 * 1024 * 1024 * meg) 1127e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall size_type = "big"; 1128e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall else 1129e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall size_type = "huge"; 11303d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o 11313d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o if (!usage_types) 11323d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o usage_types = size_type; 11333d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o 1134e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall parse_str = malloc(strlen(usage_types)+1); 11353d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o if (!parse_str) { 1136e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall free(profile_type); 11373d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o free(list.list); 11383d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o return 0; 11393d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o } 1140e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall strcpy(parse_str, usage_types); 11413d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o 11423d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o if (ext_type) 11433d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o push_string(&list, ext_type); 11443d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o cp = parse_str; 11453d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o while (1) { 11463d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o t = strchr(cp, ','); 11473d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o if (t) 11483d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o *t = '\0'; 11493d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o 11502ee4544d07af35a6a667400cca35657e37d55c3bTheodore Ts'o if (*cp) { 11510f7479b34048c6cf48a539c411552ef1542ee0b8Theodore Ts'o if (profile_has_subsection(profile, "fs_types", cp)) 11520f7479b34048c6cf48a539c411552ef1542ee0b8Theodore Ts'o push_string(&list, cp); 11530f7479b34048c6cf48a539c411552ef1542ee0b8Theodore Ts'o else if (strcmp(cp, "default") != 0) 11542ee4544d07af35a6a667400cca35657e37d55c3bTheodore Ts'o fprintf(stderr, 11552ee4544d07af35a6a667400cca35657e37d55c3bTheodore Ts'o _("\nWarning: the fs_type %s is not " 11560f7479b34048c6cf48a539c411552ef1542ee0b8Theodore Ts'o "defined in mke2fs.conf\n\n"), 11572ee4544d07af35a6a667400cca35657e37d55c3bTheodore Ts'o cp); 11582ee4544d07af35a6a667400cca35657e37d55c3bTheodore Ts'o } 11593d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o if (t) 11603d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o cp = t+1; 1161e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall else 11623d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o break; 11633d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o } 11643d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o free(parse_str); 116545e338f5332a54295893dba2e32cc093d1316f60Jim Meyering free(profile_type); 11667f5601e5b5dd733c23ca73f965d37d49547150abTheodore Ts'o if (is_hurd) 11677f5601e5b5dd733c23ca73f965d37d49547150abTheodore Ts'o push_string(&list, "hurd"); 11683d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o return (list.list); 11693d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o} 11703d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o 1171e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic char *get_string_from_profile(char **types, const char *opt, 11723d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o const char *def_val) 11733d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o{ 11743d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o char *ret = 0; 11753d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o int i; 11763d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o 1177e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall for (i=0; types[i]; i++); 11783d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o for (i-=1; i >=0 ; i--) { 1179e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall profile_get_string(profile, "fs_types", types[i], 11803d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o opt, 0, &ret); 11813d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o if (ret) 11823d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o return ret; 11833d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o } 11843d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o profile_get_string(profile, "defaults", opt, 0, def_val, &ret); 11853d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o return (ret); 11863d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o} 11873d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o 1188e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic int get_int_from_profile(char **types, const char *opt, int def_val) 11893d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o{ 11903d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o int ret; 11913d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o char **cpp; 11923d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o 11933d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o profile_get_integer(profile, "defaults", opt, 0, def_val, &ret); 1194e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall for (cpp = types; *cpp; cpp++) 11953d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o profile_get_integer(profile, "fs_types", *cpp, opt, ret, &ret); 11963d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o return ret; 11973d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o} 11983d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o 1199e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic double get_double_from_profile(char **types, const char *opt, 1200e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall double def_val) 1201e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 1202e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall double ret; 1203e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall char **cpp; 1204e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 1205e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall profile_get_double(profile, "defaults", opt, 0, def_val, &ret); 1206e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall for (cpp = types; *cpp; cpp++) 1207e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall profile_get_double(profile, "fs_types", *cpp, opt, ret, &ret); 1208e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall return ret; 1209e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 1210e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 1211e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic int get_bool_from_profile(char **types, const char *opt, int def_val) 1212a4396e9d5d1351c53212bf7ff10f97edeb576438Theodore Ts'o{ 1213a4396e9d5d1351c53212bf7ff10f97edeb576438Theodore Ts'o int ret; 1214a4396e9d5d1351c53212bf7ff10f97edeb576438Theodore Ts'o char **cpp; 1215a4396e9d5d1351c53212bf7ff10f97edeb576438Theodore Ts'o 1216a4396e9d5d1351c53212bf7ff10f97edeb576438Theodore Ts'o profile_get_boolean(profile, "defaults", opt, 0, def_val, &ret); 1217e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall for (cpp = types; *cpp; cpp++) 1218a4396e9d5d1351c53212bf7ff10f97edeb576438Theodore Ts'o profile_get_boolean(profile, "fs_types", *cpp, opt, ret, &ret); 1219a4396e9d5d1351c53212bf7ff10f97edeb576438Theodore Ts'o return ret; 1220a4396e9d5d1351c53212bf7ff10f97edeb576438Theodore Ts'o} 12213d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o 1222d48bc60459f3552d2f229d8ec041b7eb36787541Theodore Ts'oextern const char *mke2fs_default_profile; 1223d48bc60459f3552d2f229d8ec041b7eb36787541Theodore Ts'ostatic const char *default_files[] = { "<default>", 0 }; 1224d48bc60459f3552d2f229d8ec041b7eb36787541Theodore Ts'o 12259ed8e5fec226aa53634ed95cbeac736d90a518e5Eric Sandeen#ifdef HAVE_BLKID_PROBE_GET_TOPOLOGY 12269ed8e5fec226aa53634ed95cbeac736d90a518e5Eric Sandeen/* 12279ed8e5fec226aa53634ed95cbeac736d90a518e5Eric Sandeen * Sets the geometry of a device (stripe/stride), and returns the 12289ed8e5fec226aa53634ed95cbeac736d90a518e5Eric Sandeen * device's alignment offset, if any, or a negative error. 12299ed8e5fec226aa53634ed95cbeac736d90a518e5Eric Sandeen */ 12301599b470fb881313c1d44594f05d578c43825312Theodore Ts'ostatic int get_device_geometry(const char *file, 12311599b470fb881313c1d44594f05d578c43825312Theodore Ts'o struct ext2_super_block *fs_param, 12321599b470fb881313c1d44594f05d578c43825312Theodore Ts'o int psector_size) 12339ed8e5fec226aa53634ed95cbeac736d90a518e5Eric Sandeen{ 12349ed8e5fec226aa53634ed95cbeac736d90a518e5Eric Sandeen int rc = -1; 12359ed8e5fec226aa53634ed95cbeac736d90a518e5Eric Sandeen int blocksize; 12369ed8e5fec226aa53634ed95cbeac736d90a518e5Eric Sandeen blkid_probe pr; 12379ed8e5fec226aa53634ed95cbeac736d90a518e5Eric Sandeen blkid_topology tp; 12389ed8e5fec226aa53634ed95cbeac736d90a518e5Eric Sandeen unsigned long min_io; 12399ed8e5fec226aa53634ed95cbeac736d90a518e5Eric Sandeen unsigned long opt_io; 124013b0b1231ed28aac75ba336de7a8cb3b4611ce68Eric Sandeen struct stat statbuf; 124113b0b1231ed28aac75ba336de7a8cb3b4611ce68Eric Sandeen 124213b0b1231ed28aac75ba336de7a8cb3b4611ce68Eric Sandeen /* Nothing to do for a regular file */ 124313b0b1231ed28aac75ba336de7a8cb3b4611ce68Eric Sandeen if (!stat(file, &statbuf) && S_ISREG(statbuf.st_mode)) 124413b0b1231ed28aac75ba336de7a8cb3b4611ce68Eric Sandeen return 0; 12459ed8e5fec226aa53634ed95cbeac736d90a518e5Eric Sandeen 12469ed8e5fec226aa53634ed95cbeac736d90a518e5Eric Sandeen pr = blkid_new_probe_from_filename(file); 12479ed8e5fec226aa53634ed95cbeac736d90a518e5Eric Sandeen if (!pr) 12489ed8e5fec226aa53634ed95cbeac736d90a518e5Eric Sandeen goto out; 12499ed8e5fec226aa53634ed95cbeac736d90a518e5Eric Sandeen 12509ed8e5fec226aa53634ed95cbeac736d90a518e5Eric Sandeen tp = blkid_probe_get_topology(pr); 12519ed8e5fec226aa53634ed95cbeac736d90a518e5Eric Sandeen if (!tp) 12529ed8e5fec226aa53634ed95cbeac736d90a518e5Eric Sandeen goto out; 12539ed8e5fec226aa53634ed95cbeac736d90a518e5Eric Sandeen 12549ed8e5fec226aa53634ed95cbeac736d90a518e5Eric Sandeen min_io = blkid_topology_get_minimum_io_size(tp); 12559ed8e5fec226aa53634ed95cbeac736d90a518e5Eric Sandeen opt_io = blkid_topology_get_optimal_io_size(tp); 12569ed8e5fec226aa53634ed95cbeac736d90a518e5Eric Sandeen blocksize = EXT2_BLOCK_SIZE(fs_param); 12571599b470fb881313c1d44594f05d578c43825312Theodore Ts'o if ((min_io == 0) && (psector_size > blocksize)) 12581599b470fb881313c1d44594f05d578c43825312Theodore Ts'o min_io = psector_size; 12591599b470fb881313c1d44594f05d578c43825312Theodore Ts'o if ((opt_io == 0) && min_io) 12601599b470fb881313c1d44594f05d578c43825312Theodore Ts'o opt_io = min_io; 12611599b470fb881313c1d44594f05d578c43825312Theodore Ts'o if ((opt_io == 0) && (psector_size > blocksize)) 12621599b470fb881313c1d44594f05d578c43825312Theodore Ts'o opt_io = psector_size; 12639ed8e5fec226aa53634ed95cbeac736d90a518e5Eric Sandeen 1264e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall /* setting stripe/stride to blocksize is pointless */ 1265e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (min_io > blocksize) 1266e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fs_param->s_raid_stride = min_io / blocksize; 1267e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (opt_io > blocksize) 1268e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fs_param->s_raid_stripe_width = opt_io / blocksize; 12699ed8e5fec226aa53634ed95cbeac736d90a518e5Eric Sandeen 12709ed8e5fec226aa53634ed95cbeac736d90a518e5Eric Sandeen rc = blkid_topology_get_alignment_offset(tp); 12719ed8e5fec226aa53634ed95cbeac736d90a518e5Eric Sandeenout: 12729ed8e5fec226aa53634ed95cbeac736d90a518e5Eric Sandeen blkid_free_probe(pr); 12739ed8e5fec226aa53634ed95cbeac736d90a518e5Eric Sandeen return rc; 12749ed8e5fec226aa53634ed95cbeac736d90a518e5Eric Sandeen} 12759ed8e5fec226aa53634ed95cbeac736d90a518e5Eric Sandeen#endif 12769ed8e5fec226aa53634ed95cbeac736d90a518e5Eric Sandeen 12773839e65723771b85975f4263102dd3ceec4523cTheodore Ts'ostatic void PRS(int argc, char *argv[]) 12783839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 1279c5290fae3937cc83de8a551db9686d1e1964e378Theodore Ts'o int b, c; 1280e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall int cluster_size = 0; 128179e62409b3a247e258d9e9206484ed8f193a183eEric Sandeen char *tmp, **cpp; 12824a6005666e1f62442cb55fabd946f454605e340eTheodore Ts'o int blocksize = 0; 12834a6005666e1f62442cb55fabd946f454605e340eTheodore Ts'o int inode_ratio = 0; 1284932a489cdf6bc83d69e59d3f8e0a57b733799ce1Andreas Dilger int inode_size = 0; 12859ba400027fb00ce43d14673346bbfb6f5719985aTheodore Ts'o unsigned long flex_bg_size = 0; 1286e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall double reserved_ratio = -1.0; 1287bb1158b92ed8a12ab9e9317ca6ddd97bc12447d3Theodore Ts'o int lsector_size = 0, psector_size = 0; 12881e6e4c5e5c8313a877881f800f07dcdd7bee5dd2Theodore Ts'o int show_version_only = 0; 1289de8f3a76218255e443ba57dec5d74850180fa75dAndreas Dilger unsigned long long num_inodes = 0; /* unsigned long long to catch too-large input */ 1290a418d3ad819323f871005d253f7f9ac378e78ba5Theodore Ts'o errcode_t retval; 12914a6005666e1f62442cb55fabd946f454605e340eTheodore Ts'o char * oldpath = getenv("PATH"); 1292c6a44136b9b82625e7b36a574ddb3a08b6727e97Theodore Ts'o char * extended_opts = 0; 1293e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall char * fs_type = 0; 1294e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall char * usage_types = 0; 1295e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall blk64_t dev_size; 1296e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall /* 1297e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * NOTE: A few words about fs_blocks_count and blocksize: 1298e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * 1299e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Initially, blocksize is set to zero, which implies 1024. 1300e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * If -b is specified, blocksize is updated to the user's value. 1301e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * 1302e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Next, the device size or the user's "blocks" command line argument 1303e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * is used to set fs_blocks_count; the units are blocksize. 1304e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * 1305e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Later, if blocksize hasn't been set and the profile specifies a 1306e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * blocksize, then blocksize is updated and fs_blocks_count is scaled 1307e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * appropriately. Note the change in units! 1308e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * 1309e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Finally, we complain about fs_blocks_count > 2^32 on a non-64bit fs. 1310e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 1311e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall blk64_t fs_blocks_count = 0; 1312756df353e8ffd010fcca8cef8972cf27006edb6aTheodore Ts'o#ifdef __linux__ 13134a6005666e1f62442cb55fabd946f454605e340eTheodore Ts'o struct utsname ut; 13142740156bd12747389eaf745529653b26a3a9d73dTheodore Ts'o#endif 131531e29a12d1e22745c74afe47bf172a3c73280dd9Theodore Ts'o long sysval; 13169dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o int s_opt = -1, r_opt = -1; 13179dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o char *fs_features = 0; 13189dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o int use_bsize; 1319642935c082ca22e1186fc9926fe06e4207d5ab56Theodore Ts'o char *newpath; 1320642935c082ca22e1186fc9926fe06e4207d5ab56Theodore Ts'o int pathlen = sizeof(PATH_SET) + 1; 1321642935c082ca22e1186fc9926fe06e4207d5ab56Theodore Ts'o 1322642935c082ca22e1186fc9926fe06e4207d5ab56Theodore Ts'o if (oldpath) 1323642935c082ca22e1186fc9926fe06e4207d5ab56Theodore Ts'o pathlen += strlen(oldpath); 1324642935c082ca22e1186fc9926fe06e4207d5ab56Theodore Ts'o newpath = malloc(pathlen); 1325e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (!newpath) { 1326e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fprintf(stderr, "%s", 1327e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall _("Couldn't allocate memory for new PATH.\n")); 1328e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall exit(1); 1329e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 1330642935c082ca22e1186fc9926fe06e4207d5ab56Theodore Ts'o strcpy(newpath, PATH_SET); 133114bbcbc31c3aa413b866f49001c517ca9e83d7d8Theodore Ts'o 13323839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o /* Update our PATH to include /sbin */ 1333a418d3ad819323f871005d253f7f9ac378e78ba5Theodore Ts'o if (oldpath) { 1334a418d3ad819323f871005d253f7f9ac378e78ba5Theodore Ts'o strcat (newpath, ":"); 1335a418d3ad819323f871005d253f7f9ac378e78ba5Theodore Ts'o strcat (newpath, oldpath); 1336642935c082ca22e1186fc9926fe06e4207d5ab56Theodore Ts'o } 1337642935c082ca22e1186fc9926fe06e4207d5ab56Theodore Ts'o putenv (newpath); 13383839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 133916ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o tmp = getenv("MKE2FS_SYNC"); 134016ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o if (tmp) 134116ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o sync_kludge = atoi(tmp); 134231e29a12d1e22745c74afe47bf172a3c73280dd9Theodore Ts'o 134331e29a12d1e22745c74afe47bf172a3c73280dd9Theodore Ts'o /* Determine the system page size if possible */ 134431e29a12d1e22745c74afe47bf172a3c73280dd9Theodore Ts'o#ifdef HAVE_SYSCONF 134531e29a12d1e22745c74afe47bf172a3c73280dd9Theodore Ts'o#if (!defined(_SC_PAGESIZE) && defined(_SC_PAGE_SIZE)) 134631e29a12d1e22745c74afe47bf172a3c73280dd9Theodore Ts'o#define _SC_PAGESIZE _SC_PAGE_SIZE 134731e29a12d1e22745c74afe47bf172a3c73280dd9Theodore Ts'o#endif 134831e29a12d1e22745c74afe47bf172a3c73280dd9Theodore Ts'o#ifdef _SC_PAGESIZE 134931e29a12d1e22745c74afe47bf172a3c73280dd9Theodore Ts'o sysval = sysconf(_SC_PAGESIZE); 1350aab6fe735d7658cf0e61f2d7bbcffcd3f3d40601Andreas Dilger if (sysval > 0) 135131e29a12d1e22745c74afe47bf172a3c73280dd9Theodore Ts'o sys_page_size = sysval; 135231e29a12d1e22745c74afe47bf172a3c73280dd9Theodore Ts'o#endif /* _SC_PAGESIZE */ 135331e29a12d1e22745c74afe47bf172a3c73280dd9Theodore Ts'o#endif /* HAVE_SYSCONF */ 13549dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o 13559dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o if ((tmp = getenv("MKE2FS_CONFIG")) != NULL) 13569dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o config_fn[0] = tmp; 13579dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o profile_set_syntax_err_cb(syntax_err_report); 1358d48bc60459f3552d2f229d8ec041b7eb36787541Theodore Ts'o retval = profile_init(config_fn, &profile); 1359d48bc60459f3552d2f229d8ec041b7eb36787541Theodore Ts'o if (retval == ENOENT) { 1360e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall retval = profile_init(default_files, &profile); 1361e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (retval) 1362e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall goto profile_error; 1363e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall retval = profile_set_default(profile, mke2fs_default_profile); 1364e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (retval) 1365e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall goto profile_error; 1366e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } else if (retval) { 1367e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallprofile_error: 1368e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fprintf(stderr, _("Couldn't init profile successfully" 1369e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall " (error: %ld).\n"), retval); 1370e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall exit(1); 1371d48bc60459f3552d2f229d8ec041b7eb36787541Theodore Ts'o } 1372efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 13733839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o setbuf(stdout, NULL); 13743839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o setbuf(stderr, NULL); 1375a6d8302b4873527798a77c1ba3106a04b71dfeacTheodore Ts'o add_error_table(&et_ext2_error_table); 1376a6d8302b4873527798a77c1ba3106a04b71dfeacTheodore Ts'o add_error_table(&et_prof_error_table); 13779b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o memset(&fs_param, 0, sizeof(struct ext2_super_block)); 13789b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o fs_param.s_rev_level = 1; /* Create revision 1 filesystems now */ 1379843049c4dbfe8a0dd4332569eff0ac93529e3324Theodore Ts'o 1380756df353e8ffd010fcca8cef8972cf27006edb6aTheodore Ts'o#ifdef __linux__ 138114bbcbc31c3aa413b866f49001c517ca9e83d7d8Theodore Ts'o if (uname(&ut)) { 138214bbcbc31c3aa413b866f49001c517ca9e83d7d8Theodore Ts'o perror("uname"); 138314bbcbc31c3aa413b866f49001c517ca9e83d7d8Theodore Ts'o exit(1); 138414bbcbc31c3aa413b866f49001c517ca9e83d7d8Theodore Ts'o } 1385d99225ecceb580d497c649daa4894fa2e10019adTheodore Ts'o linux_version_code = parse_version_number(ut.release); 13869dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o if (linux_version_code && linux_version_code < (2*65536 + 2*256)) 13879b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o fs_param.s_rev_level = 0; 138814bbcbc31c3aa413b866f49001c517ca9e83d7d8Theodore Ts'o#endif 13890072f8de528310d82700b1a6a381895b4ca93c10Andreas Dilger 13900072f8de528310d82700b1a6a381895b4ca93c10Andreas Dilger if (argc && *argv) { 13910072f8de528310d82700b1a6a381895b4ca93c10Andreas Dilger program_name = get_progname(*argv); 13920072f8de528310d82700b1a6a381895b4ca93c10Andreas Dilger 13930072f8de528310d82700b1a6a381895b4ca93c10Andreas Dilger /* If called as mkfs.ext3, create a journal inode */ 13941a71bd42003d87ff96e3e0e8c293b44c8783e9baTheodore Ts'o if (!strcmp(program_name, "mkfs.ext3") || 13951a71bd42003d87ff96e3e0e8c293b44c8783e9baTheodore Ts'o !strcmp(program_name, "mke3fs")) 13960072f8de528310d82700b1a6a381895b4ca93c10Andreas Dilger journal_size = -1; 13970072f8de528310d82700b1a6a381895b4ca93c10Andreas Dilger } 13980072f8de528310d82700b1a6a381895b4ca93c10Andreas Dilger 13991e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o while ((c = getopt (argc, argv, 1400e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "b:cg:i:jl:m:no:qr:s:t:vC:DE:FG:I:J:KL:M:N:O:R:ST:U:V")) != EOF) { 14013839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o switch (c) { 14023839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o case 'b': 1403e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall blocksize = parse_num_blocks2(optarg, -1); 1404c5290fae3937cc83de8a551db9686d1e1964e378Theodore Ts'o b = (blocksize > 0) ? blocksize : -blocksize; 1405c5290fae3937cc83de8a551db9686d1e1964e378Theodore Ts'o if (b < EXT2_MIN_BLOCK_SIZE || 1406e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall b > EXT2_MAX_BLOCK_SIZE) { 1407d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o com_err(program_name, 0, 1408f37ab68a26bacf4f5cc7643b8373e40292b7682aTheodore Ts'o _("invalid block size - %s"), optarg); 14093839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o exit(1); 14103839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 1411932a489cdf6bc83d69e59d3f8e0a57b733799ce1Andreas Dilger if (blocksize > 4096) 1412932a489cdf6bc83d69e59d3f8e0a57b733799ce1Andreas Dilger fprintf(stderr, _("Warning: blocksize %d not " 1413932a489cdf6bc83d69e59d3f8e0a57b733799ce1Andreas Dilger "usable on most systems.\n"), 1414932a489cdf6bc83d69e59d3f8e0a57b733799ce1Andreas Dilger blocksize); 1415efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o if (blocksize > 0) 14169b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o fs_param.s_log_block_size = 1417c5290fae3937cc83de8a551db9686d1e1964e378Theodore Ts'o int_log2(blocksize >> 1418c5290fae3937cc83de8a551db9686d1e1964e378Theodore Ts'o EXT2_MIN_BLOCK_LOG_SIZE); 14193839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o break; 1420b10fd5e84ec7ea0e843b09e7c44784f072b8fdb7Theodore Ts'o case 'c': /* Check for bad blocks */ 14213ed57c27df0ba0942a19c71bc065c8eec3036567Theodore Ts'o cflag++; 14223839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o break; 1423e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall case 'C': 1424e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall cluster_size = parse_num_blocks2(optarg, -1); 1425e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (cluster_size <= EXT2_MIN_CLUSTER_SIZE || 1426e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall cluster_size > EXT2_MAX_CLUSTER_SIZE) { 1427d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o com_err(program_name, 0, 1428e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall _("invalid cluster size - %s"), 14293839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o optarg); 14303839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o exit(1); 14313839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 1432e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall break; 1433e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall case 'D': 1434e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall direct_io = 1; 1435e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall break; 1436e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall case 'R': 1437e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err(program_name, 0, "%s", 1438e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall _("'-R' is deprecated, use '-E' instead")); 1439e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall /* fallthrough */ 1440e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall case 'E': 1441e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall extended_opts = optarg; 1442e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall break; 1443e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall case 'F': 1444e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall force++; 14452a83b3c3741bdc9a1b2af73114c778f4b21a9ab1Andreas Dilger break; 14463839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o case 'g': 14479b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o fs_param.s_blocks_per_group = strtoul(optarg, &tmp, 0); 1448f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o if (*tmp) { 1449e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err(program_name, 0, "%s", 1450e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall _("Illegal number for blocks per group")); 1451f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o exit(1); 1452f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o } 14539b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o if ((fs_param.s_blocks_per_group % 8) != 0) { 1454e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err(program_name, 0, "%s", 1455d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o _("blocks per group must be multiple of 8")); 14563839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o exit(1); 14573839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 14583839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o break; 14599ba400027fb00ce43d14673346bbfb6f5719985aTheodore Ts'o case 'G': 14609ba400027fb00ce43d14673346bbfb6f5719985aTheodore Ts'o flex_bg_size = strtoul(optarg, &tmp, 0); 14619ba400027fb00ce43d14673346bbfb6f5719985aTheodore Ts'o if (*tmp) { 1462e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err(program_name, 0, "%s", 14639ba400027fb00ce43d14673346bbfb6f5719985aTheodore Ts'o _("Illegal number for flex_bg size")); 14649ba400027fb00ce43d14673346bbfb6f5719985aTheodore Ts'o exit(1); 14659ba400027fb00ce43d14673346bbfb6f5719985aTheodore Ts'o } 1466d531450cdd9c9c356cce5bdb3634bccff31156f7Theodore Ts'o if (flex_bg_size < 1 || 14679ba400027fb00ce43d14673346bbfb6f5719985aTheodore Ts'o (flex_bg_size & (flex_bg_size-1)) != 0) { 1468e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err(program_name, 0, "%s", 14699ba400027fb00ce43d14673346bbfb6f5719985aTheodore Ts'o _("flex_bg size must be a power of 2")); 14709ba400027fb00ce43d14673346bbfb6f5719985aTheodore Ts'o exit(1); 14719ba400027fb00ce43d14673346bbfb6f5719985aTheodore Ts'o } 14729ba400027fb00ce43d14673346bbfb6f5719985aTheodore Ts'o break; 14733839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o case 'i': 14743839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o inode_ratio = strtoul(optarg, &tmp, 0); 1475932a489cdf6bc83d69e59d3f8e0a57b733799ce1Andreas Dilger if (inode_ratio < EXT2_MIN_BLOCK_SIZE || 1476932a489cdf6bc83d69e59d3f8e0a57b733799ce1Andreas Dilger inode_ratio > EXT2_MAX_BLOCK_SIZE * 1024 || 14773839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o *tmp) { 1478d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o com_err(program_name, 0, 1479bb145b01cf5fd27d9afe03c3262d0e1a326e7ec1Theodore Ts'o _("invalid inode ratio %s (min %d/max %d)"), 1480932a489cdf6bc83d69e59d3f8e0a57b733799ce1Andreas Dilger optarg, EXT2_MIN_BLOCK_SIZE, 1481e447ba3731b8f6849e4df4c8081b73a9c99a23f4Tim Small EXT2_MAX_BLOCK_SIZE * 1024); 14823839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o exit(1); 14833839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 14843839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o break; 1485e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall case 'I': 1486e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall inode_size = strtoul(optarg, &tmp, 0); 1487e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (*tmp) { 1488e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err(program_name, 0, 1489e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall _("invalid inode size - %s"), optarg); 1490e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall exit(1); 1491e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 1492e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall break; 1493e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall case 'j': 1494e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (!journal_size) 1495e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall journal_size = -1; 1496e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall break; 1497dc2ec525f5619bf478d2aae1b406fca2ff4b0d21Theodore Ts'o case 'J': 1498dc2ec525f5619bf478d2aae1b406fca2ff4b0d21Theodore Ts'o parse_journal_opts(optarg); 1499dc2ec525f5619bf478d2aae1b406fca2ff4b0d21Theodore Ts'o break; 15005827d2412d0774cb6294521a0ea578975fed07ceEric Sandeen case 'K': 1501e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fprintf(stderr, "%s", 1502e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall _("Warning: -K option is deprecated and " 1503e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "should not be used anymore. Use " 1504e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "\'-E nodiscard\' extended option " 1505e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "instead!\n")); 15065827d2412d0774cb6294521a0ea578975fed07ceEric Sandeen discard = 0; 15075827d2412d0774cb6294521a0ea578975fed07ceEric Sandeen break; 15083839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o case 'l': 1509e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall bad_blocks_filename = realloc(bad_blocks_filename, 1510e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall strlen(optarg) + 1); 1511f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o if (!bad_blocks_filename) { 1512e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err(program_name, ENOMEM, "%s", 1513d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o _("in malloc for bad_blocks_filename")); 1514f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o exit(1); 1515f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o } 1516f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o strcpy(bad_blocks_filename, optarg); 15173839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o break; 1518e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall case 'L': 1519e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall volume_label = optarg; 1520e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall break; 15213839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o case 'm': 1522ce911145ed0fdd1918ee0c80d407c3e778dc64eeAndreas Dilger reserved_ratio = strtod(optarg, &tmp); 15238d8224550c1f5b5c77afbf5acd95f73979276a0aTheodore Ts'o if ( *tmp || reserved_ratio > 50 || 15248d8224550c1f5b5c77afbf5acd95f73979276a0aTheodore Ts'o reserved_ratio < 0) { 15253839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o com_err(program_name, 0, 1526bb145b01cf5fd27d9afe03c3262d0e1a326e7ec1Theodore Ts'o _("invalid reserved blocks percent - %s"), 15273839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o optarg); 15283839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o exit(1); 15293839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 15303839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o break; 1531e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall case 'M': 1532e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall mount_dir = optarg; 1533e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall break; 153450787ea22edd8b4662203daf3569411d9dcf4287Theodore Ts'o case 'n': 153550787ea22edd8b4662203daf3569411d9dcf4287Theodore Ts'o noaction++; 153650787ea22edd8b4662203daf3569411d9dcf4287Theodore Ts'o break; 1537e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall case 'N': 1538e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall num_inodes = strtoul(optarg, &tmp, 0); 1539e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (*tmp) { 1540e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err(program_name, 0, 1541e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall _("bad num inodes - %s"), optarg); 1542e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall exit(1); 1543e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 1544e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall break; 15451e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o case 'o': 15461e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o creator_os = optarg; 15471e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o break; 1548e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall case 'O': 1549e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fs_features = optarg; 1550e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall break; 15512524785d5daf9457c01aa4d1a9ee1c9c20dfbfd9Andreas Dilger case 'q': 15522524785d5daf9457c01aa4d1a9ee1c9c20dfbfd9Andreas Dilger quiet = 1; 15532524785d5daf9457c01aa4d1a9ee1c9c20dfbfd9Andreas Dilger break; 15547f88b04341d88c5df0360d930832c38040303b61Theodore Ts'o case 'r': 15559dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o r_opt = strtoul(optarg, &tmp, 0); 15562524785d5daf9457c01aa4d1a9ee1c9c20dfbfd9Andreas Dilger if (*tmp) { 15572524785d5daf9457c01aa4d1a9ee1c9c20dfbfd9Andreas Dilger com_err(program_name, 0, 15582524785d5daf9457c01aa4d1a9ee1c9c20dfbfd9Andreas Dilger _("bad revision level - %s"), optarg); 15592524785d5daf9457c01aa4d1a9ee1c9c20dfbfd9Andreas Dilger exit(1); 15602524785d5daf9457c01aa4d1a9ee1c9c20dfbfd9Andreas Dilger } 15619dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o fs_param.s_rev_level = r_opt; 15627f88b04341d88c5df0360d930832c38040303b61Theodore Ts'o break; 1563b10fd5e84ec7ea0e843b09e7c44784f072b8fdb7Theodore Ts'o case 's': /* deprecated */ 15649dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o s_opt = atoi(optarg); 1565521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o break; 1566f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o case 'S': 1567f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o super_only = 1; 1568f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o break; 15693d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o case 't': 1570e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (fs_type) { 1571e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err(program_name, 0, "%s", 1572e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall _("The -t option may only be used once")); 1573e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall exit(1); 1574e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 1575e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fs_type = strdup(optarg); 157650787ea22edd8b4662203daf3569411d9dcf4287Theodore Ts'o break; 15773d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o case 'T': 1578e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (usage_types) { 1579e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err(program_name, 0, "%s", 1580e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall _("The -T option may only be used once")); 1581e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall exit(1); 1582e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 1583e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall usage_types = strdup(optarg); 15843d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o break; 1585b0afdda1bc044026336009576fbe6b72884140cbTheodore Ts'o case 'U': 1586b0afdda1bc044026336009576fbe6b72884140cbTheodore Ts'o fs_uuid = optarg; 1587b0afdda1bc044026336009576fbe6b72884140cbTheodore Ts'o break; 1588e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall case 'v': 1589e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall verbose = 1; 1590e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall break; 1591818180cdfcff84b9048ecdc5dc86323f0fefba24Theodore Ts'o case 'V': 1592818180cdfcff84b9048ecdc5dc86323f0fefba24Theodore Ts'o /* Print version number and exit */ 15931e6e4c5e5c8313a877881f800f07dcdd7bee5dd2Theodore Ts'o show_version_only++; 15941e6e4c5e5c8313a877881f800f07dcdd7bee5dd2Theodore Ts'o break; 15953839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o default: 15963839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o usage(); 15973839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 15983839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 159955f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o if ((optind == argc) && !show_version_only) 16003839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o usage(); 160155f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o device_name = argv[optind++]; 1602a418d3ad819323f871005d253f7f9ac378e78ba5Theodore Ts'o 16031e6e4c5e5c8313a877881f800f07dcdd7bee5dd2Theodore Ts'o if (!quiet || show_version_only) 1604efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o fprintf (stderr, "mke2fs %s (%s)\n", E2FSPROGS_VERSION, 16053879857e86ab5dc83dcb38a93868262f4fb61c4dTheodore Ts'o E2FSPROGS_DATE); 16063879857e86ab5dc83dcb38a93868262f4fb61c4dTheodore Ts'o 16071e6e4c5e5c8313a877881f800f07dcdd7bee5dd2Theodore Ts'o if (show_version_only) { 1608efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o fprintf(stderr, _("\tUsing %s\n"), 16091e6e4c5e5c8313a877881f800f07dcdd7bee5dd2Theodore Ts'o error_message(EXT2_ET_BASE)); 16101e6e4c5e5c8313a877881f800f07dcdd7bee5dd2Theodore Ts'o exit(0); 16111e6e4c5e5c8313a877881f800f07dcdd7bee5dd2Theodore Ts'o } 16121e6e4c5e5c8313a877881f800f07dcdd7bee5dd2Theodore Ts'o 161377dc4eb04c21664cef8d4fb048ccb952ccef778cTheodore Ts'o /* 161477dc4eb04c21664cef8d4fb048ccb952ccef778cTheodore Ts'o * If there's no blocksize specified and there is a journal 161577dc4eb04c21664cef8d4fb048ccb952ccef778cTheodore Ts'o * device, use it to figure out the blocksize 161677dc4eb04c21664cef8d4fb048ccb952ccef778cTheodore Ts'o */ 1617c5290fae3937cc83de8a551db9686d1e1964e378Theodore Ts'o if (blocksize <= 0 && journal_device) { 161877dc4eb04c21664cef8d4fb048ccb952ccef778cTheodore Ts'o ext2_filsys jfs; 1619a7ccdff8e128c24564011d760a996496b0a981b3Theodore Ts'o io_manager io_ptr; 162077dc4eb04c21664cef8d4fb048ccb952ccef778cTheodore Ts'o 1621a7ccdff8e128c24564011d760a996496b0a981b3Theodore Ts'o#ifdef CONFIG_TESTIO_DEBUG 1622f38cf3cb34addaa53d1f855d7607b151082a4229Theodore Ts'o if (getenv("TEST_IO_FLAGS") || getenv("TEST_IO_BLOCK")) { 1623f38cf3cb34addaa53d1f855d7607b151082a4229Theodore Ts'o io_ptr = test_io_manager; 1624f38cf3cb34addaa53d1f855d7607b151082a4229Theodore Ts'o test_io_backing_manager = unix_io_manager; 1625f38cf3cb34addaa53d1f855d7607b151082a4229Theodore Ts'o } else 1626a7ccdff8e128c24564011d760a996496b0a981b3Theodore Ts'o#endif 1627f38cf3cb34addaa53d1f855d7607b151082a4229Theodore Ts'o io_ptr = unix_io_manager; 162877dc4eb04c21664cef8d4fb048ccb952ccef778cTheodore Ts'o retval = ext2fs_open(journal_device, 162977dc4eb04c21664cef8d4fb048ccb952ccef778cTheodore Ts'o EXT2_FLAG_JOURNAL_DEV_OK, 0, 1630a7ccdff8e128c24564011d760a996496b0a981b3Theodore Ts'o 0, io_ptr, &jfs); 163177dc4eb04c21664cef8d4fb048ccb952ccef778cTheodore Ts'o if (retval) { 163277dc4eb04c21664cef8d4fb048ccb952ccef778cTheodore Ts'o com_err(program_name, retval, 163377dc4eb04c21664cef8d4fb048ccb952ccef778cTheodore Ts'o _("while trying to open journal device %s\n"), 163477dc4eb04c21664cef8d4fb048ccb952ccef778cTheodore Ts'o journal_device); 163577dc4eb04c21664cef8d4fb048ccb952ccef778cTheodore Ts'o exit(1); 163677dc4eb04c21664cef8d4fb048ccb952ccef778cTheodore Ts'o } 1637544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o if ((blocksize < 0) && (jfs->blocksize < (unsigned) (-blocksize))) { 1638c5290fae3937cc83de8a551db9686d1e1964e378Theodore Ts'o com_err(program_name, 0, 1639ddc32a045bd3bd35968ace2dbe22179470baec0bTheodore Ts'o _("Journal dev blocksize (%d) smaller than " 1640c5290fae3937cc83de8a551db9686d1e1964e378Theodore Ts'o "minimum blocksize %d\n"), jfs->blocksize, 1641c5290fae3937cc83de8a551db9686d1e1964e378Theodore Ts'o -blocksize); 1642c5290fae3937cc83de8a551db9686d1e1964e378Theodore Ts'o exit(1); 1643c5290fae3937cc83de8a551db9686d1e1964e378Theodore Ts'o } 164477dc4eb04c21664cef8d4fb048ccb952ccef778cTheodore Ts'o blocksize = jfs->blocksize; 1645f8df04bcc638585ee73cb795153f4456279b9b85Theodore Ts'o printf(_("Using journal device's blocksize: %d\n"), blocksize); 16469b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o fs_param.s_log_block_size = 164777dc4eb04c21664cef8d4fb048ccb952ccef778cTheodore Ts'o int_log2(blocksize >> EXT2_MIN_BLOCK_LOG_SIZE); 164877dc4eb04c21664cef8d4fb048ccb952ccef778cTheodore Ts'o ext2fs_close(jfs); 164977dc4eb04c21664cef8d4fb048ccb952ccef778cTheodore Ts'o } 1650dc2ec525f5619bf478d2aae1b406fca2ff4b0d21Theodore Ts'o 165155f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o if (optind < argc) { 1652e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fs_blocks_count = parse_num_blocks2(argv[optind++], 1653e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fs_param.s_log_block_size); 1654e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (!fs_blocks_count) { 1655792cce309207b44b26fd925b9ca43d9ed5518651Eric Sandeen com_err(program_name, 0, 1656e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall _("invalid blocks '%s' on device '%s'"), 1657792cce309207b44b26fd925b9ca43d9ed5518651Eric Sandeen argv[optind - 1], device_name); 165855f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o exit(1); 165955f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o } 166055f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o } 166155f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o if (optind < argc) 166255f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o usage(); 166355f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o 166474becf3c0a065f8d64e07ce4d31f9fe53be91d62Theodore Ts'o if (!force) 16658ddaa66bfef067f1a6ba02698a61a0fd3a26e618Theodore Ts'o check_plausibility(device_name); 166663985320384bf143eaac9857af424800d9867a1aTheodore Ts'o check_mount(device_name, force, _("filesystem")); 1667a418d3ad819323f871005d253f7f9ac378e78ba5Theodore Ts'o 1668e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall /* Determine the size of the device (if possible) */ 1669e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (noaction && fs_blocks_count) { 1670e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall dev_size = fs_blocks_count; 167150787ea22edd8b4662203daf3569411d9dcf4287Theodore Ts'o retval = 0; 1672e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } else 167365f0aab98b20b5994a726ab90d355248bcddfffdJP Abgrall retval = ext2fs_get_device_size2(device_name, 1674e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXT2_BLOCK_SIZE(&fs_param), 1675e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall &dev_size); 1676e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 1677a789d8406070224503c9ab78040acc7ea80c65aeTheodore Ts'o if (retval && (retval != EXT2_ET_UNIMPLEMENTED)) { 1678e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err(program_name, retval, "%s", 1679d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o _("while trying to determine filesystem size")); 1680a789d8406070224503c9ab78040acc7ea80c65aeTheodore Ts'o exit(1); 1681a789d8406070224503c9ab78040acc7ea80c65aeTheodore Ts'o } 1682e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (!fs_blocks_count) { 1683a789d8406070224503c9ab78040acc7ea80c65aeTheodore Ts'o if (retval == EXT2_ET_UNIMPLEMENTED) { 1684e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err(program_name, 0, "%s", 1685d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o _("Couldn't determine device size; you " 1686a789d8406070224503c9ab78040acc7ea80c65aeTheodore Ts'o "must specify\nthe size of the " 1687d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o "filesystem\n")); 1688a418d3ad819323f871005d253f7f9ac378e78ba5Theodore Ts'o exit(1); 168926ab531523a319682a099c9a91aa3b8aeab2835cTheodore Ts'o } else { 169026ab531523a319682a099c9a91aa3b8aeab2835cTheodore Ts'o if (dev_size == 0) { 1691e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err(program_name, 0, "%s", 169226ab531523a319682a099c9a91aa3b8aeab2835cTheodore Ts'o _("Device size reported to be zero. " 169326ab531523a319682a099c9a91aa3b8aeab2835cTheodore Ts'o "Invalid partition specified, or\n\t" 169426ab531523a319682a099c9a91aa3b8aeab2835cTheodore Ts'o "partition table wasn't reread " 169526ab531523a319682a099c9a91aa3b8aeab2835cTheodore Ts'o "after running fdisk, due to\n\t" 169626ab531523a319682a099c9a91aa3b8aeab2835cTheodore Ts'o "a modified partition being busy " 169726ab531523a319682a099c9a91aa3b8aeab2835cTheodore Ts'o "and in use. You may need to reboot\n\t" 169826ab531523a319682a099c9a91aa3b8aeab2835cTheodore Ts'o "to re-read your partition table.\n" 169926ab531523a319682a099c9a91aa3b8aeab2835cTheodore Ts'o )); 170026ab531523a319682a099c9a91aa3b8aeab2835cTheodore Ts'o exit(1); 170126ab531523a319682a099c9a91aa3b8aeab2835cTheodore Ts'o } 1702e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fs_blocks_count = dev_size; 1703493024ea1d74e4cb48aac3a24111f5c8da343e9fTheodore Ts'o if (sys_page_size > EXT2_BLOCK_SIZE(&fs_param)) 1704e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fs_blocks_count &= ~((blk64_t) ((sys_page_size / 1705e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXT2_BLOCK_SIZE(&fs_param))-1)); 17064efbac6fed75c29d3d5f1b676b932754653a2ac5Valerie Aurora Henson } 1707e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } else if (!force && (fs_blocks_count > dev_size)) { 1708e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err(program_name, 0, "%s", 1709c5290fae3937cc83de8a551db9686d1e1964e378Theodore Ts'o _("Filesystem larger than apparent device size.")); 1710a789d8406070224503c9ab78040acc7ea80c65aeTheodore Ts'o proceed_question(); 1711a418d3ad819323f871005d253f7f9ac378e78ba5Theodore Ts'o } 17123839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 1713e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (!fs_type) 1714e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall profile_get_string(profile, "devices", device_name, 1715e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "fs_type", 0, &fs_type); 1716e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (!usage_types) 1717e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall profile_get_string(profile, "devices", device_name, 1718e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "usage_types", 0, &usage_types); 1719e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 1720e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall /* 1721e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * We have the file system (or device) size, so we can now 1722e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * determine the appropriate file system types so the fs can 1723e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * be appropriately configured. 1724e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 1725e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fs_types = parse_fs_type(fs_type, usage_types, &fs_param, 1726e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fs_blocks_count ? fs_blocks_count : dev_size, 1727e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall argv[0]); 17289b27e9cc320dd7da24356561b3b12c66f2540432Theodore Ts'o if (!fs_types) { 1729e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fprintf(stderr, "%s", _("Failed to parse fs types list\n")); 17309b27e9cc320dd7da24356561b3b12c66f2540432Theodore Ts'o exit(1); 17319b27e9cc320dd7da24356561b3b12c66f2540432Theodore Ts'o } 17329b27e9cc320dd7da24356561b3b12c66f2540432Theodore Ts'o 17339b27e9cc320dd7da24356561b3b12c66f2540432Theodore Ts'o /* Figure out what features should be enabled */ 17349b27e9cc320dd7da24356561b3b12c66f2540432Theodore Ts'o 17359b27e9cc320dd7da24356561b3b12c66f2540432Theodore Ts'o tmp = NULL; 17369b27e9cc320dd7da24356561b3b12c66f2540432Theodore Ts'o if (fs_param.s_rev_level != EXT2_GOOD_OLD_REV) { 17379b27e9cc320dd7da24356561b3b12c66f2540432Theodore Ts'o tmp = get_string_from_profile(fs_types, "base_features", 17389b27e9cc320dd7da24356561b3b12c66f2540432Theodore Ts'o "sparse_super,filetype,resize_inode,dir_index"); 17399b27e9cc320dd7da24356561b3b12c66f2540432Theodore Ts'o edit_feature(tmp, &fs_param.s_feature_compat); 17409b27e9cc320dd7da24356561b3b12c66f2540432Theodore Ts'o free(tmp); 17419b27e9cc320dd7da24356561b3b12c66f2540432Theodore Ts'o 1742e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall /* And which mount options as well */ 1743e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall tmp = get_string_from_profile(fs_types, "default_mntopts", 1744e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "acl,user_xattr"); 1745e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall edit_mntopts(tmp, &fs_param.s_default_mount_opts); 1746e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (tmp) 1747e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall free(tmp); 1748e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 17499b27e9cc320dd7da24356561b3b12c66f2540432Theodore Ts'o for (cpp = fs_types; *cpp; cpp++) { 17509b27e9cc320dd7da24356561b3b12c66f2540432Theodore Ts'o tmp = NULL; 17519b27e9cc320dd7da24356561b3b12c66f2540432Theodore Ts'o profile_get_string(profile, "fs_types", *cpp, 17529b27e9cc320dd7da24356561b3b12c66f2540432Theodore Ts'o "features", "", &tmp); 17539b27e9cc320dd7da24356561b3b12c66f2540432Theodore Ts'o if (tmp && *tmp) 17549b27e9cc320dd7da24356561b3b12c66f2540432Theodore Ts'o edit_feature(tmp, &fs_param.s_feature_compat); 1755e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (tmp) 1756e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall free(tmp); 17579b27e9cc320dd7da24356561b3b12c66f2540432Theodore Ts'o } 17589b27e9cc320dd7da24356561b3b12c66f2540432Theodore Ts'o tmp = get_string_from_profile(fs_types, "default_features", 17599b27e9cc320dd7da24356561b3b12c66f2540432Theodore Ts'o ""); 17609b27e9cc320dd7da24356561b3b12c66f2540432Theodore Ts'o } 17619b27e9cc320dd7da24356561b3b12c66f2540432Theodore Ts'o edit_feature(fs_features ? fs_features : tmp, 17629b27e9cc320dd7da24356561b3b12c66f2540432Theodore Ts'o &fs_param.s_feature_compat); 1763e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (tmp) 1764e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall free(tmp); 1765e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 1766e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall /* Get the hardware sector sizes, if available */ 1767e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall retval = ext2fs_get_device_sectsize(device_name, &lsector_size); 1768e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (retval) { 1769e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err(program_name, retval, "%s", 1770e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall _("while trying to determine hardware sector size")); 1771e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall exit(1); 1772e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 1773e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall retval = ext2fs_get_device_phys_sectsize(device_name, &psector_size); 1774e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (retval) { 1775e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err(program_name, retval, "%s", 1776e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall _("while trying to determine physical sector size")); 1777e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall exit(1); 1778e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 1779e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 1780e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall tmp = getenv("MKE2FS_DEVICE_SECTSIZE"); 1781e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (tmp != NULL) 1782e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall lsector_size = atoi(tmp); 1783e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall tmp = getenv("MKE2FS_DEVICE_PHYS_SECTSIZE"); 1784e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (tmp != NULL) 1785e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall psector_size = atoi(tmp); 1786e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 1787e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall /* Older kernels may not have physical/logical distinction */ 1788e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (!psector_size) 1789e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall psector_size = lsector_size; 1790e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 1791e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (blocksize <= 0) { 1792e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall use_bsize = get_int_from_profile(fs_types, "blocksize", 4096); 1793e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 1794e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (use_bsize == -1) { 1795e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall use_bsize = sys_page_size; 1796e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if ((linux_version_code < (2*65536 + 6*256)) && 1797e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall (use_bsize > 4096)) 1798e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall use_bsize = 4096; 1799e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 1800e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (lsector_size && use_bsize < lsector_size) 1801e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall use_bsize = lsector_size; 1802e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if ((blocksize < 0) && (use_bsize < (-blocksize))) 1803e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall use_bsize = -blocksize; 1804e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall blocksize = use_bsize; 1805e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fs_blocks_count /= (blocksize / 1024); 1806e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } else { 1807e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (blocksize < lsector_size) { /* Impossible */ 1808e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err(program_name, EINVAL, "%s", 1809e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall _("while setting blocksize; too small " 1810e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "for device\n")); 1811e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall exit(1); 1812e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } else if ((blocksize < psector_size) && 1813e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall (psector_size <= sys_page_size)) { /* Suboptimal */ 1814e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fprintf(stderr, _("Warning: specified blocksize %d is " 1815e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "less than device physical sectorsize %d\n"), 1816e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall blocksize, psector_size); 1817e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 1818e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 1819e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 1820e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fs_param.s_log_block_size = 1821e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall int_log2(blocksize >> EXT2_MIN_BLOCK_LOG_SIZE); 1822e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 1823e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall /* 1824e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * We now need to do a sanity check of fs_blocks_count for 1825e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * 32-bit vs 64-bit block number support. 1826e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 1827e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if ((fs_blocks_count > MAX_32_NUM) && 1828e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall !(fs_param.s_feature_incompat & EXT4_FEATURE_INCOMPAT_64BIT) && 1829e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall get_bool_from_profile(fs_types, "auto_64-bit_support", 0)) { 1830e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fs_param.s_feature_incompat |= EXT4_FEATURE_INCOMPAT_64BIT; 1831e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fs_param.s_feature_compat &= ~EXT2_FEATURE_COMPAT_RESIZE_INODE; 1832e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 1833e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if ((fs_blocks_count > MAX_32_NUM) && 1834e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall !(fs_param.s_feature_incompat & EXT4_FEATURE_INCOMPAT_64BIT)) { 1835e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fprintf(stderr, _("%s: Size of device (0x%llx blocks) %s " 1836e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "too big to be expressed\n\t" 1837e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "in 32 bits using a blocksize of %d.\n"), 1838e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall program_name, fs_blocks_count, device_name, 1839e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXT2_BLOCK_SIZE(&fs_param)); 1840e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall exit(1); 1841e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 1842e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 1843e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_blocks_count_set(&fs_param, fs_blocks_count); 1844493024ea1d74e4cb48aac3a24111f5c8da343e9fTheodore Ts'o 1845b4d5105b2527a5279cf5b885b957e1e07a53e725Theodore Ts'o if (fs_param.s_feature_incompat & EXT3_FEATURE_INCOMPAT_JOURNAL_DEV) { 1846b4d5105b2527a5279cf5b885b957e1e07a53e725Theodore Ts'o fs_types[0] = strdup("journal"); 1847b4d5105b2527a5279cf5b885b957e1e07a53e725Theodore Ts'o fs_types[1] = 0; 1848b4d5105b2527a5279cf5b885b957e1e07a53e725Theodore Ts'o } 1849b4d5105b2527a5279cf5b885b957e1e07a53e725Theodore Ts'o 1850b4d5105b2527a5279cf5b885b957e1e07a53e725Theodore Ts'o if (verbose) { 1851b4d5105b2527a5279cf5b885b957e1e07a53e725Theodore Ts'o fputs(_("fs_types for mke2fs.conf resolution: "), stdout); 1852b4d5105b2527a5279cf5b885b957e1e07a53e725Theodore Ts'o print_str_list(fs_types); 1853b4d5105b2527a5279cf5b885b957e1e07a53e725Theodore Ts'o } 1854b4d5105b2527a5279cf5b885b957e1e07a53e725Theodore Ts'o 1855efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o if (r_opt == EXT2_GOOD_OLD_REV && 1856b290d2dc35411479e09328ef8d9c6220c33f2c49Theodore Ts'o (fs_param.s_feature_compat || fs_param.s_feature_incompat || 185792fb8545b1f9bcf104075ec813ebdf5ddb27e889Theodore Ts'o fs_param.s_feature_ro_compat)) { 1858e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fprintf(stderr, "%s", _("Filesystem features not supported " 1859e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "with revision 0 filesystems\n")); 18609dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o exit(1); 18619dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o } 18629dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o 1863b290d2dc35411479e09328ef8d9c6220c33f2c49Theodore Ts'o if (s_opt > 0) { 1864b290d2dc35411479e09328ef8d9c6220c33f2c49Theodore Ts'o if (r_opt == EXT2_GOOD_OLD_REV) { 1865e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fprintf(stderr, "%s", 1866e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall _("Sparse superblocks not supported " 1867b290d2dc35411479e09328ef8d9c6220c33f2c49Theodore Ts'o "with revision 0 filesystems\n")); 1868b290d2dc35411479e09328ef8d9c6220c33f2c49Theodore Ts'o exit(1); 1869b290d2dc35411479e09328ef8d9c6220c33f2c49Theodore Ts'o } 18709dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o fs_param.s_feature_ro_compat |= 18719dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER; 1872b290d2dc35411479e09328ef8d9c6220c33f2c49Theodore Ts'o } else if (s_opt == 0) 18739dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o fs_param.s_feature_ro_compat &= 18749dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o ~EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER; 18759dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o 1876b290d2dc35411479e09328ef8d9c6220c33f2c49Theodore Ts'o if (journal_size != 0) { 1877b290d2dc35411479e09328ef8d9c6220c33f2c49Theodore Ts'o if (r_opt == EXT2_GOOD_OLD_REV) { 1878e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fprintf(stderr, "%s", _("Journals not supported with " 1879e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "revision 0 filesystems\n")); 1880b290d2dc35411479e09328ef8d9c6220c33f2c49Theodore Ts'o exit(1); 1881b290d2dc35411479e09328ef8d9c6220c33f2c49Theodore Ts'o } 1882efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o fs_param.s_feature_compat |= 18839dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o EXT3_FEATURE_COMPAT_HAS_JOURNAL; 1884b290d2dc35411479e09328ef8d9c6220c33f2c49Theodore Ts'o } 18859dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o 1886e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall /* Get reserved_ratio from profile if not specified on cmd line. */ 1887e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (reserved_ratio < 0.0) { 1888e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall reserved_ratio = get_double_from_profile( 1889e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fs_types, "reserved_ratio", 5.0); 1890e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (reserved_ratio > 50 || reserved_ratio < 0) { 1891e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err(program_name, 0, 1892e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall _("invalid reserved blocks percent - %lf"), 1893e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall reserved_ratio); 1894e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall exit(1); 1895e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 1896e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 1897e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 1898efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o if (fs_param.s_feature_incompat & 18999dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o EXT3_FEATURE_INCOMPAT_JOURNAL_DEV) { 19009dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o reserved_ratio = 0; 19019dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o fs_param.s_feature_incompat = EXT3_FEATURE_INCOMPAT_JOURNAL_DEV; 19029dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o fs_param.s_feature_compat = 0; 19039dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o fs_param.s_feature_ro_compat = 0; 19049dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o } 1905d94cc2eaa68d8bfad342293e73540b867a7b10d9Theodore Ts'o 1906e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall /* Check the user's mkfs options for 64bit */ 1907e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if ((fs_param.s_feature_incompat & EXT4_FEATURE_INCOMPAT_64BIT) && 1908e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall !(fs_param.s_feature_incompat & EXT3_FEATURE_INCOMPAT_EXTENTS)) { 1909e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf("%s", _("Extents MUST be enabled for a 64-bit " 1910e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "filesystem. Pass -O extents to rectify.\n")); 1911d11f92af3563ce9a235286e6e10d1ebf29a2a4a8Darrick J. Wong exit(1); 1912d11f92af3563ce9a235286e6e10d1ebf29a2a4a8Darrick J. Wong } 1913d11f92af3563ce9a235286e6e10d1ebf29a2a4a8Darrick J. Wong 1914c046ac7f2e4c53e20cf1e909bbe511f91074b396Theodore Ts'o /* Set first meta blockgroup via an environment variable */ 1915c046ac7f2e4c53e20cf1e909bbe511f91074b396Theodore Ts'o /* (this is mostly for debugging purposes) */ 19169b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o if ((fs_param.s_feature_incompat & EXT2_FEATURE_INCOMPAT_META_BG) && 1917c046ac7f2e4c53e20cf1e909bbe511f91074b396Theodore Ts'o ((tmp = getenv("MKE2FS_FIRST_META_BG")))) 19189b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o fs_param.s_first_meta_bg = atoi(tmp); 1919e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (fs_param.s_feature_ro_compat & EXT4_FEATURE_RO_COMPAT_BIGALLOC) { 1920e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (!cluster_size) 1921e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall cluster_size = get_int_from_profile(fs_types, 1922e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "cluster_size", 1923e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall blocksize*16); 1924e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fs_param.s_log_cluster_size = 1925e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall int_log2(cluster_size >> EXT2_MIN_CLUSTER_LOG_SIZE); 1926e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (fs_param.s_log_cluster_size && 1927e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fs_param.s_log_cluster_size < fs_param.s_log_block_size) { 1928e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err(program_name, 0, "%s", 1929e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall _("The cluster size may not be " 1930e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "smaller than the block size.\n")); 19314b20ea2691b3408340036d16e62867d5c52078e3Theodore Ts'o exit(1); 19324b20ea2691b3408340036d16e62867d5c52078e3Theodore Ts'o } 1933e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } else if (cluster_size) { 1934e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err(program_name, 0, "%s", 1935e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall _("specifying a cluster size requires the " 1936e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "bigalloc feature")); 1937e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall exit(1); 1938e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } else 1939e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fs_param.s_log_cluster_size = fs_param.s_log_block_size; 1940c6ed60cdeb1355a884f635ac8118c8f330e2ba68Theodore Ts'o 19419dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o if (inode_ratio == 0) { 19423d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o inode_ratio = get_int_from_profile(fs_types, "inode_ratio", 19433d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o 8192); 19449dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o if (inode_ratio < blocksize) 19459dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o inode_ratio = blocksize; 1946e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (inode_ratio < EXT2_CLUSTER_SIZE(&fs_param)) 1947e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall inode_ratio = EXT2_CLUSTER_SIZE(&fs_param); 19489dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o } 19499dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o 19509ed8e5fec226aa53634ed95cbeac736d90a518e5Eric Sandeen#ifdef HAVE_BLKID_PROBE_GET_TOPOLOGY 19511599b470fb881313c1d44594f05d578c43825312Theodore Ts'o retval = get_device_geometry(device_name, &fs_param, psector_size); 19529ed8e5fec226aa53634ed95cbeac736d90a518e5Eric Sandeen if (retval < 0) { 19539ed8e5fec226aa53634ed95cbeac736d90a518e5Eric Sandeen fprintf(stderr, 195413b0b1231ed28aac75ba336de7a8cb3b4611ce68Eric Sandeen _("warning: Unable to get device geometry for %s\n"), 19559ed8e5fec226aa53634ed95cbeac736d90a518e5Eric Sandeen device_name); 19569ed8e5fec226aa53634ed95cbeac736d90a518e5Eric Sandeen } else if (retval) { 19579ed8e5fec226aa53634ed95cbeac736d90a518e5Eric Sandeen printf(_("%s alignment is offset by %lu bytes.\n"), 19589ed8e5fec226aa53634ed95cbeac736d90a518e5Eric Sandeen device_name, retval); 19599ed8e5fec226aa53634ed95cbeac736d90a518e5Eric Sandeen printf(_("This may result in very poor performance, " 19609ed8e5fec226aa53634ed95cbeac736d90a518e5Eric Sandeen "(re)-partitioning suggested.\n")); 19619ed8e5fec226aa53634ed95cbeac736d90a518e5Eric Sandeen } 19629ed8e5fec226aa53634ed95cbeac736d90a518e5Eric Sandeen#endif 19639ed8e5fec226aa53634ed95cbeac736d90a518e5Eric Sandeen 19649b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o blocksize = EXT2_BLOCK_SIZE(&fs_param); 1965a4396e9d5d1351c53212bf7ff10f97edeb576438Theodore Ts'o 1966e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall /* 1967e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Initialize s_desc_size so that the parse_extended_opts() 1968e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * can correctly handle "-E resize=NNN" if the 64-bit option 1969e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * is set. 1970e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 1971e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (fs_param.s_feature_incompat & EXT4_FEATURE_INCOMPAT_64BIT) 1972e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fs_param.s_desc_size = EXT2_MIN_DESC_SIZE_64BIT; 1973e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 1974e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall /* This check should happen beyond the last assignment to blocksize */ 1975e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (blocksize > sys_page_size) { 1976e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (!force) { 1977e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err(program_name, 0, 1978e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall _("%d-byte blocks too big for system (max %d)"), 1979e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall blocksize, sys_page_size); 1980e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall proceed_question(); 1981e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 1982e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fprintf(stderr, _("Warning: %d-byte blocks too big for system " 1983e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "(max %d), forced to continue\n"), 1984e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall blocksize, sys_page_size); 1985e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 1986e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 1987210fd2c7072f2f150e2bb10b07c49472bb78e366Theodore Ts'o lazy_itable_init = 0; 1988210fd2c7072f2f150e2bb10b07c49472bb78e366Theodore Ts'o if (access("/sys/fs/ext4/features/lazy_itable_init", R_OK) == 0) 1989210fd2c7072f2f150e2bb10b07c49472bb78e366Theodore Ts'o lazy_itable_init = 1; 1990210fd2c7072f2f150e2bb10b07c49472bb78e366Theodore Ts'o 1991efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o lazy_itable_init = get_bool_from_profile(fs_types, 1992210fd2c7072f2f150e2bb10b07c49472bb78e366Theodore Ts'o "lazy_itable_init", 1993210fd2c7072f2f150e2bb10b07c49472bb78e366Theodore Ts'o lazy_itable_init); 19947fe5ff3c1e06c4705a7a709a7ed34f02c5a02fd8Lukas Czerner discard = get_bool_from_profile(fs_types, "discard" , discard); 1995e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall journal_flags |= get_bool_from_profile(fs_types, 1996e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "lazy_journal_init", 0) ? 1997e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXT2_MKJOURNAL_LAZYINIT : 0; 1998e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall journal_flags |= EXT2_MKJOURNAL_NO_MNT_CHECK; 1999efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 20002d36358d665c87cbfb00a2d700690fa379f24956Theodore Ts'o /* Get options from profile */ 20012d36358d665c87cbfb00a2d700690fa379f24956Theodore Ts'o for (cpp = fs_types; *cpp; cpp++) { 20022d36358d665c87cbfb00a2d700690fa379f24956Theodore Ts'o tmp = NULL; 20032d36358d665c87cbfb00a2d700690fa379f24956Theodore Ts'o profile_get_string(profile, "fs_types", *cpp, "options", "", &tmp); 20042d36358d665c87cbfb00a2d700690fa379f24956Theodore Ts'o if (tmp && *tmp) 20052d36358d665c87cbfb00a2d700690fa379f24956Theodore Ts'o parse_extended_opts(&fs_param, tmp); 200645e338f5332a54295893dba2e32cc093d1316f60Jim Meyering free(tmp); 20072d36358d665c87cbfb00a2d700690fa379f24956Theodore Ts'o } 20082d36358d665c87cbfb00a2d700690fa379f24956Theodore Ts'o 2009c6a44136b9b82625e7b36a574ddb3a08b6727e97Theodore Ts'o if (extended_opts) 20109b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o parse_extended_opts(&fs_param, extended_opts); 2011d323f8fb369089b97d6f3bf0f8d64ceeab0b10f5Theodore Ts'o 2012e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall /* Can't support bigalloc feature without extents feature */ 2013e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if ((fs_param.s_feature_ro_compat & EXT4_FEATURE_RO_COMPAT_BIGALLOC) && 2014e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall !(fs_param.s_feature_incompat & EXT3_FEATURE_INCOMPAT_EXTENTS)) { 2015e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err(program_name, 0, "%s", 2016e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall _("Can't support bigalloc feature without " 2017e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "extents feature")); 2018e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall exit(1); 2019e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 2020e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 2021e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if ((fs_param.s_feature_incompat & EXT2_FEATURE_INCOMPAT_META_BG) && 2022e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall (fs_param.s_feature_compat & EXT2_FEATURE_COMPAT_RESIZE_INODE)) { 2023e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fprintf(stderr, "%s", _("The resize_inode and meta_bg " 2024e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "features are not compatible.\n" 2025e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "They can not be both enabled " 2026e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "simultaneously.\n")); 2027e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall exit(1); 2028e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 2029e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 2030e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (!quiet && 2031e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall (fs_param.s_feature_ro_compat & EXT4_FEATURE_RO_COMPAT_BIGALLOC)) 2032e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fprintf(stderr, "%s", _("\nWarning: the bigalloc feature is " 2033e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "still under development\n" 2034e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "See https://ext4.wiki.kernel.org/" 2035e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "index.php/Bigalloc for more information\n\n")); 2036e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 2037e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (!quiet && 2038e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall (fs_param.s_feature_ro_compat & EXT4_FEATURE_RO_COMPAT_QUOTA)) 2039e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fprintf(stderr, "%s", _("\nWarning: the quota feature is " 2040e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "still under development\n" 2041e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "See https://ext4.wiki.kernel.org/" 2042e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "index.php/Quota for more information\n\n")); 2043e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 2044d323f8fb369089b97d6f3bf0f8d64ceeab0b10f5Theodore Ts'o /* Since sparse_super is the default, we would only have a problem 2045d323f8fb369089b97d6f3bf0f8d64ceeab0b10f5Theodore Ts'o * here if it was explicitly disabled. 2046d323f8fb369089b97d6f3bf0f8d64ceeab0b10f5Theodore Ts'o */ 20479b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o if ((fs_param.s_feature_compat & EXT2_FEATURE_COMPAT_RESIZE_INODE) && 20489b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o !(fs_param.s_feature_ro_compat&EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER)) { 2049e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err(program_name, 0, "%s", 2050d323f8fb369089b97d6f3bf0f8d64ceeab0b10f5Theodore Ts'o _("reserved online resize blocks not supported " 2051d323f8fb369089b97d6f3bf0f8d64ceeab0b10f5Theodore Ts'o "on non-sparse filesystem")); 2052d323f8fb369089b97d6f3bf0f8d64ceeab0b10f5Theodore Ts'o exit(1); 2053d323f8fb369089b97d6f3bf0f8d64ceeab0b10f5Theodore Ts'o } 2054d323f8fb369089b97d6f3bf0f8d64ceeab0b10f5Theodore Ts'o 20559b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o if (fs_param.s_blocks_per_group) { 20569b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o if (fs_param.s_blocks_per_group < 256 || 20579b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o fs_param.s_blocks_per_group > 8 * (unsigned) blocksize) { 2058e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err(program_name, 0, "%s", 2059d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o _("blocks per group count out of range")); 2060521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o exit(1); 2061521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o } 2062521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o } 2063521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o 2064e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall /* 2065e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * If the bigalloc feature is enabled, then the -g option will 2066e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * specify the number of clusters per group. 2067e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 2068e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (fs_param.s_feature_ro_compat & EXT4_FEATURE_RO_COMPAT_BIGALLOC) { 2069e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fs_param.s_clusters_per_group = fs_param.s_blocks_per_group; 2070e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fs_param.s_blocks_per_group = 0; 2071e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 2072e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 20733d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o if (inode_size == 0) 20743d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o inode_size = get_int_from_profile(fs_types, "inode_size", 0); 20759ba400027fb00ce43d14673346bbfb6f5719985aTheodore Ts'o if (!flex_bg_size && (fs_param.s_feature_incompat & 20769ba400027fb00ce43d14673346bbfb6f5719985aTheodore Ts'o EXT4_FEATURE_INCOMPAT_FLEX_BG)) 20779ba400027fb00ce43d14673346bbfb6f5719985aTheodore Ts'o flex_bg_size = get_int_from_profile(fs_types, 20789ba400027fb00ce43d14673346bbfb6f5719985aTheodore Ts'o "flex_bg_size", 16); 20799ba400027fb00ce43d14673346bbfb6f5719985aTheodore Ts'o if (flex_bg_size) { 20809ba400027fb00ce43d14673346bbfb6f5719985aTheodore Ts'o if (!(fs_param.s_feature_incompat & 20819ba400027fb00ce43d14673346bbfb6f5719985aTheodore Ts'o EXT4_FEATURE_INCOMPAT_FLEX_BG)) { 2082e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err(program_name, 0, "%s", 20839ba400027fb00ce43d14673346bbfb6f5719985aTheodore Ts'o _("Flex_bg feature not enabled, so " 20849ba400027fb00ce43d14673346bbfb6f5719985aTheodore Ts'o "flex_bg size may not be specified")); 20859ba400027fb00ce43d14673346bbfb6f5719985aTheodore Ts'o exit(1); 20869ba400027fb00ce43d14673346bbfb6f5719985aTheodore Ts'o } 20879ba400027fb00ce43d14673346bbfb6f5719985aTheodore Ts'o fs_param.s_log_groups_per_flex = int_log2(flex_bg_size); 20889ba400027fb00ce43d14673346bbfb6f5719985aTheodore Ts'o } 2089067911ae734bb5fef7c5780a639533847b5b578cAndreas Dilger 2090067911ae734bb5fef7c5780a639533847b5b578cAndreas Dilger if (inode_size && fs_param.s_rev_level >= EXT2_DYNAMIC_REV) { 2091932a489cdf6bc83d69e59d3f8e0a57b733799ce1Andreas Dilger if (inode_size < EXT2_GOOD_OLD_INODE_SIZE || 20929b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o inode_size > EXT2_BLOCK_SIZE(&fs_param) || 2093932a489cdf6bc83d69e59d3f8e0a57b733799ce1Andreas Dilger inode_size & (inode_size - 1)) { 2094932a489cdf6bc83d69e59d3f8e0a57b733799ce1Andreas Dilger com_err(program_name, 0, 2095bb145b01cf5fd27d9afe03c3262d0e1a326e7ec1Theodore Ts'o _("invalid inode size %d (min %d/max %d)"), 2096932a489cdf6bc83d69e59d3f8e0a57b733799ce1Andreas Dilger inode_size, EXT2_GOOD_OLD_INODE_SIZE, 2097c5290fae3937cc83de8a551db9686d1e1964e378Theodore Ts'o blocksize); 2098932a489cdf6bc83d69e59d3f8e0a57b733799ce1Andreas Dilger exit(1); 2099932a489cdf6bc83d69e59d3f8e0a57b733799ce1Andreas Dilger } 21009b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o fs_param.s_inode_size = inode_size; 2101932a489cdf6bc83d69e59d3f8e0a57b733799ce1Andreas Dilger } 2102932a489cdf6bc83d69e59d3f8e0a57b733799ce1Andreas Dilger 2103f335864338a6fbce8134a445ffdd0cdeb3f3f1bcEric Sandeen /* Make sure number of inodes specified will fit in 32 bits */ 2104f335864338a6fbce8134a445ffdd0cdeb3f3f1bcEric Sandeen if (num_inodes == 0) { 2105de8f3a76218255e443ba57dec5d74850180fa75dAndreas Dilger unsigned long long n; 2106e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall n = ext2fs_blocks_count(&fs_param) * blocksize / inode_ratio; 2107e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (n > MAX_32_NUM) { 2108e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (fs_param.s_feature_incompat & 2109e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXT4_FEATURE_INCOMPAT_64BIT) 2110e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall num_inodes = MAX_32_NUM; 2111e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall else { 2112e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err(program_name, 0, 2113e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall _("too many inodes (%llu), raise " 2114e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "inode ratio?"), n); 2115e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall exit(1); 2116e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 2117f335864338a6fbce8134a445ffdd0cdeb3f3f1bcEric Sandeen } 2118e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } else if (num_inodes > MAX_32_NUM) { 2119f335864338a6fbce8134a445ffdd0cdeb3f3f1bcEric Sandeen com_err(program_name, 0, 2120f335864338a6fbce8134a445ffdd0cdeb3f3f1bcEric Sandeen _("too many inodes (%llu), specify < 2^32 inodes"), 2121de8f3a76218255e443ba57dec5d74850180fa75dAndreas Dilger num_inodes); 2122f335864338a6fbce8134a445ffdd0cdeb3f3f1bcEric Sandeen exit(1); 2123f335864338a6fbce8134a445ffdd0cdeb3f3f1bcEric Sandeen } 21243839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o /* 21253839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Calculate number of inodes based on the inode ratio 21263839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */ 2127efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o fs_param.s_inodes_count = num_inodes ? num_inodes : 2128e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall (ext2fs_blocks_count(&fs_param) * blocksize) / inode_ratio; 21293839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 2130e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if ((((unsigned long long)fs_param.s_inodes_count) * 2131dcf7b091c3efb2e6218a1f139ef2823db9d7c4bbAndreas Dilger (inode_size ? inode_size : EXT2_GOOD_OLD_INODE_SIZE)) >= 2132e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ((ext2fs_blocks_count(&fs_param)) * 2133dcf7b091c3efb2e6218a1f139ef2823db9d7c4bbAndreas Dilger EXT2_BLOCK_SIZE(&fs_param))) { 2134dcf7b091c3efb2e6218a1f139ef2823db9d7c4bbAndreas Dilger com_err(program_name, 0, _("inode_size (%u) * inodes_count " 2135dcf7b091c3efb2e6218a1f139ef2823db9d7c4bbAndreas Dilger "(%u) too big for a\n\t" 2136e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "filesystem with %llu blocks, " 2137dcf7b091c3efb2e6218a1f139ef2823db9d7c4bbAndreas Dilger "specify higher inode_ratio (-i)\n\t" 2138dcf7b091c3efb2e6218a1f139ef2823db9d7c4bbAndreas Dilger "or lower inode count (-N).\n"), 2139dcf7b091c3efb2e6218a1f139ef2823db9d7c4bbAndreas Dilger inode_size ? inode_size : EXT2_GOOD_OLD_INODE_SIZE, 2140efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o fs_param.s_inodes_count, 2141e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall (unsigned long long) ext2fs_blocks_count(&fs_param)); 2142dcf7b091c3efb2e6218a1f139ef2823db9d7c4bbAndreas Dilger exit(1); 2143dcf7b091c3efb2e6218a1f139ef2823db9d7c4bbAndreas Dilger } 2144dcf7b091c3efb2e6218a1f139ef2823db9d7c4bbAndreas Dilger 21453839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o /* 21463839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Calculate number of blocks to reserve 21473839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */ 2148e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_r_blocks_count_set(&fs_param, reserved_ratio * 2149e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_blocks_count(&fs_param) / 100.0); 2150e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 2151e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall free(fs_type); 2152e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall free(usage_types); 21533839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 2154d323f8fb369089b97d6f3bf0f8d64ceeab0b10f5Theodore Ts'o 2155b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.Vstatic int should_do_undo(const char *name) 2156b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V{ 2157b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V errcode_t retval; 2158b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V io_channel channel; 2159b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V __u16 s_magic; 2160b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V struct ext2_super_block super; 2161b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V io_manager manager = unix_io_manager; 2162b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V int csum_flag, force_undo; 2163b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V 2164b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V csum_flag = EXT2_HAS_RO_COMPAT_FEATURE(&fs_param, 2165b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V EXT4_FEATURE_RO_COMPAT_GDT_CSUM); 2166b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V force_undo = get_int_from_profile(fs_types, "force_undo", 0); 2167b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V if (!force_undo && (!csum_flag || !lazy_itable_init)) 2168b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V return 0; 2169b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V 2170b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V retval = manager->open(name, IO_FLAG_EXCLUSIVE, &channel); 2171b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V if (retval) { 2172b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V /* 2173b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V * We don't handle error cases instead we 2174b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V * declare that the file system doesn't exist 2175b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V * and let the rest of mke2fs take care of 2176b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V * error 2177b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V */ 2178b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V retval = 0; 2179b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V goto open_err_out; 2180b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V } 2181b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V 2182b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V io_channel_set_blksize(channel, SUPERBLOCK_OFFSET); 2183e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall retval = io_channel_read_blk64(channel, 1, -SUPERBLOCK_SIZE, &super); 2184b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V if (retval) { 2185b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V retval = 0; 2186b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V goto err_out; 2187b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V } 2188b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V 2189b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V#if defined(WORDS_BIGENDIAN) 2190b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V s_magic = ext2fs_swab16(super.s_magic); 2191b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V#else 2192b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V s_magic = super.s_magic; 2193b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V#endif 2194b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V 2195b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V if (s_magic == EXT2_SUPER_MAGIC) 2196b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V retval = 1; 2197b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V 2198b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.Verr_out: 2199b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V io_channel_close(channel); 2200b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V 2201b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.Vopen_err_out: 2202b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V 2203b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V return retval; 2204b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V} 2205b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V 2206b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.Vstatic int mke2fs_setup_tdb(const char *name, io_manager *io_ptr) 2207b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V{ 2208e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall errcode_t retval = ENOMEM; 2209e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall char *tdb_dir = NULL, *tdb_file = NULL; 2210e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall char *dev_name, *tmp_name; 2211e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall int free_tdb_dir = 0; 2212b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V 2213b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V /* 2214b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V * Configuration via a conf file would be 2215b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V * nice 2216b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V */ 2217b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V tdb_dir = getenv("E2FSPROGS_UNDO_DIR"); 2218e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (!tdb_dir) { 2219b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V profile_get_string(profile, "defaults", 2220b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V "undo_dir", 0, "/var/lib/e2fsprogs", 2221b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V &tdb_dir); 2222e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall free_tdb_dir = 1; 2223e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 2224b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V 2225b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V if (!strcmp(tdb_dir, "none") || (tdb_dir[0] == 0) || 2226e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall access(tdb_dir, W_OK)) { 2227e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (free_tdb_dir) 2228e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall free(tdb_dir); 2229b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V return 0; 2230e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 2231b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V 2232b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V tmp_name = strdup(name); 2233e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (!tmp_name) 2234e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall goto errout; 2235e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall dev_name = basename(tmp_name); 2236e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall tdb_file = malloc(strlen(tdb_dir) + 8 + strlen(dev_name) + 7 + 1); 2237e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (!tdb_file) { 2238e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall free(tmp_name); 2239e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall goto errout; 2240e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 2241e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall sprintf(tdb_file, "%s/mke2fs-%s.e2undo", tdb_dir, dev_name); 2242e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall free(tmp_name); 2243b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V 2244b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V if (!access(tdb_file, F_OK)) { 2245b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V if (unlink(tdb_file) < 0) { 2246b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V retval = errno; 2247e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall goto errout; 2248b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V } 2249b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V } 2250b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V 2251b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V set_undo_io_backing_manager(*io_ptr); 2252b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V *io_ptr = undo_io_manager; 2253e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall retval = set_undo_io_backup_file(tdb_file); 2254e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (retval) 2255e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall goto errout; 2256b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V printf(_("Overwriting existing filesystem; this can be undone " 2257b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V "using the command:\n" 2258b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V " e2undo %s %s\n\n"), tdb_file, name); 225979e62409b3a247e258d9e9206484ed8f193a183eEric Sandeen 2260e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (free_tdb_dir) 2261e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall free(tdb_dir); 2262f203bbdbec396e3279bf249ae9be96e6b00bf6f2Theodore Ts'o free(tdb_file); 2263e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall return 0; 2264e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 2265e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallerrout: 2266e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (free_tdb_dir) 2267e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall free(tdb_dir); 2268e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall free(tdb_file); 2269e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err(program_name, retval, "%s", 2270e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall _("while trying to setup undo file\n")); 2271b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V return retval; 2272b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V} 2273b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V 2274e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic int mke2fs_discard_device(ext2_filsys fs) 2275e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 2276e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall struct ext2fs_numeric_progress_struct progress; 2277e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall blk64_t blocks = ext2fs_blocks_count(fs->super); 2278e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall blk64_t count = DISCARD_STEP_MB; 2279e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall blk64_t cur; 2280e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall int retval = 0; 22817d9e31655fca48e9d6c2647ad443124113508b73Lukas Czerner 2282e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall /* 2283e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Let's try if discard really works on the device, so 2284e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * we do not print numeric progress resulting in failure 2285e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * afterwards. 2286e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 2287e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall retval = io_channel_discard(fs->io, 0, fs->blocksize); 2288e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (retval) 2289e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall return retval; 2290e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall cur = fs->blocksize; 22917d9e31655fca48e9d6c2647ad443124113508b73Lukas Czerner 2292e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall count *= (1024 * 1024); 2293e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall count /= fs->blocksize; 22947d9e31655fca48e9d6c2647ad443124113508b73Lukas Czerner 2295e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_numeric_progress_init(fs, &progress, 2296e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall _("Discarding device blocks: "), 2297e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall blocks); 2298e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall while (cur < blocks) { 2299e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_numeric_progress_update(fs, &progress, cur); 23007d9e31655fca48e9d6c2647ad443124113508b73Lukas Czerner 2301e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (cur + count > blocks) 2302e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall count = blocks - cur; 23037d9e31655fca48e9d6c2647ad443124113508b73Lukas Czerner 2304e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall retval = io_channel_discard(fs->io, cur, count); 2305e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (retval) 2306e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall break; 2307e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall cur += count; 2308e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 2309e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 2310e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (retval) { 2311e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_numeric_progress_close(fs, &progress, 2312e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall _("failed - ")); 2313e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (!quiet) 2314e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf("%s\n",error_message(retval)); 2315e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } else 2316e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_numeric_progress_close(fs, &progress, 2317e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall _("done \n")); 2318e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 2319e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall return retval; 2320e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 2321e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 2322e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic void fix_cluster_bg_counts(ext2_filsys fs) 2323e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 2324e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall blk64_t cluster, num_clusters, tot_free; 2325e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall unsigned num = 0; 2326e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall int grp_free, num_free, group; 2327e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 2328e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall num_clusters = EXT2FS_B2C(fs, ext2fs_blocks_count(fs->super)); 2329e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall tot_free = num_free = group = grp_free = 0; 2330e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall for (cluster = EXT2FS_B2C(fs, fs->super->s_first_data_block); 2331e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall cluster < num_clusters; cluster++) { 2332e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (!ext2fs_test_block_bitmap2(fs->block_map, 2333e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXT2FS_C2B(fs, cluster))) { 2334e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall grp_free++; 2335e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall tot_free++; 2336e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 2337e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall num++; 2338e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if ((num == fs->super->s_clusters_per_group) || 2339e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall (cluster == num_clusters-1)) { 2340e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_bg_free_blocks_count_set(fs, group, grp_free); 2341e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_group_desc_csum_set(fs, group); 2342e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall num = 0; 2343e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall grp_free = 0; 2344e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall group++; 2345c6ed60cdeb1355a884f635ac8118c8f330e2ba68Theodore Ts'o } 2346c6ed60cdeb1355a884f635ac8118c8f330e2ba68Theodore Ts'o } 2347e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_free_blocks_count_set(fs->super, EXT2FS_C2B(fs, tot_free)); 2348c6ed60cdeb1355a884f635ac8118c8f330e2ba68Theodore Ts'o} 2349c6ed60cdeb1355a884f635ac8118c8f330e2ba68Theodore Ts'o 2350e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic int create_quota_inodes(ext2_filsys fs) 23511f5d7a890e8b2ad03ee91fd891b0b5b4327da030Aditya Kali{ 2352e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall quota_ctx_t qctx; 23531f5d7a890e8b2ad03ee91fd891b0b5b4327da030Aditya Kali 2354e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall quota_init_context(&qctx, fs, -1); 2355e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall quota_compute_usage(qctx); 2356e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall quota_write_inode(qctx, quotatype); 2357e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall quota_release_context(&qctx); 2358e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 2359e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall return 0; 23601f5d7a890e8b2ad03ee91fd891b0b5b4327da030Aditya Kali} 23611f5d7a890e8b2ad03ee91fd891b0b5b4327da030Aditya Kali 23623839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oint main (int argc, char *argv[]) 23633839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 23643839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o errcode_t retval = 0; 23653839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o ext2_filsys fs; 23663839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o badblocks_list bb_list = 0; 2367d4e0b1c6f5aa8c6a248d9149ed5634a310952411Theodore Ts'o unsigned int journal_blocks; 2368e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall unsigned int i, checkinterval; 2369e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall int max_mnt_count; 2370d5f57d9553d4c855e282dbd3edf1ad85ab716d33Theodore Ts'o int val, hash_alg; 2371e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall int flags; 2372e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall int old_bitmaps; 2373a7ccdff8e128c24564011d760a996496b0a981b3Theodore Ts'o io_manager io_ptr; 2374b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V char tdb_string[40]; 2375d5f57d9553d4c855e282dbd3edf1ad85ab716d33Theodore Ts'o char *hash_alg_str; 23766fcd6f84c235f4bf2bd9770f172837da9982eb6eEric Sandeen int itable_zeroed = 0; 2377d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o 2378d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o#ifdef ENABLE_NLS 2379d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o setlocale(LC_MESSAGES, ""); 238014308a5398984842e808faa3ff2dd6a1c52d90bdTheodore Ts'o setlocale(LC_CTYPE, ""); 2381d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o bindtextdomain(NLS_CAT_NAME, LOCALEDIR); 2382d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o textdomain(NLS_CAT_NAME); 2383e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall set_com_err_gettext(gettext); 2384d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o#endif 23853839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o PRS(argc, argv); 23863839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 2387a7ccdff8e128c24564011d760a996496b0a981b3Theodore Ts'o#ifdef CONFIG_TESTIO_DEBUG 2388f38cf3cb34addaa53d1f855d7607b151082a4229Theodore Ts'o if (getenv("TEST_IO_FLAGS") || getenv("TEST_IO_BLOCK")) { 2389f38cf3cb34addaa53d1f855d7607b151082a4229Theodore Ts'o io_ptr = test_io_manager; 2390f38cf3cb34addaa53d1f855d7607b151082a4229Theodore Ts'o test_io_backing_manager = unix_io_manager; 2391f38cf3cb34addaa53d1f855d7607b151082a4229Theodore Ts'o } else 2392a7ccdff8e128c24564011d760a996496b0a981b3Theodore Ts'o#endif 2393f38cf3cb34addaa53d1f855d7607b151082a4229Theodore Ts'o io_ptr = unix_io_manager; 2394a7ccdff8e128c24564011d760a996496b0a981b3Theodore Ts'o 2395b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V if (should_do_undo(device_name)) { 2396b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V retval = mke2fs_setup_tdb(device_name, &io_ptr); 2397b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V if (retval) 2398b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V exit(1); 2399b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V } 2400b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V 24013839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o /* 24023839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Initialize the superblock.... 24033839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */ 2404e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall flags = EXT2_FLAG_EXCLUSIVE; 2405e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (direct_io) 2406e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall flags |= EXT2_FLAG_DIRECT_IO; 2407e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall profile_get_boolean(profile, "options", "old_bitmaps", 0, 0, 2408e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall &old_bitmaps); 2409e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (!old_bitmaps) 2410e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall flags |= EXT2_FLAG_64BITS; 2411e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall /* 2412e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * By default, we print how many inode tables or block groups 2413e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * or whatever we've written so far. The quiet flag disables 2414e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * this, along with a lot of other output. 2415e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 2416e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (!quiet) 2417e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall flags |= EXT2_FLAG_PRINT_PROGRESS; 2418e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall retval = ext2fs_initialize(device_name, flags, &fs_param, io_ptr, &fs); 24193839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (retval) { 2420e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err(device_name, retval, "%s", 2421e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall _("while setting up superblock")); 24223839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o exit(1); 24233839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 242495fd65bb7fcf84e8d1e207f84b9d5a9f99626a38Valerie Aurora Henson 2425e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall /* Calculate journal blocks */ 2426e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (!journal_device && ((journal_size) || 2427e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall (fs_param.s_feature_compat & 2428e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXT3_FEATURE_COMPAT_HAS_JOURNAL))) 2429e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall journal_blocks = figure_journal_size(journal_size, fs); 243065f0aab98b20b5994a726ab90d355248bcddfffdJP Abgrall 2431e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall /* Can't undo discard ... */ 2432e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (!noaction && discard && (io_ptr != undo_io_manager)) { 2433e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall retval = mke2fs_discard_device(fs); 2434e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (!retval && io_channel_discard_zeroes_data(fs->io)) { 24356fcd6f84c235f4bf2bd9770f172837da9982eb6eEric Sandeen if (verbose) 2436e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf("%s", 2437e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall _("Discard succeeded and will return " 2438e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "0s - skipping inode table wipe\n")); 24396fcd6f84c235f4bf2bd9770f172837da9982eb6eEric Sandeen lazy_itable_init = 1; 24406fcd6f84c235f4bf2bd9770f172837da9982eb6eEric Sandeen itable_zeroed = 1; 24416fcd6f84c235f4bf2bd9770f172837da9982eb6eEric Sandeen } 24426fcd6f84c235f4bf2bd9770f172837da9982eb6eEric Sandeen } 24435827d2412d0774cb6294521a0ea578975fed07ceEric Sandeen 2444b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V sprintf(tdb_string, "tdb_data_size=%d", fs->blocksize <= 4096 ? 2445b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V 32768 : fs->blocksize * 8); 2446b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V io_channel_set_options(fs->io, tdb_string); 24473839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 24486cb27404f51f97e2665fa0e0c4c0f7bc47e698ecTheodore Ts'o if (fs_param.s_flags & EXT2_FLAGS_TEST_FILESYS) 24496cb27404f51f97e2665fa0e0c4c0f7bc47e698ecTheodore Ts'o fs->super->s_flags |= EXT2_FLAGS_TEST_FILESYS; 24506cb27404f51f97e2665fa0e0c4c0f7bc47e698ecTheodore Ts'o 2451b7c5b4030870b31d73019d9d9ec55d550772590bTheodore Ts'o if ((fs_param.s_feature_incompat & 2452b7c5b4030870b31d73019d9d9ec55d550772590bTheodore Ts'o (EXT3_FEATURE_INCOMPAT_EXTENTS|EXT4_FEATURE_INCOMPAT_FLEX_BG)) || 2453b7c5b4030870b31d73019d9d9ec55d550772590bTheodore Ts'o (fs_param.s_feature_ro_compat & 2454b7c5b4030870b31d73019d9d9ec55d550772590bTheodore Ts'o (EXT4_FEATURE_RO_COMPAT_HUGE_FILE|EXT4_FEATURE_RO_COMPAT_GDT_CSUM| 2455b7c5b4030870b31d73019d9d9ec55d550772590bTheodore Ts'o EXT4_FEATURE_RO_COMPAT_DIR_NLINK| 2456b7c5b4030870b31d73019d9d9ec55d550772590bTheodore Ts'o EXT4_FEATURE_RO_COMPAT_EXTRA_ISIZE))) 2457b7c5b4030870b31d73019d9d9ec55d550772590bTheodore Ts'o fs->super->s_kbytes_written = 1; 2458b7c5b4030870b31d73019d9d9ec55d550772590bTheodore Ts'o 24591e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o /* 2460e41784eb0e47ff5e460b635c86a0cef7250b48b4Theodore Ts'o * Wipe out the old on-disk superblock 2461e41784eb0e47ff5e460b635c86a0cef7250b48b4Theodore Ts'o */ 246204a968579ee8125c617edee27204cf35c0a169c1Theodore Ts'o if (!noaction) 246304a968579ee8125c617edee27204cf35c0a169c1Theodore Ts'o zap_sector(fs, 2, 6); 2464e41784eb0e47ff5e460b635c86a0cef7250b48b4Theodore Ts'o 2465e41784eb0e47ff5e460b635c86a0cef7250b48b4Theodore Ts'o /* 2466b0afdda1bc044026336009576fbe6b72884140cbTheodore Ts'o * Parse or generate a UUID for the filesystem 24671e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o */ 2468b0afdda1bc044026336009576fbe6b72884140cbTheodore Ts'o if (fs_uuid) { 2469b0afdda1bc044026336009576fbe6b72884140cbTheodore Ts'o if (uuid_parse(fs_uuid, fs->super->s_uuid) !=0) { 2470b0afdda1bc044026336009576fbe6b72884140cbTheodore Ts'o com_err(device_name, 0, "could not parse UUID: %s\n", 2471b0afdda1bc044026336009576fbe6b72884140cbTheodore Ts'o fs_uuid); 2472b0afdda1bc044026336009576fbe6b72884140cbTheodore Ts'o exit(1); 2473b0afdda1bc044026336009576fbe6b72884140cbTheodore Ts'o } 2474b0afdda1bc044026336009576fbe6b72884140cbTheodore Ts'o } else 2475b0afdda1bc044026336009576fbe6b72884140cbTheodore Ts'o uuid_generate(fs->super->s_uuid); 24761e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o 24771e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o /* 2478843049c4dbfe8a0dd4332569eff0ac93529e3324Theodore Ts'o * Initialize the directory index variables 2479843049c4dbfe8a0dd4332569eff0ac93529e3324Theodore Ts'o */ 2480d5f57d9553d4c855e282dbd3edf1ad85ab716d33Theodore Ts'o hash_alg_str = get_string_from_profile(fs_types, "hash_alg", 2481d5f57d9553d4c855e282dbd3edf1ad85ab716d33Theodore Ts'o "half_md4"); 2482d5f57d9553d4c855e282dbd3edf1ad85ab716d33Theodore Ts'o hash_alg = e2p_string2hash(hash_alg_str); 24835a2db04637c8494f6f600994f98fe0df23c4524cTheodore Ts'o free(hash_alg_str); 2484d5f57d9553d4c855e282dbd3edf1ad85ab716d33Theodore Ts'o fs->super->s_def_hash_version = (hash_alg >= 0) ? hash_alg : 2485d5f57d9553d4c855e282dbd3edf1ad85ab716d33Theodore Ts'o EXT2_HASH_HALF_MD4; 2486843049c4dbfe8a0dd4332569eff0ac93529e3324Theodore Ts'o uuid_generate((unsigned char *) fs->super->s_hash_seed); 2487843049c4dbfe8a0dd4332569eff0ac93529e3324Theodore Ts'o 2488843049c4dbfe8a0dd4332569eff0ac93529e3324Theodore Ts'o /* 2489e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Periodic checks can be enabled/disabled via config file. 2490e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Note we override the kernel include file's idea of what the default 2491e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * check interval (never) should be. It's a good idea to check at 2492e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * least *occasionally*, specially since servers will never rarely get 2493e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * to reboot, since Linux is so robust these days. :-) 2494e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * 2495e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * 180 days (six months) seems like a good value. 249644c09c0454925e6e7756e4dc51aac6acbf5020aeTheodore Ts'o */ 2497e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef EXT2_DFL_CHECKINTERVAL 2498e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#undef EXT2_DFL_CHECKINTERVAL 2499e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif 2500e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#define EXT2_DFL_CHECKINTERVAL (86400L * 180L) 2501e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 2502e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (get_bool_from_profile(fs_types, "enable_periodic_fsck", 0)) { 2503e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fs->super->s_checkinterval = EXT2_DFL_CHECKINTERVAL; 2504e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fs->super->s_max_mnt_count = EXT2_DFL_MAX_MNT_COUNT; 2505e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall /* 2506e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Add "jitter" to the superblock's check interval so that we 2507e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * don't check all the filesystems at the same time. We use a 2508e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * kludgy hack of using the UUID to derive a random jitter value 2509e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 2510e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall for (i = 0, val = 0 ; i < sizeof(fs->super->s_uuid); i++) 2511e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall val += fs->super->s_uuid[i]; 2512e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fs->super->s_max_mnt_count += val % EXT2_DFL_MAX_MNT_COUNT; 2513e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } else 2514e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fs->super->s_max_mnt_count = -1; 251544c09c0454925e6e7756e4dc51aac6acbf5020aeTheodore Ts'o 251644c09c0454925e6e7756e4dc51aac6acbf5020aeTheodore Ts'o /* 25171e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o * Override the creator OS, if applicable 25181e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o */ 25191e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o if (creator_os && !set_os(fs->super, creator_os)) { 2520d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o com_err (program_name, 0, _("unknown os - %s"), creator_os); 25211e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o exit(1); 25221e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o } 25231e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o 25241e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o /* 25254ea0a1109d761e9caaa53f6fa9e036321826c5faTheodore Ts'o * For the Hurd, we will turn off filetype since it doesn't 25264ea0a1109d761e9caaa53f6fa9e036321826c5faTheodore Ts'o * support it. 25274ea0a1109d761e9caaa53f6fa9e036321826c5faTheodore Ts'o */ 25284ea0a1109d761e9caaa53f6fa9e036321826c5faTheodore Ts'o if (fs->super->s_creator_os == EXT2_OS_HURD) 25294ea0a1109d761e9caaa53f6fa9e036321826c5faTheodore Ts'o fs->super->s_feature_incompat &= 25304ea0a1109d761e9caaa53f6fa9e036321826c5faTheodore Ts'o ~EXT2_FEATURE_INCOMPAT_FILETYPE; 25314ea0a1109d761e9caaa53f6fa9e036321826c5faTheodore Ts'o 25324ea0a1109d761e9caaa53f6fa9e036321826c5faTheodore Ts'o /* 25331e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o * Set the volume label... 25341e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o */ 25351e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o if (volume_label) { 2536ef9abe5f2529b3a42b46bf64c5f4232f86e7b390Theodore Ts'o memset(fs->super->s_volume_name, 0, 2537ef9abe5f2529b3a42b46bf64c5f4232f86e7b390Theodore Ts'o sizeof(fs->super->s_volume_name)); 2538ef9abe5f2529b3a42b46bf64c5f4232f86e7b390Theodore Ts'o strncpy(fs->super->s_volume_name, volume_label, 2539ef9abe5f2529b3a42b46bf64c5f4232f86e7b390Theodore Ts'o sizeof(fs->super->s_volume_name)); 25401e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o } 25411e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o 25421e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o /* 25431e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o * Set the last mount directory 25441e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o */ 25451e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o if (mount_dir) { 2546ef9abe5f2529b3a42b46bf64c5f4232f86e7b390Theodore Ts'o memset(fs->super->s_last_mounted, 0, 2547ef9abe5f2529b3a42b46bf64c5f4232f86e7b390Theodore Ts'o sizeof(fs->super->s_last_mounted)); 2548ef9abe5f2529b3a42b46bf64c5f4232f86e7b390Theodore Ts'o strncpy(fs->super->s_last_mounted, mount_dir, 2549ef9abe5f2529b3a42b46bf64c5f4232f86e7b390Theodore Ts'o sizeof(fs->super->s_last_mounted)); 25501e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o } 2551efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 255250787ea22edd8b4662203daf3569411d9dcf4287Theodore Ts'o if (!quiet || noaction) 25533839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o show_stats(fs); 25543839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 255550787ea22edd8b4662203daf3569411d9dcf4287Theodore Ts'o if (noaction) 255650787ea22edd8b4662203daf3569411d9dcf4287Theodore Ts'o exit(0); 255750787ea22edd8b4662203daf3569411d9dcf4287Theodore Ts'o 255816ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o if (fs->super->s_feature_incompat & 255916ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o EXT3_FEATURE_INCOMPAT_JOURNAL_DEV) { 256016ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o create_journal_dev(fs); 2561568101f774f9ad61d475969e91dc90da359b5a85Andreas Dilger exit(ext2fs_close(fs) ? 1 : 0); 256216ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o } 256316ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o 25643839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (bad_blocks_filename) 25653839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o read_bb_file(fs, &bb_list, bad_blocks_filename); 25663839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (cflag) 25673839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o test_disk(fs, &bb_list); 25683839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 25693839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o handle_bad_blocks(fs, bb_list); 25700c17cb25f24730dca138a976a390f105d2191736Theodore Ts'o fs->stride = fs_stride = fs->super->s_raid_stride; 2571e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (!quiet) 2572e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf("%s", _("Allocating group tables: ")); 257319c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o retval = ext2fs_allocate_tables(fs); 257419c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o if (retval) { 2575e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err(program_name, retval, "%s", 2576d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o _("while trying to allocate filesystem tables")); 257719c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o exit(1); 257819c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o } 2579e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (!quiet) 2580e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf("%s", _("done \n")); 2581e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 2582e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall retval = ext2fs_convert_subcluster_bitmap(fs, &fs->block_map); 2583e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (retval) { 2584e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err(program_name, retval, "%s", 2585e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall _("\n\twhile converting subcluster bitmap")); 2586e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall exit(1); 2587e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 2588e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 2589f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o if (super_only) { 2590f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o fs->super->s_state |= EXT2_ERROR_FS; 2591f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o fs->flags &= ~(EXT2_FLAG_IB_DIRTY|EXT2_FLAG_BB_DIRTY); 2592e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall /* 2593e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * The command "mke2fs -S" is used to recover 2594e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * corrupted file systems, so do not mark any of the 2595e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * inodes as unused; we want e2fsck to consider all 2596e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * inodes as potentially containing recoverable data. 2597e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */ 2598e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (fs->super->s_feature_ro_compat & 2599e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXT4_FEATURE_RO_COMPAT_GDT_CSUM) { 2600e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall for (i = 0; i < fs->group_desc_count; i++) 2601e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_bg_itable_unused_set(fs, i, 0); 2602e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 2603f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o } else { 260459f27247f81fb662ef3b2589b3cceb198ff4dbcaAndreas Dilger /* rsv must be a power of two (64kB is MD RAID sb alignment) */ 2605e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall blk64_t rsv = 65536 / fs->blocksize; 2606e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall blk64_t blocks = ext2fs_blocks_count(fs->super); 2607e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall blk64_t start; 2608e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall blk64_t ret_blk; 26091400bbb60bf2667ab5514abd074baf4959fe475aTheodore Ts'o 26101400bbb60bf2667ab5514abd074baf4959fe475aTheodore Ts'o#ifdef ZAP_BOOTBLOCK 261104a968579ee8125c617edee27204cf35c0a169c1Theodore Ts'o zap_sector(fs, 0, 2); 26121400bbb60bf2667ab5514abd074baf4959fe475aTheodore Ts'o#endif 261359f27247f81fb662ef3b2589b3cceb198ff4dbcaAndreas Dilger 261459f27247f81fb662ef3b2589b3cceb198ff4dbcaAndreas Dilger /* 26151400bbb60bf2667ab5514abd074baf4959fe475aTheodore Ts'o * Wipe out any old MD RAID (or other) metadata at the end 26161400bbb60bf2667ab5514abd074baf4959fe475aTheodore Ts'o * of the device. This will also verify that the device is 261759f27247f81fb662ef3b2589b3cceb198ff4dbcaAndreas Dilger * as large as we think. Be careful with very small devices. 26181400bbb60bf2667ab5514abd074baf4959fe475aTheodore Ts'o */ 261959f27247f81fb662ef3b2589b3cceb198ff4dbcaAndreas Dilger start = (blocks & ~(rsv - 1)); 262059f27247f81fb662ef3b2589b3cceb198ff4dbcaAndreas Dilger if (start > rsv) 262159f27247f81fb662ef3b2589b3cceb198ff4dbcaAndreas Dilger start -= rsv; 262259f27247f81fb662ef3b2589b3cceb198ff4dbcaAndreas Dilger if (start > 0) 2623e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall retval = ext2fs_zero_blocks2(fs, start, blocks - start, 2624b626b39a8c87dfb6d973b4ad7eca1eefa659d3d6Aneesh Kumar K.V &ret_blk, NULL); 262559f27247f81fb662ef3b2589b3cceb198ff4dbcaAndreas Dilger 26261400bbb60bf2667ab5514abd074baf4959fe475aTheodore Ts'o if (retval) { 26271400bbb60bf2667ab5514abd074baf4959fe475aTheodore Ts'o com_err(program_name, retval, 2628e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall _("while zeroing block %llu at end of filesystem"), 26291400bbb60bf2667ab5514abd074baf4959fe475aTheodore Ts'o ret_blk); 26301400bbb60bf2667ab5514abd074baf4959fe475aTheodore Ts'o } 26316fcd6f84c235f4bf2bd9770f172837da9982eb6eEric Sandeen write_inode_tables(fs, lazy_itable_init, itable_zeroed); 2632f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o create_root_dir(fs); 2633f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o create_lost_and_found(fs); 2634f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o reserve_inodes(fs); 2635f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o create_bad_block_inode(fs, bb_list); 2636efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o if (fs->super->s_feature_compat & 2637ea774315631accb05e2407765c6b448d648d14d6Theodore Ts'o EXT2_FEATURE_COMPAT_RESIZE_INODE) { 2638ea774315631accb05e2407765c6b448d648d14d6Theodore Ts'o retval = ext2fs_create_resize_inode(fs); 2639ea774315631accb05e2407765c6b448d648d14d6Theodore Ts'o if (retval) { 2640ea774315631accb05e2407765c6b448d648d14d6Theodore Ts'o com_err("ext2fs_create_resize_inode", retval, 2641e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "%s", 2642d323f8fb369089b97d6f3bf0f8d64ceeab0b10f5Theodore Ts'o _("while reserving blocks for online resize")); 2643ea774315631accb05e2407765c6b448d648d14d6Theodore Ts'o exit(1); 2644ea774315631accb05e2407765c6b448d648d14d6Theodore Ts'o } 2645d323f8fb369089b97d6f3bf0f8d64ceeab0b10f5Theodore Ts'o } 2646f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o } 26478ddaa66bfef067f1a6ba02698a61a0fd3a26e618Theodore Ts'o 264816ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o if (journal_device) { 264916ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o ext2_filsys jfs; 2650efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 26518ddaa66bfef067f1a6ba02698a61a0fd3a26e618Theodore Ts'o if (!force) 2652efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o check_plausibility(journal_device); 265363985320384bf143eaac9857af424800d9867a1aTheodore Ts'o check_mount(journal_device, force, _("journal")); 26548ddaa66bfef067f1a6ba02698a61a0fd3a26e618Theodore Ts'o 265516ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o retval = ext2fs_open(journal_device, EXT2_FLAG_RW| 265616ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o EXT2_FLAG_JOURNAL_DEV_OK, 0, 265716ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o fs->blocksize, unix_io_manager, &jfs); 265816ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o if (retval) { 265916ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o com_err(program_name, retval, 266016ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o _("while trying to open journal device %s\n"), 266116ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o journal_device); 266216ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o exit(1); 266316ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o } 266493345d1588606ccc558406202bff8f86360ab03fTheodore Ts'o if (!quiet) { 2665efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o printf(_("Adding journal to device %s: "), 26668ddaa66bfef067f1a6ba02698a61a0fd3a26e618Theodore Ts'o journal_device); 266793345d1588606ccc558406202bff8f86360ab03fTheodore Ts'o fflush(stdout); 266893345d1588606ccc558406202bff8f86360ab03fTheodore Ts'o } 266916ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o retval = ext2fs_add_journal_device(fs, jfs); 267016ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o if(retval) { 2671efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o com_err (program_name, retval, 2672efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o _("\n\twhile trying to add journal to device %s"), 26738ddaa66bfef067f1a6ba02698a61a0fd3a26e618Theodore Ts'o journal_device); 26748ddaa66bfef067f1a6ba02698a61a0fd3a26e618Theodore Ts'o exit(1); 26758ddaa66bfef067f1a6ba02698a61a0fd3a26e618Theodore Ts'o } 26768ddaa66bfef067f1a6ba02698a61a0fd3a26e618Theodore Ts'o if (!quiet) 2677e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf("%s", _("done\n")); 267816ed5b3af43c72f60991222b9d7ab65cf53f203dTheodore Ts'o ext2fs_close(jfs); 26792d15576dfe8ffd8521a6f4211cef3d2a663dc379Andreas Dilger free(journal_device); 26809dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o } else if ((journal_size) || 2681efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o (fs_param.s_feature_compat & 26829dc6ad1ecb0ba3caf14e05279f1cc3cea52095a2Theodore Ts'o EXT3_FEATURE_COMPAT_HAS_JOURNAL)) { 2683a620baddee647faf42c49ee2e04ee3f667149d68Theodore Ts'o if (super_only) { 2684e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf("%s", _("Skipping journal creation in super-only mode\n")); 2685a620baddee647faf42c49ee2e04ee3f667149d68Theodore Ts'o fs->super->s_journal_inum = EXT2_JOURNAL_INO; 2686a620baddee647faf42c49ee2e04ee3f667149d68Theodore Ts'o goto no_journal; 2687a620baddee647faf42c49ee2e04ee3f667149d68Theodore Ts'o } 2688a620baddee647faf42c49ee2e04ee3f667149d68Theodore Ts'o 268993345d1588606ccc558406202bff8f86360ab03fTheodore Ts'o if (!journal_blocks) { 269093345d1588606ccc558406202bff8f86360ab03fTheodore Ts'o fs->super->s_feature_compat &= 269193345d1588606ccc558406202bff8f86360ab03fTheodore Ts'o ~EXT3_FEATURE_COMPAT_HAS_JOURNAL; 269293345d1588606ccc558406202bff8f86360ab03fTheodore Ts'o goto no_journal; 269393345d1588606ccc558406202bff8f86360ab03fTheodore Ts'o } 269493345d1588606ccc558406202bff8f86360ab03fTheodore Ts'o if (!quiet) { 2695d4e0b1c6f5aa8c6a248d9149ed5634a310952411Theodore Ts'o printf(_("Creating journal (%u blocks): "), 269616ad33346dd4666edd9d46d417245432c87057efTheodore Ts'o journal_blocks); 269793345d1588606ccc558406202bff8f86360ab03fTheodore Ts'o fflush(stdout); 269893345d1588606ccc558406202bff8f86360ab03fTheodore Ts'o } 269963985320384bf143eaac9857af424800d9867a1aTheodore Ts'o retval = ext2fs_add_journal_inode(fs, journal_blocks, 270063985320384bf143eaac9857af424800d9867a1aTheodore Ts'o journal_flags); 270185ef4ae87a8d27d8e3a734f8b3964d6b8f39867bTheodore Ts'o if (retval) { 2702e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err(program_name, retval, "%s", 2703e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall _("\n\twhile trying to create journal")); 270485ef4ae87a8d27d8e3a734f8b3964d6b8f39867bTheodore Ts'o exit(1); 270585ef4ae87a8d27d8e3a734f8b3964d6b8f39867bTheodore Ts'o } 270685ef4ae87a8d27d8e3a734f8b3964d6b8f39867bTheodore Ts'o if (!quiet) 2707e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf("%s", _("done\n")); 270885ef4ae87a8d27d8e3a734f8b3964d6b8f39867bTheodore Ts'o } 270993345d1588606ccc558406202bff8f86360ab03fTheodore Ts'ono_journal: 2710e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (!super_only && 2711e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fs->super->s_feature_incompat & EXT4_FEATURE_INCOMPAT_MMP) { 2712e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall retval = ext2fs_mmp_init(fs); 2713e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (retval) { 2714e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fprintf(stderr, "%s", 2715e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall _("\nError while enabling multiple " 2716e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "mount protection feature.")); 2717e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall exit(1); 2718e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 2719e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (!quiet) 2720e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf(_("Multiple mount protection is enabled " 2721e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "with update interval %d seconds.\n"), 2722e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fs->super->s_mmp_update_interval); 2723e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 2724e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 2725e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (EXT2_HAS_RO_COMPAT_FEATURE(&fs_param, 2726e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXT4_FEATURE_RO_COMPAT_BIGALLOC)) 2727e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fix_cluster_bg_counts(fs); 2728e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (EXT2_HAS_RO_COMPAT_FEATURE(&fs_param, 2729e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXT4_FEATURE_RO_COMPAT_QUOTA)) 2730e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall create_quota_inodes(fs); 27311f5d7a890e8b2ad03ee91fd891b0b5b4327da030Aditya Kali 27323839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (!quiet) 2733e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf("%s", _("Writing superblocks and " 2734d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o "filesystem accounting information: ")); 2735e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall checkinterval = fs->super->s_checkinterval; 2736e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall max_mnt_count = fs->super->s_max_mnt_count; 2737e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall retval = ext2fs_close(fs); 27385d45d80375943be8917302a502f3f28d2df8d16dTheodore Ts'o if (retval) { 2739e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fprintf(stderr, "%s", 27406693837e59cc7b5397a0d46d2753c309382c76f9Theodore Ts'o _("\nWarning, had trouble writing out superblocks.")); 2741e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } else if (!quiet) { 2742e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf("%s", _("done\n\n")); 27431cca86f5d886eeda2d3afb1206419ef4642c30baTheodore Ts'o if (!getenv("MKE2FS_SKIP_CHECK_MSG")) 2744e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall print_check_message(max_mnt_count, checkinterval); 274593345d1588606ccc558406202bff8f86360ab03fTheodore Ts'o } 2746e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 2747a6d8302b4873527798a77c1ba3106a04b71dfeacTheodore Ts'o remove_error_table(&et_ext2_error_table); 2748a6d8302b4873527798a77c1ba3106a04b71dfeacTheodore Ts'o remove_error_table(&et_prof_error_table); 27493d43836fda5321dd2f286eef77d238d1da792ce2Theodore Ts'o profile_release(profile); 27505a2db04637c8494f6f600994f98fe0df23c4524cTheodore Ts'o for (i=0; fs_types[i]; i++) 27515a2db04637c8494f6f600994f98fe0df23c4524cTheodore Ts'o free(fs_types[i]); 27525a2db04637c8494f6f600994f98fe0df23c4524cTheodore Ts'o free(fs_types); 2753e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall return retval; 27543839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 2755