tune2fs.c revision 4055ef7301ddf93120eb174f3473be15ce5a658b
13839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/* 23839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * tune2fs.c - Change the file system parameters on 33839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * an unmounted second extended file system 43839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * 53839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Copyright (C) 1992, 1993, 1994 Remy Card <card@masi.ibp.fr> 63839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Laboratoire MASI, Institut Blaise Pascal 73839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Universite Pierre et Marie Curie (Paris VI) 83839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * 919c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o * Copyright 1995, 1996, 1997 by Theodore Ts'o. 1019c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o * 1119c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o * %Begin-Header% 1219c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o * This file may be redistributed under the terms of the GNU Public 1319c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o * License. 1419c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o * %End-Header% 153839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */ 163839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 173839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/* 183839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * History: 193839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * 93/06/01 - Creation 203839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * 93/10/31 - Added the -c option to change the maximal mount counts 213839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * 93/12/14 - Added -l flag to list contents of superblock 223839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * M.J.E. Mol (marcel@duteca.et.tudelft.nl) 233839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * F.W. ten Wolde (franky@duteca.et.tudelft.nl) 243839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * 93/12/29 - Added the -e option to change errors behavior 253839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * 94/02/27 - Ported to use the ext2fs library 263839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * 94/03/06 - Added the checks interval from Uwe Ohse (uwe@tirka.gun.de) 273839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */ 283839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 293839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <fcntl.h> 30f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o#include <grp.h> 31a418d3ad819323f871005d253f7f9ac378e78ba5Theodore Ts'o#ifdef HAVE_GETOPT_H 323839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <getopt.h> 33373b8337c7b6c6243810be250083fa4773891e92Theodore Ts'o#else 34373b8337c7b6c6243810be250083fa4773891e92Theodore Ts'oextern char *optarg; 35373b8337c7b6c6243810be250083fa4773891e92Theodore Ts'oextern int optind; 36a418d3ad819323f871005d253f7f9ac378e78ba5Theodore Ts'o#endif 37f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o#include <pwd.h> 383839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <stdio.h> 393839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <stdlib.h> 403839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <string.h> 413839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <time.h> 423839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <unistd.h> 43f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o#include <sys/types.h> 443839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 453839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include <linux/ext2_fs.h> 463839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 473839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include "ext2fs/ext2fs.h" 483839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include "et/com_err.h" 491e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o#include "uuid/uuid.h" 503839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include "e2p/e2p.h" 5163985320384bf143eaac9857af424800d9867a1aTheodore Ts'o#include "util.h" 523839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 533839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include "../version.h" 54d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o#include "nls-enable.h" 553839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 563839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oconst char * program_name = "tune2fs"; 5763985320384bf143eaac9857af424800d9867a1aTheodore Ts'ochar * device_name; 58c8c071a07319939dfd7ae2ff1dedec644d750debTheodore Ts'ochar * new_label, *new_last_mounted, *new_UUID; 59c8c071a07319939dfd7ae2ff1dedec644d750debTheodore Ts'oconst char *journal_opts; 6063985320384bf143eaac9857af424800d9867a1aTheodore Ts'ostatic int c_flag, C_flag, e_flag, g_flag, i_flag, l_flag, L_flag; 6163985320384bf143eaac9857af424800d9867a1aTheodore Ts'ostatic int m_flag, M_flag, r_flag, s_flag = -1, u_flag, U_flag; 62832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'ostatic int print_label; 6363985320384bf143eaac9857af424800d9867a1aTheodore Ts'ostatic int max_mount_count, mount_count, mount_flags; 6463985320384bf143eaac9857af424800d9867a1aTheodore Ts'ostatic unsigned long interval, reserved_ratio, reserved_blocks; 6563985320384bf143eaac9857af424800d9867a1aTheodore Ts'ostatic unsigned long resgid, resuid; 6663985320384bf143eaac9857af424800d9867a1aTheodore Ts'ostatic unsigned short errors; 67832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'ostatic int open_flag; 68832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'ostatic char *features_cmd; 693839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 7063985320384bf143eaac9857af424800d9867a1aTheodore Ts'oint journal_size, journal_flags; 7163985320384bf143eaac9857af424800d9867a1aTheodore Ts'ochar *journal_device; 7263985320384bf143eaac9857af424800d9867a1aTheodore Ts'o 7363985320384bf143eaac9857af424800d9867a1aTheodore Ts'ostatic const char *please_fsck = N_("Please run e2fsck on the filesystem.\n"); 741e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o 75818180cdfcff84b9048ecdc5dc86323f0fefba24Theodore Ts'ostatic void usage(void) 763839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 77b21e38a0df0111f527f7b286ff9119534de04c09Theodore Ts'o fprintf(stderr, 78b21e38a0df0111f527f7b286ff9119534de04c09Theodore Ts'o _("Usage: %s [-c max-mounts-count] [-e errors-behavior] " 79b21e38a0df0111f527f7b286ff9119534de04c09Theodore Ts'o "[-g group]\n" 8063985320384bf143eaac9857af424800d9867a1aTheodore Ts'o "\t[-i interval[d|m|w]] [-j journal-options]\n" 8163985320384bf143eaac9857af424800d9867a1aTheodore Ts'o "\t[-l] [-s sparse-flag] [-m reserved-blocks-percent]\n" 82b21e38a0df0111f527f7b286ff9119534de04c09Theodore Ts'o "\t[-r reserved-blocks-count] [-u user] [-C mount-count]\n" 83b21e38a0df0111f527f7b286ff9119534de04c09Theodore Ts'o "\t[-L volume-label] [-M last-mounted-dir] [-U UUID]\n" 84b21e38a0df0111f527f7b286ff9119534de04c09Theodore Ts'o "\t[-O [^]feature[,...]] device\n"), program_name); 853839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o exit (1); 863839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 873839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 88896938d57e7091e7a032674dfeeb91f2a17fd78bTheodore Ts'ostatic __u32 ok_features[3] = { 89b21e38a0df0111f527f7b286ff9119534de04c09Theodore Ts'o EXT3_FEATURE_COMPAT_HAS_JOURNAL, /* Compat */ 90896938d57e7091e7a032674dfeeb91f2a17fd78bTheodore Ts'o EXT2_FEATURE_INCOMPAT_FILETYPE, /* Incompat */ 91896938d57e7091e7a032674dfeeb91f2a17fd78bTheodore Ts'o EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER /* R/O compat */ 92896938d57e7091e7a032674dfeeb91f2a17fd78bTheodore Ts'o}; 93896938d57e7091e7a032674dfeeb91f2a17fd78bTheodore Ts'o 9463985320384bf143eaac9857af424800d9867a1aTheodore Ts'o/* 9563985320384bf143eaac9857af424800d9867a1aTheodore Ts'o * Update the feature set as provided by the user. 9663985320384bf143eaac9857af424800d9867a1aTheodore Ts'o */ 97c8c071a07319939dfd7ae2ff1dedec644d750debTheodore Ts'ostatic void update_feature_set(ext2_filsys fs, char *features) 9863985320384bf143eaac9857af424800d9867a1aTheodore Ts'o{ 9963985320384bf143eaac9857af424800d9867a1aTheodore Ts'o int sparse, old_sparse, filetype, old_filetype; 10063985320384bf143eaac9857af424800d9867a1aTheodore Ts'o int journal, old_journal; 10163985320384bf143eaac9857af424800d9867a1aTheodore Ts'o struct ext2_inode inode; 10263985320384bf143eaac9857af424800d9867a1aTheodore Ts'o struct ext2_super_block *sb= fs->super; 10363985320384bf143eaac9857af424800d9867a1aTheodore Ts'o errcode_t retval; 10463985320384bf143eaac9857af424800d9867a1aTheodore Ts'o 10563985320384bf143eaac9857af424800d9867a1aTheodore Ts'o old_sparse = sb->s_feature_ro_compat & 10663985320384bf143eaac9857af424800d9867a1aTheodore Ts'o EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER; 10763985320384bf143eaac9857af424800d9867a1aTheodore Ts'o old_filetype = sb->s_feature_incompat & 10863985320384bf143eaac9857af424800d9867a1aTheodore Ts'o EXT2_FEATURE_INCOMPAT_FILETYPE; 10963985320384bf143eaac9857af424800d9867a1aTheodore Ts'o old_journal = sb->s_feature_compat & 11063985320384bf143eaac9857af424800d9867a1aTheodore Ts'o EXT3_FEATURE_COMPAT_HAS_JOURNAL; 111c8c071a07319939dfd7ae2ff1dedec644d750debTheodore Ts'o if (e2p_edit_feature(features, &sb->s_feature_compat, 11263985320384bf143eaac9857af424800d9867a1aTheodore Ts'o ok_features)) { 11363985320384bf143eaac9857af424800d9867a1aTheodore Ts'o fprintf(stderr, _("Invalid filesystem option set: %s\n"), 114c8c071a07319939dfd7ae2ff1dedec644d750debTheodore Ts'o features); 11563985320384bf143eaac9857af424800d9867a1aTheodore Ts'o exit(1); 11663985320384bf143eaac9857af424800d9867a1aTheodore Ts'o } 11763985320384bf143eaac9857af424800d9867a1aTheodore Ts'o sparse = sb->s_feature_ro_compat & 11863985320384bf143eaac9857af424800d9867a1aTheodore Ts'o EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER; 11963985320384bf143eaac9857af424800d9867a1aTheodore Ts'o filetype = sb->s_feature_incompat & 12063985320384bf143eaac9857af424800d9867a1aTheodore Ts'o EXT2_FEATURE_INCOMPAT_FILETYPE; 12163985320384bf143eaac9857af424800d9867a1aTheodore Ts'o journal = sb->s_feature_compat & 12263985320384bf143eaac9857af424800d9867a1aTheodore Ts'o EXT3_FEATURE_COMPAT_HAS_JOURNAL; 12363985320384bf143eaac9857af424800d9867a1aTheodore Ts'o if (old_journal && !journal) { 12463985320384bf143eaac9857af424800d9867a1aTheodore Ts'o if ((mount_flags & EXT2_MF_MOUNTED) && 12563985320384bf143eaac9857af424800d9867a1aTheodore Ts'o !(mount_flags & EXT2_MF_READONLY)) { 12663985320384bf143eaac9857af424800d9867a1aTheodore Ts'o fprintf(stderr, 12763985320384bf143eaac9857af424800d9867a1aTheodore Ts'o _("The HAS_JOURNAL flag may only be " 12863985320384bf143eaac9857af424800d9867a1aTheodore Ts'o "cleared when the filesystem is\n" 12963985320384bf143eaac9857af424800d9867a1aTheodore Ts'o "unmounted or mounted " 13063985320384bf143eaac9857af424800d9867a1aTheodore Ts'o "read-only.\n")); 13163985320384bf143eaac9857af424800d9867a1aTheodore Ts'o exit(1); 13263985320384bf143eaac9857af424800d9867a1aTheodore Ts'o } 13363985320384bf143eaac9857af424800d9867a1aTheodore Ts'o if (sb->s_feature_incompat & 13463985320384bf143eaac9857af424800d9867a1aTheodore Ts'o EXT3_FEATURE_INCOMPAT_RECOVER) { 13563985320384bf143eaac9857af424800d9867a1aTheodore Ts'o fprintf(stderr, 13663985320384bf143eaac9857af424800d9867a1aTheodore Ts'o _("The NEEDS_RECOVERY flag is set. " 13763985320384bf143eaac9857af424800d9867a1aTheodore Ts'o "Please run e2fsck before clearing\n" 13863985320384bf143eaac9857af424800d9867a1aTheodore Ts'o "the HAS_JOURNAL flag.\n")); 13963985320384bf143eaac9857af424800d9867a1aTheodore Ts'o exit(1); 14063985320384bf143eaac9857af424800d9867a1aTheodore Ts'o } 14163985320384bf143eaac9857af424800d9867a1aTheodore Ts'o /* 14263985320384bf143eaac9857af424800d9867a1aTheodore Ts'o * Remove the immutable flag on the journal inode 14363985320384bf143eaac9857af424800d9867a1aTheodore Ts'o */ 14463985320384bf143eaac9857af424800d9867a1aTheodore Ts'o if (sb->s_journal_inum) { 14563985320384bf143eaac9857af424800d9867a1aTheodore Ts'o retval = ext2fs_read_inode(fs, sb->s_journal_inum, 14663985320384bf143eaac9857af424800d9867a1aTheodore Ts'o &inode); 14763985320384bf143eaac9857af424800d9867a1aTheodore Ts'o if (retval) { 14863985320384bf143eaac9857af424800d9867a1aTheodore Ts'o com_err(program_name, retval, 14963985320384bf143eaac9857af424800d9867a1aTheodore Ts'o "while reading journal inode"); 15063985320384bf143eaac9857af424800d9867a1aTheodore Ts'o exit(1); 15163985320384bf143eaac9857af424800d9867a1aTheodore Ts'o } 15263985320384bf143eaac9857af424800d9867a1aTheodore Ts'o inode.i_flags &= ~EXT2_IMMUTABLE_FL; 15363985320384bf143eaac9857af424800d9867a1aTheodore Ts'o retval = ext2fs_write_inode(fs, sb->s_journal_inum, 15463985320384bf143eaac9857af424800d9867a1aTheodore Ts'o &inode); 15563985320384bf143eaac9857af424800d9867a1aTheodore Ts'o if (retval) { 15663985320384bf143eaac9857af424800d9867a1aTheodore Ts'o com_err(program_name, retval, 15763985320384bf143eaac9857af424800d9867a1aTheodore Ts'o "while write journal inode"); 15863985320384bf143eaac9857af424800d9867a1aTheodore Ts'o exit(1); 15963985320384bf143eaac9857af424800d9867a1aTheodore Ts'o } 16063985320384bf143eaac9857af424800d9867a1aTheodore Ts'o } 16163985320384bf143eaac9857af424800d9867a1aTheodore Ts'o } 16263985320384bf143eaac9857af424800d9867a1aTheodore Ts'o if (journal && !old_journal) { 16363985320384bf143eaac9857af424800d9867a1aTheodore Ts'o /* 16463985320384bf143eaac9857af424800d9867a1aTheodore Ts'o * If adding a journal flag, let the create journal 16563985320384bf143eaac9857af424800d9867a1aTheodore Ts'o * code below handle creating setting the flag and 16663985320384bf143eaac9857af424800d9867a1aTheodore Ts'o * creating the journal. We supply a default size if 16763985320384bf143eaac9857af424800d9867a1aTheodore Ts'o * necessary. 16863985320384bf143eaac9857af424800d9867a1aTheodore Ts'o */ 16963985320384bf143eaac9857af424800d9867a1aTheodore Ts'o if (!journal_opts) 17063985320384bf143eaac9857af424800d9867a1aTheodore Ts'o journal_opts = "size=16"; 17163985320384bf143eaac9857af424800d9867a1aTheodore Ts'o sb->s_feature_compat &=~EXT3_FEATURE_COMPAT_HAS_JOURNAL; 17263985320384bf143eaac9857af424800d9867a1aTheodore Ts'o journal = old_journal; 17363985320384bf143eaac9857af424800d9867a1aTheodore Ts'o } 17463985320384bf143eaac9857af424800d9867a1aTheodore Ts'o 17563985320384bf143eaac9857af424800d9867a1aTheodore Ts'o if (sb->s_rev_level == EXT2_GOOD_OLD_REV && 17663985320384bf143eaac9857af424800d9867a1aTheodore Ts'o (sb->s_feature_compat || sb->s_feature_ro_compat || 17763985320384bf143eaac9857af424800d9867a1aTheodore Ts'o sb->s_feature_incompat)) 17863985320384bf143eaac9857af424800d9867a1aTheodore Ts'o ext2fs_update_dynamic_rev(fs); 17963985320384bf143eaac9857af424800d9867a1aTheodore Ts'o if ((sparse != old_sparse) || 18063985320384bf143eaac9857af424800d9867a1aTheodore Ts'o (filetype != old_filetype) || 18163985320384bf143eaac9857af424800d9867a1aTheodore Ts'o (journal != old_journal)) { 18263985320384bf143eaac9857af424800d9867a1aTheodore Ts'o sb->s_state &= ~EXT2_VALID_FS; 18363985320384bf143eaac9857af424800d9867a1aTheodore Ts'o printf("\n%s\n", _(please_fsck)); 18463985320384bf143eaac9857af424800d9867a1aTheodore Ts'o } 18563985320384bf143eaac9857af424800d9867a1aTheodore Ts'o ext2fs_mark_super_dirty(fs); 18663985320384bf143eaac9857af424800d9867a1aTheodore Ts'o} 18763985320384bf143eaac9857af424800d9867a1aTheodore Ts'o 18863985320384bf143eaac9857af424800d9867a1aTheodore Ts'o/* 18963985320384bf143eaac9857af424800d9867a1aTheodore Ts'o * Add a journal to the filesystem. 19063985320384bf143eaac9857af424800d9867a1aTheodore Ts'o */ 19163985320384bf143eaac9857af424800d9867a1aTheodore Ts'ostatic void add_journal(ext2_filsys fs) 19263985320384bf143eaac9857af424800d9867a1aTheodore Ts'o{ 19363985320384bf143eaac9857af424800d9867a1aTheodore Ts'o unsigned long journal_blocks; 19463985320384bf143eaac9857af424800d9867a1aTheodore Ts'o errcode_t retval; 19563985320384bf143eaac9857af424800d9867a1aTheodore Ts'o 19663985320384bf143eaac9857af424800d9867a1aTheodore Ts'o if (fs->super->s_feature_compat & 19763985320384bf143eaac9857af424800d9867a1aTheodore Ts'o EXT3_FEATURE_COMPAT_HAS_JOURNAL) { 19863985320384bf143eaac9857af424800d9867a1aTheodore Ts'o fprintf(stderr, _("The filesystem already has a journal.\n")); 19963985320384bf143eaac9857af424800d9867a1aTheodore Ts'o exit(1); 20063985320384bf143eaac9857af424800d9867a1aTheodore Ts'o } 20163985320384bf143eaac9857af424800d9867a1aTheodore Ts'o parse_journal_opts(journal_opts); 20263985320384bf143eaac9857af424800d9867a1aTheodore Ts'o journal_blocks = journal_size * 1024 / (fs->blocksize / 1024); 20363985320384bf143eaac9857af424800d9867a1aTheodore Ts'o if (journal_device) { 20463985320384bf143eaac9857af424800d9867a1aTheodore Ts'o check_plausibility(journal_device); 20563985320384bf143eaac9857af424800d9867a1aTheodore Ts'o check_mount(journal_device, 0, _("journal")); 20663985320384bf143eaac9857af424800d9867a1aTheodore Ts'o printf(_("Creating journal on device %s: "), 20763985320384bf143eaac9857af424800d9867a1aTheodore Ts'o journal_device); 2084055ef7301ddf93120eb174f3473be15ce5a658bTheodore Ts'o fflush(stdout); 20963985320384bf143eaac9857af424800d9867a1aTheodore Ts'o retval = ext2fs_add_journal_device(fs, journal_device, 21063985320384bf143eaac9857af424800d9867a1aTheodore Ts'o journal_blocks, 21163985320384bf143eaac9857af424800d9867a1aTheodore Ts'o journal_flags); 21263985320384bf143eaac9857af424800d9867a1aTheodore Ts'o if (retval) { 21363985320384bf143eaac9857af424800d9867a1aTheodore Ts'o com_err (program_name, retval, 21463985320384bf143eaac9857af424800d9867a1aTheodore Ts'o _("while trying to create journal on device %s"), 21563985320384bf143eaac9857af424800d9867a1aTheodore Ts'o journal_device); 21663985320384bf143eaac9857af424800d9867a1aTheodore Ts'o exit(1); 21763985320384bf143eaac9857af424800d9867a1aTheodore Ts'o } 21863985320384bf143eaac9857af424800d9867a1aTheodore Ts'o printf(_("done\n")); 21963985320384bf143eaac9857af424800d9867a1aTheodore Ts'o } else if (journal_size) { 22063985320384bf143eaac9857af424800d9867a1aTheodore Ts'o printf(_("Creating journal inode: ")); 22163985320384bf143eaac9857af424800d9867a1aTheodore Ts'o fflush(stdout); 22263985320384bf143eaac9857af424800d9867a1aTheodore Ts'o retval = ext2fs_add_journal_inode(fs, journal_blocks, 22363985320384bf143eaac9857af424800d9867a1aTheodore Ts'o journal_flags); 22463985320384bf143eaac9857af424800d9867a1aTheodore Ts'o if (retval) { 22563985320384bf143eaac9857af424800d9867a1aTheodore Ts'o printf("\n"); 22663985320384bf143eaac9857af424800d9867a1aTheodore Ts'o com_err(program_name, retval, 22763985320384bf143eaac9857af424800d9867a1aTheodore Ts'o _("while trying to create journal")); 22863985320384bf143eaac9857af424800d9867a1aTheodore Ts'o exit(1); 22963985320384bf143eaac9857af424800d9867a1aTheodore Ts'o } 23063985320384bf143eaac9857af424800d9867a1aTheodore Ts'o printf(_("done\n")); 23163985320384bf143eaac9857af424800d9867a1aTheodore Ts'o /* 23263985320384bf143eaac9857af424800d9867a1aTheodore Ts'o * If the filesystem wasn't mounted, we need to force 23363985320384bf143eaac9857af424800d9867a1aTheodore Ts'o * the block group descriptors out. 23463985320384bf143eaac9857af424800d9867a1aTheodore Ts'o */ 23563985320384bf143eaac9857af424800d9867a1aTheodore Ts'o if ((mount_flags & EXT2_MF_MOUNTED) == 0) 23663985320384bf143eaac9857af424800d9867a1aTheodore Ts'o fs->flags &= ~EXT2_FLAG_SUPER_ONLY; 23763985320384bf143eaac9857af424800d9867a1aTheodore Ts'o } 23863985320384bf143eaac9857af424800d9867a1aTheodore Ts'o} 23963985320384bf143eaac9857af424800d9867a1aTheodore Ts'o 240832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o/* 241832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o * Given argv[0], return the program name. 242832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o */ 243c8c071a07319939dfd7ae2ff1dedec644d750debTheodore Ts'ostatic char *get_progname(char *argv_zero) 244832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o{ 245832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o char *cp; 24663985320384bf143eaac9857af424800d9867a1aTheodore Ts'o 247832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o cp = strrchr(argv_zero, '/'); 248832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o if (!cp ) 249832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o return argv_zero; 250832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o else 251832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o return cp+1; 252832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o} 253896938d57e7091e7a032674dfeeb91f2a17fd78bTheodore Ts'o 254832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o 255c8c071a07319939dfd7ae2ff1dedec644d750debTheodore Ts'ostatic void parse_e2label_options(int argc, char ** argv) 256832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o{ 257832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o if ((argc < 2) || (argc > 3)) { 258832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o fprintf(stderr, _("Usage: e2label device [newlabel]\n")); 259832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o exit(1); 260832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o } 261832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o device_name = argv[1]; 262832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o if (argc == 3) { 263832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o open_flag = EXT2_FLAG_RW; 264832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o L_flag = 1; 265832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o new_label = argv[2]; 266832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o } else 267832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o print_label++; 268832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o} 269832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o 270832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o 271c8c071a07319939dfd7ae2ff1dedec644d750debTheodore Ts'ostatic void parse_tune2fs_options(int argc, char **argv) 2723839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 273519149fb458b0fa69c10fecd83fae42e838cf01dTheodore Ts'o int c; 2743839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o char * tmp; 275f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o struct group * gr; 276f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o struct passwd * pw; 2773839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 278d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o fprintf (stderr, _("tune2fs %s, %s for EXT2 FS %s, %s\n"), 2793839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o E2FSPROGS_VERSION, E2FSPROGS_DATE, 2803839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o EXT2FS_VERSION, EXT2FS_DATE); 28163985320384bf143eaac9857af424800d9867a1aTheodore Ts'o while ((c = getopt (argc, argv, "c:e:g:i:j:lm:r:s:u:C:L:M:O:U:")) != EOF) 2823839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o switch (c) 2833839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o { 2843839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o case 'c': 28545d9e2ff7c4bc08d77b3b671e1da5a94dff2cbeeTheodore Ts'o max_mount_count = strtol (optarg, &tmp, 0); 286818180cdfcff84b9048ecdc5dc86323f0fefba24Theodore Ts'o if (*tmp || max_mount_count > 16000) { 2873839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o com_err (program_name, 0, 288d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o _("bad mounts count - %s"), 2893839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o optarg); 290818180cdfcff84b9048ecdc5dc86323f0fefba24Theodore Ts'o usage(); 2913839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 2923839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o c_flag = 1; 2931e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o open_flag = EXT2_FLAG_RW; 2941e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o break; 2951e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o case 'C': 2961e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o mount_count = strtoul (optarg, &tmp, 0); 297818180cdfcff84b9048ecdc5dc86323f0fefba24Theodore Ts'o if (*tmp || mount_count > 16000) { 2981e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o com_err (program_name, 0, 299d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o _("bad mounts count - %s"), 3001e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o optarg); 301818180cdfcff84b9048ecdc5dc86323f0fefba24Theodore Ts'o usage(); 3021e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o } 3031e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o C_flag = 1; 3041e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o open_flag = EXT2_FLAG_RW; 3053839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o break; 3063839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o case 'e': 3073839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (strcmp (optarg, "continue") == 0) 3083839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o errors = EXT2_ERRORS_CONTINUE; 3093839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o else if (strcmp (optarg, "remount-ro") == 0) 3103839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o errors = EXT2_ERRORS_RO; 3113839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o else if (strcmp (optarg, "panic") == 0) 3123839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o errors = EXT2_ERRORS_PANIC; 313818180cdfcff84b9048ecdc5dc86323f0fefba24Theodore Ts'o else { 3143839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o com_err (program_name, 0, 315d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o _("bad error behavior - %s"), 3163839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o optarg); 317818180cdfcff84b9048ecdc5dc86323f0fefba24Theodore Ts'o usage(); 3183839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 3193839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o e_flag = 1; 3201e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o open_flag = EXT2_FLAG_RW; 3213839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o break; 322f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o case 'g': 323f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o resgid = strtoul (optarg, &tmp, 0); 324818180cdfcff84b9048ecdc5dc86323f0fefba24Theodore Ts'o if (*tmp) { 325f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o gr = getgrnam (optarg); 326f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o if (gr == NULL) 327f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o tmp = optarg; 328a418d3ad819323f871005d253f7f9ac378e78ba5Theodore Ts'o else { 329f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o resgid = gr->gr_gid; 330a418d3ad819323f871005d253f7f9ac378e78ba5Theodore Ts'o *tmp =0; 331a418d3ad819323f871005d253f7f9ac378e78ba5Theodore Ts'o } 332f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o } 333818180cdfcff84b9048ecdc5dc86323f0fefba24Theodore Ts'o if (*tmp) { 334f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o com_err (program_name, 0, 335d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o _("bad gid/group name - %s"), 336f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o optarg); 337818180cdfcff84b9048ecdc5dc86323f0fefba24Theodore Ts'o usage(); 338f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o } 339f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o g_flag = 1; 3401e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o open_flag = EXT2_FLAG_RW; 341f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o break; 3423839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o case 'i': 3433839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o interval = strtoul (optarg, &tmp, 0); 3441e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o switch (*tmp) { 3451e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o case 's': 3461e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o tmp++; 3471e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o break; 3481e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o case '\0': 3491e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o case 'd': 3501e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o case 'D': /* days */ 3511e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o interval *= 86400; 3521e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o if (*tmp != '\0') 353f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o tmp++; 3541e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o break; 3551e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o case 'm': 3561e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o case 'M': /* months! */ 3571e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o interval *= 86400 * 30; 3581e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o tmp++; 3591e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o break; 3601e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o case 'w': 3611e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o case 'W': /* weeks */ 3621e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o interval *= 86400 * 7; 3631e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o tmp++; 3641e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o break; 3653839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 366818180cdfcff84b9048ecdc5dc86323f0fefba24Theodore Ts'o if (*tmp || interval > (365 * 86400)) { 3673839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o com_err (program_name, 0, 368d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o _("bad interval - %s"), optarg); 369818180cdfcff84b9048ecdc5dc86323f0fefba24Theodore Ts'o usage(); 3703839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 3713839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o i_flag = 1; 3721e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o open_flag = EXT2_FLAG_RW; 3733839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o break; 3743839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o case 'l': 3753839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o l_flag = 1; 3763839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o break; 37763985320384bf143eaac9857af424800d9867a1aTheodore Ts'o case 'j': 37863985320384bf143eaac9857af424800d9867a1aTheodore Ts'o journal_opts = optarg; 37963985320384bf143eaac9857af424800d9867a1aTheodore Ts'o open_flag = EXT2_FLAG_RW; 38063985320384bf143eaac9857af424800d9867a1aTheodore Ts'o break; 3811e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o case 'L': 3821e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o new_label = optarg; 3831e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o L_flag = 1; 3841e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o open_flag = EXT2_FLAG_RW; 3851e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o break; 3863839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o case 'm': 3873839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o reserved_ratio = strtoul (optarg, &tmp, 0); 388818180cdfcff84b9048ecdc5dc86323f0fefba24Theodore Ts'o if (*tmp || reserved_ratio > 50) { 3893839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o com_err (program_name, 0, 390d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o _("bad reserved block ratio - %s"), 3913839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o optarg); 392818180cdfcff84b9048ecdc5dc86323f0fefba24Theodore Ts'o usage(); 3933839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 3943839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o m_flag = 1; 3951e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o open_flag = EXT2_FLAG_RW; 3961e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o break; 3971e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o case 'M': 3981e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o new_last_mounted = optarg; 3991e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o M_flag = 1; 4001e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o open_flag = EXT2_FLAG_RW; 4013839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o break; 402896938d57e7091e7a032674dfeeb91f2a17fd78bTheodore Ts'o case 'O': 403896938d57e7091e7a032674dfeeb91f2a17fd78bTheodore Ts'o features_cmd = optarg; 404896938d57e7091e7a032674dfeeb91f2a17fd78bTheodore Ts'o open_flag = EXT2_FLAG_RW; 405896938d57e7091e7a032674dfeeb91f2a17fd78bTheodore Ts'o break; 406f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o case 'r': 407f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o reserved_blocks = strtoul (optarg, &tmp, 0); 408818180cdfcff84b9048ecdc5dc86323f0fefba24Theodore Ts'o if (*tmp) { 409f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o com_err (program_name, 0, 410d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o _("bad reserved blocks count - %s"), 411f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o optarg); 412818180cdfcff84b9048ecdc5dc86323f0fefba24Theodore Ts'o usage(); 413f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o } 414f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o r_flag = 1; 4151e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o open_flag = EXT2_FLAG_RW; 416f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o break; 417521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o case 's': 418521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o s_flag = atoi(optarg); 419521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o open_flag = EXT2_FLAG_RW; 420521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o break; 421f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o case 'u': 422f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o resuid = strtoul (optarg, &tmp, 0); 423818180cdfcff84b9048ecdc5dc86323f0fefba24Theodore Ts'o if (*tmp) { 424f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o pw = getpwnam (optarg); 425f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o if (pw == NULL) 426f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o tmp = optarg; 427a418d3ad819323f871005d253f7f9ac378e78ba5Theodore Ts'o else { 428f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o resuid = pw->pw_uid; 429a418d3ad819323f871005d253f7f9ac378e78ba5Theodore Ts'o *tmp = 0; 430a418d3ad819323f871005d253f7f9ac378e78ba5Theodore Ts'o } 431f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o } 432818180cdfcff84b9048ecdc5dc86323f0fefba24Theodore Ts'o if (*tmp) { 433f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o com_err (program_name, 0, 434d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o _("bad uid/user name - %s"), 435f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o optarg); 436818180cdfcff84b9048ecdc5dc86323f0fefba24Theodore Ts'o usage(); 437f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o } 438f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o u_flag = 1; 4391e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o open_flag = EXT2_FLAG_RW; 4401e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o break; 4411e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o case 'U': 4421e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o new_UUID = optarg; 4431e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o U_flag = 1; 4441e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o open_flag = EXT2_FLAG_RW; 445f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o break; 4463839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o default: 447818180cdfcff84b9048ecdc5dc86323f0fefba24Theodore Ts'o usage(); 4483839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 4493839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (optind < argc - 1 || optind == argc) 450818180cdfcff84b9048ecdc5dc86323f0fefba24Theodore Ts'o usage(); 4511e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o if (!open_flag && !l_flag) 4521e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o usage(); 4533839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o device_name = argv[optind]; 454832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o} 455832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o 456832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o 457832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o 458832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'oint main (int argc, char ** argv) 459832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o{ 460832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o errcode_t retval; 461832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o ext2_filsys fs; 462832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o struct ext2_super_block *sb; 463832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o 464832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o#ifdef ENABLE_NLS 465832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o setlocale(LC_MESSAGES, ""); 466832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o bindtextdomain(NLS_CAT_NAME, LOCALEDIR); 467832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o textdomain(NLS_CAT_NAME); 468832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o#endif 469832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o if (argc && *argv) 470832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o program_name = *argv; 471832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o initialize_ext2_error_table(); 472832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o 473832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o if (strcmp(get_progname(argv[0]), "e2label") == 0) 474832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o parse_e2label_options(argc, argv); 475832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o else 476832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o parse_tune2fs_options(argc, argv); 477832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o 4781e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o retval = ext2fs_open (device_name, open_flag, 0, 0, 4791e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o unix_io_manager, &fs); 480818180cdfcff84b9048ecdc5dc86323f0fefba24Theodore Ts'o if (retval) { 481d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o com_err (program_name, retval, _("while trying to open %s"), 4823839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o device_name); 483d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o printf(_("Couldn't find valid filesystem superblock.\n")); 4843839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o exit(1); 4853839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 486832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o sb = fs->super; 487832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o if (print_label) { 488832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o /* For e2label emulation */ 489c8c071a07319939dfd7ae2ff1dedec644d750debTheodore Ts'o printf("%.*s\n", (int) sizeof(sb->s_volume_name), 490c8c071a07319939dfd7ae2ff1dedec644d750debTheodore Ts'o sb->s_volume_name); 491832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o exit(0); 492832381536ee28ea493b73785f7c0cfdd403a8269Theodore Ts'o } 493b21e38a0df0111f527f7b286ff9119534de04c09Theodore Ts'o retval = ext2fs_check_if_mounted(device_name, &mount_flags); 494b21e38a0df0111f527f7b286ff9119534de04c09Theodore Ts'o if (retval) { 495b21e38a0df0111f527f7b286ff9119534de04c09Theodore Ts'o com_err("ext2fs_check_if_mount", retval, 496b21e38a0df0111f527f7b286ff9119534de04c09Theodore Ts'o _("while determining whether %s is mounted."), 497b21e38a0df0111f527f7b286ff9119534de04c09Theodore Ts'o device_name); 4984055ef7301ddf93120eb174f3473be15ce5a658bTheodore Ts'o exit(1); 499b21e38a0df0111f527f7b286ff9119534de04c09Theodore Ts'o } 50063985320384bf143eaac9857af424800d9867a1aTheodore Ts'o /* Normally we only need to write out the superblock */ 50163985320384bf143eaac9857af424800d9867a1aTheodore Ts'o fs->flags |= EXT2_FLAG_SUPER_ONLY; 5023839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 5031e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o if (c_flag) { 504b21e38a0df0111f527f7b286ff9119534de04c09Theodore Ts'o sb->s_max_mnt_count = max_mount_count; 5053839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o ext2fs_mark_super_dirty(fs); 506d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o printf (_("Setting maximal mount count to %d\n"), 5071e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o max_mount_count); 5083839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 5091e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o if (C_flag) { 510b21e38a0df0111f527f7b286ff9119534de04c09Theodore Ts'o sb->s_mnt_count = mount_count; 5111e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o ext2fs_mark_super_dirty(fs); 512d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o printf (_("Setting current mount count to %d\n"), mount_count); 5131e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o } 5141e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o if (e_flag) { 515b21e38a0df0111f527f7b286ff9119534de04c09Theodore Ts'o sb->s_errors = errors; 5163839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o ext2fs_mark_super_dirty(fs); 517d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o printf (_("Setting error behavior to %d\n"), errors); 5183839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 519b21e38a0df0111f527f7b286ff9119534de04c09Theodore Ts'o if (g_flag) { 520b21e38a0df0111f527f7b286ff9119534de04c09Theodore Ts'o sb->s_def_resgid = resgid; 521f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o ext2fs_mark_super_dirty(fs); 522d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o printf (_("Setting reserved blocks gid to %lu\n"), resgid); 523f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o } 524818180cdfcff84b9048ecdc5dc86323f0fefba24Theodore Ts'o if (i_flag) { 525b21e38a0df0111f527f7b286ff9119534de04c09Theodore Ts'o sb->s_checkinterval = interval; 5263839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o ext2fs_mark_super_dirty(fs); 527d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o printf (_("Setting interval between check %lu seconds\n"), interval); 5283839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 529818180cdfcff84b9048ecdc5dc86323f0fefba24Theodore Ts'o if (m_flag) { 530b21e38a0df0111f527f7b286ff9119534de04c09Theodore Ts'o sb->s_r_blocks_count = (sb->s_blocks_count / 100) 5313839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * reserved_ratio; 5323839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o ext2fs_mark_super_dirty(fs); 533d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o printf (_("Setting reserved blocks percentage to %lu (%u blocks)\n"), 534b21e38a0df0111f527f7b286ff9119534de04c09Theodore Ts'o reserved_ratio, sb->s_r_blocks_count); 5353839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o } 536818180cdfcff84b9048ecdc5dc86323f0fefba24Theodore Ts'o if (r_flag) { 537b21e38a0df0111f527f7b286ff9119534de04c09Theodore Ts'o if (reserved_blocks >= sb->s_blocks_count) { 538f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o com_err (program_name, 0, 539d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o _("reserved blocks count is too big (%ul)"), 540f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o reserved_blocks); 541f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o exit (1); 542f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o } 543b21e38a0df0111f527f7b286ff9119534de04c09Theodore Ts'o sb->s_r_blocks_count = reserved_blocks; 544f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o ext2fs_mark_super_dirty(fs); 545d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o printf (_("Setting reserved blocks count to %lu\n"), 546f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o reserved_blocks); 547f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o } 548521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o if (s_flag == 1) { 549521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o if (sb->s_feature_ro_compat & 550521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER) 551d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o fprintf(stderr, _("\nThe filesystem already" 552e1a0a3e304229a625c37f0e845c0c9fff117c8c1Theodore Ts'o " has sparse superblocks.\n")); 553521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o else { 554521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o sb->s_feature_ro_compat |= 555521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER; 556b21e38a0df0111f527f7b286ff9119534de04c09Theodore Ts'o sb->s_state &= ~EXT2_VALID_FS; 557521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o ext2fs_mark_super_dirty(fs); 558d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o printf(_("\nSparse superblock flag set. %s"), 559a4fa100c5b743491f33b77981c4bf28ba4fe1e34Theodore Ts'o _(please_fsck)); 560521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o } 561521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o } 562521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o if (s_flag == 0) { 563521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o if (!(sb->s_feature_ro_compat & 564521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER)) 565d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o fprintf(stderr, _("\nThe filesystem already" 566e1a0a3e304229a625c37f0e845c0c9fff117c8c1Theodore Ts'o " has sparse superblocks disabled.\n")); 567521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o else { 568521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o sb->s_feature_ro_compat &= 569521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o ~EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER; 570b21e38a0df0111f527f7b286ff9119534de04c09Theodore Ts'o sb->s_state &= ~EXT2_VALID_FS; 571521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o fs->flags |= EXT2_FLAG_MASTER_SB_ONLY; 572521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o ext2fs_mark_super_dirty(fs); 573d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o printf(_("\nSparse superblock flag cleared. %s"), 574a4fa100c5b743491f33b77981c4bf28ba4fe1e34Theodore Ts'o _(please_fsck)); 575521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o } 576521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o } 577b21e38a0df0111f527f7b286ff9119534de04c09Theodore Ts'o if (u_flag) { 578b21e38a0df0111f527f7b286ff9119534de04c09Theodore Ts'o sb->s_def_resuid = resuid; 579f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o ext2fs_mark_super_dirty(fs); 580d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o printf (_("Setting reserved blocks uid to %lu\n"), resuid); 581f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o } 5821e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o if (L_flag) { 583a789d8406070224503c9ab78040acc7ea80c65aeTheodore Ts'o if (strlen(new_label) > sizeof(sb->s_volume_name)) 584d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o fprintf(stderr, _("Warning: label too " 585d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o "long, truncating.\n")); 5861e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o memset(sb->s_volume_name, 0, sizeof(sb->s_volume_name)); 5871e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o strncpy(sb->s_volume_name, new_label, 5881e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o sizeof(sb->s_volume_name)); 5891e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o ext2fs_mark_super_dirty(fs); 5901e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o } 5911e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o if (M_flag) { 5921e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o memset(sb->s_last_mounted, 0, sizeof(sb->s_last_mounted)); 5931e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o strncpy(sb->s_last_mounted, new_last_mounted, 5941e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o sizeof(sb->s_last_mounted)); 5951e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o ext2fs_mark_super_dirty(fs); 5961e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o } 59763985320384bf143eaac9857af424800d9867a1aTheodore Ts'o if (features_cmd) 59863985320384bf143eaac9857af424800d9867a1aTheodore Ts'o update_feature_set(fs, features_cmd); 59963985320384bf143eaac9857af424800d9867a1aTheodore Ts'o if (journal_opts) 60063985320384bf143eaac9857af424800d9867a1aTheodore Ts'o add_journal(fs); 60163985320384bf143eaac9857af424800d9867a1aTheodore Ts'o 6021e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o if (U_flag) { 6031e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o if (strcasecmp(new_UUID, "null") == 0) { 6041e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o uuid_clear(sb->s_uuid); 60563985320384bf143eaac9857af424800d9867a1aTheodore Ts'o } else if (strcasecmp(new_UUID, "time") == 0) { 60663985320384bf143eaac9857af424800d9867a1aTheodore Ts'o uuid_generate_time(sb->s_uuid); 6071e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o } else if (strcasecmp(new_UUID, "random") == 0) { 6081e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o uuid_generate(sb->s_uuid); 6091e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o } else if (uuid_parse(new_UUID, sb->s_uuid)) { 610d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o com_err(program_name, 0, _("Invalid UUID format\n")); 6111e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o exit(1); 6121e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o } 6131e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o ext2fs_mark_super_dirty(fs); 6141e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o } 6151e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o 6163839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o if (l_flag) 617b21e38a0df0111f527f7b286ff9119534de04c09Theodore Ts'o list_super (sb); 6183839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o ext2fs_close (fs); 6193839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o exit (0); 6203839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 621