119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * main.c --- ext2 resizer main program 319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * 419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Copyright (C) 1997, 1998 by Theodore Ts'o and 519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * PowerQuest, Inc. 619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * 719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 by Theodore Ts'o 83984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt * 919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * %Begin-Header% 1019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * This file may be redistributed under the terms of the GNU Public 1119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * License. 1219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * %End-Header% 1319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 1419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 1519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define _LARGEFILE_SOURCE 1619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define _LARGEFILE64_SOURCE 1719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 1819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef HAVE_GETOPT_H 1919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <getopt.h> 2019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#else 2119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectextern char *optarg; 2219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectextern int optind; 2319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 2419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <unistd.h> 253984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#ifdef HAVE_STDLIB_H 263984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#include <stdlib.h> 273984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#endif 2819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <sys/types.h> 2919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <sys/stat.h> 3019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <fcntl.h> 3119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 3219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "e2p/e2p.h" 3319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 3419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "resize2fs.h" 3519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 3619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "../version.h" 3719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 3819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectchar *program_name, *device_name, *io_options; 3919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 4019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic void usage (char *prog) 4119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 423984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fprintf (stderr, _("Usage: %s [-d debug_flags] [-f] [-F] [-M] [-P] " 433984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt "[-p] device [new_size]\n\n"), prog); 4419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 4519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project exit (1); 4619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 4719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 4819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic errcode_t resize_progress_func(ext2_resize_t rfs, int pass, 4919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project unsigned long cur, unsigned long max) 5019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 5119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2_sim_progmeter progress; 5219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project const char *label; 5319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errcode_t retval; 5419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 5519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project progress = (ext2_sim_progmeter) rfs->prog_data; 5619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (max == 0) 5719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 5819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (cur == 0) { 5919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (progress) 6019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_progress_close(progress); 6119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project progress = 0; 6219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project switch (pass) { 6319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case E2_RSZ_EXTEND_ITABLE_PASS: 6419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project label = _("Extending the inode table"); 6519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 6619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case E2_RSZ_BLOCK_RELOC_PASS: 6719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project label = _("Relocating blocks"); 6819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 6919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case E2_RSZ_INODE_SCAN_PASS: 7019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project label = _("Scanning inode table"); 7119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 7219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case E2_RSZ_INODE_REF_UPD_PASS: 7319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project label = _("Updating inode references"); 7419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 7519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case E2_RSZ_MOVE_ITABLE_PASS: 7619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project label = _("Moving inode table"); 7719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 7819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project default: 7919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project label = _("Unknown pass?!?"); 8019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 8119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 8219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf(_("Begin pass %d (max = %lu)\n"), pass, max); 8319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_progress_init(&progress, label, 30, 8419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 40, max, 0); 8519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) 8619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project progress = 0; 8719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project rfs->prog_data = (void *) progress; 8819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 8919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (progress) 9019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_progress_update(progress, cur); 9119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (cur >= max) { 9219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (progress) 9319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_progress_close(progress); 9419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project progress = 0; 9519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project rfs->prog_data = 0; 9619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 9719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 9819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 9919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 10019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic void determine_fs_stride(ext2_filsys fs) 10119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 10219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project unsigned int group; 10319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project unsigned long long sum; 10419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project unsigned int has_sb, prev_has_sb, num; 10519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int i_stride, b_stride; 10619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 10719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (fs->stride) 10819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 10919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project num = 0; sum = 0; 11019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project for (group = 0; group < fs->group_desc_count; group++) { 11119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project has_sb = ext2fs_bg_has_super(fs, group); 11219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (group == 0 || has_sb != prev_has_sb) 11319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project goto next; 1143984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt b_stride = fs->group_desc[group].bg_block_bitmap - 1153984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fs->group_desc[group-1].bg_block_bitmap - 11619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fs->super->s_blocks_per_group; 1173984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt i_stride = fs->group_desc[group].bg_inode_bitmap - 1183984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fs->group_desc[group-1].bg_inode_bitmap - 11919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fs->super->s_blocks_per_group; 12019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (b_stride != i_stride || 12119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project b_stride < 0) 12219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project goto next; 12319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 12419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project /* printf("group %d has stride %d\n", group, b_stride); */ 12519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project sum += b_stride; 12619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project num++; 1273984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 12819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project next: 12919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project prev_has_sb = has_sb; 13019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 13119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 13219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (fs->group_desc_count > 12 && num < 3) 13319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project sum = 0; 13419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 13519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (num) 13619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fs->stride = sum / num; 13719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else 13819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fs->stride = 0; 13919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 14019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fs->super->s_raid_stride = fs->stride; 14119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_mark_super_dirty(fs); 14219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 14319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if 0 14419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (fs->stride) 14519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("Using RAID stride of %d\n", fs->stride); 14619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 14719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 14819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 14919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint main (int argc, char ** argv) 15019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 15119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errcode_t retval; 15219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2_filsys fs; 15319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int c; 15419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int flags = 0; 15519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int flush = 0; 15619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int force = 0; 15719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int io_flags = 0; 1583984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt int force_min_size = 0; 1593984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt int print_min_size = 0; 16019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int fd, ret; 16119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk_t new_size = 0; 1628558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall blk64_t max_size = 0; 1633984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt blk_t min_size = 0; 16419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project io_manager io_ptr; 16519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char *new_size_str = 0; 16619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int use_stride = -1; 16719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef HAVE_FSTAT64 16819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct stat64 st_buf; 16919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#else 17019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct stat st_buf; 17119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 17219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project __s64 new_file_size; 17319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project unsigned int sys_page_size = 4096; 17419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project long sysval; 17519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int len, mount_flags; 17619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project char *mtpt; 17719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 17819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef ENABLE_NLS 17919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project setlocale(LC_MESSAGES, ""); 18019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project setlocale(LC_CTYPE, ""); 18119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project bindtextdomain(NLS_CAT_NAME, LOCALEDIR); 18219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project textdomain(NLS_CAT_NAME); 18319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 18419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 18519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project add_error_table(&et_ext2_error_table); 18619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 18719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf (stderr, "resize2fs %s (%s)\n", 18819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project E2FSPROGS_VERSION, E2FSPROGS_DATE); 18919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (argc && *argv) 19019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project program_name = *argv; 19119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 1923984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt while ((c = getopt (argc, argv, "d:fFhMPpS:")) != EOF) { 19319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project switch (c) { 19419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case 'h': 19519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project usage(program_name); 19619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 19719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case 'f': 19819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project force = 1; 19919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 20019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case 'F': 20119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project flush = 1; 20219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 2033984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt case 'M': 2043984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt force_min_size = 1; 2053984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt break; 2063984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt case 'P': 2073984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt print_min_size = 1; 2083984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt break; 20919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case 'd': 21019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project flags |= atoi(optarg); 21119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 21219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case 'p': 21319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project flags |= RESIZE_PERCENT_COMPLETE; 21419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 21519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case 'S': 21619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project use_stride = atoi(optarg); 21719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 21819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project default: 21919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project usage(program_name); 22019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 22119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 22219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (optind == argc) 22319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project usage(program_name); 22419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 22519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project device_name = argv[optind++]; 22619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (optind < argc) 22719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project new_size_str = argv[optind++]; 22819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (optind < argc) 22919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project usage(program_name); 2303984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 23119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project io_options = strchr(device_name, '?'); 23219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (io_options) 23319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *io_options++ = 0; 23419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 23519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project /* 23619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Figure out whether or not the device is mounted, and if it is 23719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * where it is mounted. 23819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 23919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project len=80; 24019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project while (1) { 24119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project mtpt = malloc(len); 24219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!mtpt) 24319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return ENOMEM; 24419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project mtpt[len-1] = 0; 2453984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt retval = ext2fs_check_mount_point(device_name, &mount_flags, 24619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project mtpt, len); 24719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 24819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err("ext2fs_check_mount_point", retval, 24919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project _("while determining whether %s is mounted."), 25019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project device_name); 25119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project exit(1); 25219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 25319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!(mount_flags & EXT2_MF_MOUNTED) || (mtpt[len-1] == 0)) 25419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 25519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project free(mtpt); 25619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project len = 2 * len; 25719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 25819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 25919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef HAVE_OPEN64 26019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fd = open64(device_name, O_RDWR); 26119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#else 26219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fd = open(device_name, O_RDWR); 26319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 26419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (fd < 0) { 26519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err("open", errno, _("while opening %s"), 26619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project device_name); 26719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project exit(1); 26819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 26919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 27019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef HAVE_FSTAT64 27119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ret = fstat64(fd, &st_buf); 27219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#else 27319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ret = fstat(fd, &st_buf); 27419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 27519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (ret < 0) { 2763984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt com_err("open", errno, 27719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project _("while getting stat information for %s"), 27819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project device_name); 27919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project exit(1); 28019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 2813984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 28219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (flush) { 28319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_sync_device(fd, 1); 28419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 2853984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt com_err(argv[0], retval, 28619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project _("while trying to flush %s"), 28719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project device_name); 28819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project exit(1); 28919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 29019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 29119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 29219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!S_ISREG(st_buf.st_mode )) { 29319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project close(fd); 29419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fd = -1; 29519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 29619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 2973984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#ifdef CONFIG_TESTIO_DEBUG 2983984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (getenv("TEST_IO_FLAGS") || getenv("TEST_IO_BLOCK")) { 29919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project io_ptr = test_io_manager; 30019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project test_io_backing_manager = unix_io_manager; 3013984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } else 3023984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#endif 30319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project io_ptr = unix_io_manager; 30419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 30519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!(mount_flags & EXT2_MF_MOUNTED)) 30619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project io_flags = EXT2_FLAG_RW | EXT2_FLAG_EXCLUSIVE; 3073984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt retval = ext2fs_open2(device_name, io_options, io_flags, 30819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 0, 0, io_ptr, &fs); 30919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 31019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err (program_name, retval, _("while trying to open %s"), 31119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project device_name); 31219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf (_("Couldn't find valid filesystem superblock.\n")); 31319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project exit (1); 31419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 3153984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 31619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project /* 31719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Check for compatibility with the feature sets. We need to 31819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * be more stringent than ext2fs_open(). 31919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 32019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (fs->super->s_feature_compat & ~EXT2_LIB_FEATURE_COMPAT_SUPP) { 32119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(program_name, EXT2_ET_UNSUPP_FEATURE, 32219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "(%s)", device_name); 32319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project exit(1); 32419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 3253984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 3263984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt /* 3273984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt * XXXX The combination of flex_bg and !resize_inode causes 3283984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt * major problems for resize2fs, since when the group descriptors 3293984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt * grow in size this can potentially require multiple inode 3303984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt * tables to be moved aside to make room, and resize2fs chokes 3313984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt * rather badly in this scenario. It's a rare combination, 3323984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt * except when a filesystem is expanded more than a certain 3333984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt * size, so for now, we'll just prohibit that combination. 3343984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt * This is something we should fix eventually, though. 3353984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt */ 3363984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if ((fs->super->s_feature_incompat & EXT4_FEATURE_INCOMPAT_FLEX_BG) && 3373984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt !(fs->super->s_feature_compat & EXT2_FEATURE_COMPAT_RESIZE_INODE)) { 3383984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt com_err(program_name, 0, _("%s: The combination of flex_bg " 3393984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt "and\n\t!resize_inode features " 3403984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt "is not supported by resize2fs.\n"), 3413984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt device_name); 3423984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt exit(1); 3433984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } 3443984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 3453984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt min_size = calculate_minimum_resize_size(fs); 3463984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 3473984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (print_min_size) { 3488558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall if (!force && ((fs->super->s_state & EXT2_ERROR_FS) || 3498558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall ((fs->super->s_state & EXT2_VALID_FS) == 0))) { 3508558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall fprintf(stderr, 3518558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall _("Please run 'e2fsck -f %s' first.\n\n"), 3528558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall device_name); 3538558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall exit(1); 3548558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall } 3553984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt printf(_("Estimated minimum size of the filesystem: %u\n"), 3563984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt min_size); 3573984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt exit(0); 3583984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } 3593984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 36019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project /* Determine the system page size if possible */ 36119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef HAVE_SYSCONF 36219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if (!defined(_SC_PAGESIZE) && defined(_SC_PAGE_SIZE)) 36319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define _SC_PAGESIZE _SC_PAGE_SIZE 36419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 36519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef _SC_PAGESIZE 36619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project sysval = sysconf(_SC_PAGESIZE); 36719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (sysval > 0) 36819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project sys_page_size = sysval; 36919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif /* _SC_PAGESIZE */ 37019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif /* HAVE_SYSCONF */ 37119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 37219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project /* 37319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Get the size of the containing partition, and use this for 37419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * defaults and for making sure the new filesystem doesn't 37519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * exceed the partition size. 37619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 3778558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall retval = ext2fs_get_device_size2(device_name, fs->blocksize, 37819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project &max_size); 37919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 38019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(program_name, retval, 38119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project _("while trying to determine filesystem size")); 38219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project exit(1); 38319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 3843984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (force_min_size) 3853984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt new_size = min_size; 3863984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt else if (new_size_str) { 3873984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt new_size = parse_num_blocks(new_size_str, 38819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fs->super->s_log_block_size); 3893984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (new_size == 0) { 3903984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt com_err(program_name, 0, 3913984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt _("Invalid new size: %s\n"), new_size_str); 39219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project exit(1); 39319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 39419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } else { 3958558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall /* Take down devices exactly 16T to 2^32-1 blocks */ 3968558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall if (max_size == (1ULL << 32)) 3978558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall max_size--; 3988558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall else if (max_size > (1ULL << 32)) { 3998558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall com_err(program_name, 0, _("New size too large to be " 4008558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall "expressed in 32 bits\n")); 4018558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall exit(1); 4028558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall } 40319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project new_size = max_size; 40419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project /* Round down to an even multiple of a pagesize */ 40519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (sys_page_size > fs->blocksize) 40619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project new_size &= ~((sys_page_size / fs->blocksize)-1); 40719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 40819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 4093984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (!force && new_size < min_size) { 4103984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt com_err(program_name, 0, 4113984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt _("New size smaller than minimum (%u)\n"), min_size); 4123984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt exit(1); 4133984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } 41419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (use_stride >= 0) { 41519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (use_stride >= (int) fs->super->s_blocks_per_group) { 4163984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt com_err(program_name, 0, 41719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project _("Invalid stride length")); 41819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project exit(1); 41919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 42019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fs->stride = fs->super->s_raid_stride = use_stride; 42119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_mark_super_dirty(fs); 42219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } else 42319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project determine_fs_stride(fs); 4243984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 42519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project /* 42619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * If we are resizing a plain file, and it's not big enough, 42719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * automatically extend it in a sparse fashion by writing the 42819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * last requested block. 42919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 43019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project new_file_size = ((__u64) new_size) * fs->blocksize; 4313984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if ((__u64) new_file_size > 43219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project (((__u64) 1) << (sizeof(st_buf.st_size)*8 - 1)) - 1) 43319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fd = -1; 43419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if ((new_file_size > st_buf.st_size) && 43519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project (fd > 0)) { 43619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if ((ext2fs_llseek(fd, new_file_size-1, SEEK_SET) >= 0) && 43719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project (write(fd, "0", 1) == 1)) 43819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project max_size = new_size; 43919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 44019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!force && (new_size > max_size)) { 44119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(stderr, _("The containing partition (or device)" 4428558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall " is only %llu (%dk) blocks.\nYou requested a new size" 44319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project " of %u blocks.\n\n"), max_size, 44419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fs->blocksize / 1024, new_size); 44519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project exit(1); 44619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 44719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (new_size == fs->super->s_blocks_count) { 44819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(stderr, _("The filesystem is already %u blocks " 44919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "long. Nothing to do!\n\n"), new_size); 45019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project exit(0); 45119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 45219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (mount_flags & EXT2_MF_MOUNTED) { 45319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = online_resize_fs(fs, mtpt, &new_size, flags); 45419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } else { 45519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!force && ((fs->super->s_lastcheck < fs->super->s_mtime) || 45619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project (fs->super->s_state & EXT2_ERROR_FS) || 45719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ((fs->super->s_state & EXT2_VALID_FS) == 0))) { 4583984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fprintf(stderr, 45919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project _("Please run 'e2fsck -f %s' first.\n\n"), 46019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project device_name); 46119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project exit(1); 46219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 4633984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt printf(_("Resizing the filesystem on " 4643984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt "%s to %u (%dk) blocks.\n"), 46519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project device_name, new_size, fs->blocksize / 1024); 46619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = resize_fs(fs, &new_size, flags, 46719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ((flags & RESIZE_PERCENT_COMPLETE) ? 46819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project resize_progress_func : 0)); 46919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 4703984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt free(mtpt); 47119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 47219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err(program_name, retval, _("while trying to resize %s"), 47319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project device_name); 4743984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt fprintf(stderr, 4753984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt _("Please run 'e2fsck -fy %s' to fix the filesystem\n" 4763984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt "after the aborted resize operation.\n"), 4773984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt device_name); 4783984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt ext2fs_close(fs); 47919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project exit(1); 48019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 48119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf(_("The filesystem on %s is now %u blocks long.\n\n"), 48219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project device_name, new_size); 48319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 48419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if ((st_buf.st_size > new_file_size) && 48519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project (fd > 0)) { 48619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef HAVE_FTRUNCATE64 4873984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt retval = ftruncate64(fd, new_file_size); 48819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#else 4893984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt retval = 0; 49019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project /* Only truncate if new_file_size doesn't overflow off_t */ 49119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (((off_t) new_file_size) == new_file_size) 4923984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt retval = ftruncate(fd, (off_t) new_file_size); 49319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 4943984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt if (retval) 4953984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt com_err(program_name, retval, 4963984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt _("while trying to truncate %s"), 4973984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt device_name); 49819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 49919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (fd > 0) 50019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project close(fd); 50119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project remove_error_table(&et_ext2_error_table); 50219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return (0); 50319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 504