main.c revision 8728d50657e90e0ca39981106ad617d600b9acad
124b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o/* 224b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o * main.c --- ext2 resizer main program 324b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o * 40cee8a5c423c2a1054c7366e74870592ec8db95eTheodore Ts'o * Copyright (C) 1997, 1998 by Theodore Ts'o and 50cee8a5c423c2a1054c7366e74870592ec8db95eTheodore Ts'o * PowerQuest, Inc. 60cee8a5c423c2a1054c7366e74870592ec8db95eTheodore Ts'o * 755f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o * Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 by Theodore Ts'o 8efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o * 924b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o * %Begin-Header% 100cee8a5c423c2a1054c7366e74870592ec8db95eTheodore Ts'o * This file may be redistributed under the terms of the GNU Public 110cee8a5c423c2a1054c7366e74870592ec8db95eTheodore Ts'o * License. 1224b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o * %End-Header% 1324b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o */ 1424b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o 15fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o#define _LARGEFILE_SOURCE 16fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o#define _LARGEFILE64_SOURCE 17fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o 18c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o#ifdef HAVE_GETOPT_H 19c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o#include <getopt.h> 20373b8337c7b6c6243810be250083fa4773891e92Theodore Ts'o#else 21373b8337c7b6c6243810be250083fa4773891e92Theodore Ts'oextern char *optarg; 22373b8337c7b6c6243810be250083fa4773891e92Theodore Ts'oextern int optind; 23c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o#endif 24fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o#include <unistd.h> 25f38cf3cb34addaa53d1f855d7607b151082a4229Theodore Ts'o#ifdef HAVE_STDLIB_H 26f38cf3cb34addaa53d1f855d7607b151082a4229Theodore Ts'o#include <stdlib.h> 27f38cf3cb34addaa53d1f855d7607b151082a4229Theodore Ts'o#endif 28fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o#include <sys/types.h> 29116db1b513f6901415d1f5f8c01fc297d7cc64a4Theodore Ts'o#include <sys/stat.h> 30fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o#include <fcntl.h> 31c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o 3255f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o#include "e2p/e2p.h" 3355f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o 3424b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o#include "resize2fs.h" 3524b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o 360cee8a5c423c2a1054c7366e74870592ec8db95eTheodore Ts'o#include "../version.h" 372e561e024947b75864579bf4fea10c848ca0169eTheodore Ts'o 382e8ca9a26b0bd7dae546a3f9a98df67b043fe3beTheodore Ts'ochar *program_name, *device_name, *io_options; 3924b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o 40dfcdc32f8d6623a35a9e66f503c535e4081b7266Theodore Ts'ostatic void usage (char *prog) 4124b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o{ 42199ddaaa445e14fca8113b0db85e2576267071c9Josef Bacik fprintf (stderr, _("Usage: %s [-d debug_flags] [-f] [-F] [-M] [-P] " 43199ddaaa445e14fca8113b0db85e2576267071c9Josef Bacik "[-p] device [new_size]\n\n"), prog); 442e561e024947b75864579bf4fea10c848ca0169eTheodore Ts'o 4524b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o exit (1); 4624b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o} 4724b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o 483b627e8d6735fd81906117d580ee70292b2cfaafTheodore Ts'ostatic errcode_t resize_progress_func(ext2_resize_t rfs, int pass, 493b627e8d6735fd81906117d580ee70292b2cfaafTheodore Ts'o unsigned long cur, unsigned long max) 5063b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o{ 5163b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o ext2_sim_progmeter progress; 5263b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o const char *label; 5363b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o errcode_t retval; 5463b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o 5563b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o progress = (ext2_sim_progmeter) rfs->prog_data; 56f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o if (max == 0) 573b627e8d6735fd81906117d580ee70292b2cfaafTheodore Ts'o return 0; 5863b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o if (cur == 0) { 5963b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o if (progress) 6063b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o ext2fs_progress_close(progress); 6163b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o progress = 0; 6263b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o switch (pass) { 63a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o case E2_RSZ_EXTEND_ITABLE_PASS: 64a13575f4d29a908add19ea27baa102bc6944ee30Theodore Ts'o label = _("Extending the inode table"); 6563b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o break; 6663b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o case E2_RSZ_BLOCK_RELOC_PASS: 67a13575f4d29a908add19ea27baa102bc6944ee30Theodore Ts'o label = _("Relocating blocks"); 6863b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o break; 69a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o case E2_RSZ_INODE_SCAN_PASS: 70a13575f4d29a908add19ea27baa102bc6944ee30Theodore Ts'o label = _("Scanning inode table"); 7163b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o break; 7263b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o case E2_RSZ_INODE_REF_UPD_PASS: 73a13575f4d29a908add19ea27baa102bc6944ee30Theodore Ts'o label = _("Updating inode references"); 7463b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o break; 7563b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o case E2_RSZ_MOVE_ITABLE_PASS: 76a13575f4d29a908add19ea27baa102bc6944ee30Theodore Ts'o label = _("Moving inode table"); 7763b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o break; 78a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o default: 79a13575f4d29a908add19ea27baa102bc6944ee30Theodore Ts'o label = _("Unknown pass?!?"); 80a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o break; 8163b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o } 82a13575f4d29a908add19ea27baa102bc6944ee30Theodore Ts'o printf(_("Begin pass %d (max = %lu)\n"), pass, max); 8363b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o retval = ext2fs_progress_init(&progress, label, 30, 8463b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o 40, max, 0); 8563b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o if (retval) 8663b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o progress = 0; 8763b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o rfs->prog_data = (void *) progress; 8863b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o } 8963b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o if (progress) 9063b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o ext2fs_progress_update(progress, cur); 9163b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o if (cur >= max) { 9263b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o if (progress) 9363b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o ext2fs_progress_close(progress); 9463b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o progress = 0; 9563b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o rfs->prog_data = 0; 9663b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o } 973b627e8d6735fd81906117d580ee70292b2cfaafTheodore Ts'o return 0; 9863b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o} 9963b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o 10046c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'ostatic void determine_fs_stride(ext2_filsys fs) 10146c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o{ 10246c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o unsigned int group; 10346c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o unsigned long long sum; 10446c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o unsigned int has_sb, prev_has_sb, num; 10546c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o int i_stride, b_stride; 10646c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o 10796c6a3acd377698cb99ffd9925bec9b20ca4f6f9Theodore Ts'o if (fs->stride) 10896c6a3acd377698cb99ffd9925bec9b20ca4f6f9Theodore Ts'o return; 10946c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o num = 0; sum = 0; 11046c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o for (group = 0; group < fs->group_desc_count; group++) { 11146c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o has_sb = ext2fs_bg_has_super(fs, group); 11246c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o if (group == 0 || has_sb != prev_has_sb) 11346c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o goto next; 114d7cca6b06f366f998ed43346f9b6fca9e163692fValerie Aurora Henson b_stride = ext2fs_block_bitmap_loc(fs, group) - 115d7cca6b06f366f998ed43346f9b6fca9e163692fValerie Aurora Henson ext2fs_block_bitmap_loc(fs, group - 1) - 11646c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o fs->super->s_blocks_per_group; 117d7cca6b06f366f998ed43346f9b6fca9e163692fValerie Aurora Henson i_stride = ext2fs_inode_bitmap_loc(fs, group) - 118d7cca6b06f366f998ed43346f9b6fca9e163692fValerie Aurora Henson ext2fs_inode_bitmap_loc(fs, group - 1) - 11946c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o fs->super->s_blocks_per_group; 12046c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o if (b_stride != i_stride || 12146c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o b_stride < 0) 12246c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o goto next; 12346c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o 12446c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o /* printf("group %d has stride %d\n", group, b_stride); */ 12546c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o sum += b_stride; 12646c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o num++; 127efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 12846c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o next: 12946c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o prev_has_sb = has_sb; 13046c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o } 13146c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o 13246c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o if (fs->group_desc_count > 12 && num < 3) 13346c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o sum = 0; 13446c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o 13546c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o if (num) 13646c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o fs->stride = sum / num; 13746c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o else 13846c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o fs->stride = 0; 13946c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o 14096c6a3acd377698cb99ffd9925bec9b20ca4f6f9Theodore Ts'o fs->super->s_raid_stride = fs->stride; 14196c6a3acd377698cb99ffd9925bec9b20ca4f6f9Theodore Ts'o ext2fs_mark_super_dirty(fs); 14296c6a3acd377698cb99ffd9925bec9b20ca4f6f9Theodore Ts'o 14346c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o#if 0 14446c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o if (fs->stride) 14546c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o printf("Using RAID stride of %d\n", fs->stride); 14646c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o#endif 14746c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o} 14846c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o 1490a617317ee6e947bd9f975c861599dd3dc41aa13Theodore Ts'oint main (int argc, char ** argv) 15024b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o{ 15124b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o errcode_t retval; 15224b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o ext2_filsys fs; 15324b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o int c; 15405e112a11b6508c2b12d5d4ee0c322171db9b538Theodore Ts'o int flags = 0; 155c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o int flush = 0; 156f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o int force = 0; 1575d2ef12f6ed4c35c7e6baa7cb83ced738a3f1976Theodore Ts'o int io_flags = 0; 158199ddaaa445e14fca8113b0db85e2576267071c9Josef Bacik int force_min_size = 0; 159199ddaaa445e14fca8113b0db85e2576267071c9Josef Bacik int print_min_size = 0; 160fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o int fd, ret; 1618728d50657e90e0ca39981106ad617d600b9acadValerie Aurora Henson blk64_t new_size = 0; 1628728d50657e90e0ca39981106ad617d600b9acadValerie Aurora Henson blk64_t max_size = 0; 1638728d50657e90e0ca39981106ad617d600b9acadValerie Aurora Henson blk64_t min_size = 0; 16424b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o io_manager io_ptr; 16555f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o char *new_size_str = 0; 16646c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o int use_stride = -1; 167fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o#ifdef HAVE_FSTAT64 168fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o struct stat64 st_buf; 169fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o#else 170116db1b513f6901415d1f5f8c01fc297d7cc64a4Theodore Ts'o struct stat st_buf; 171fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o#endif 172fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o __s64 new_file_size; 173544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o unsigned int sys_page_size = 4096; 174a7ccdff8e128c24564011d760a996496b0a981b3Theodore Ts'o long sysval; 175bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o int len, mount_flags; 176bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o char *mtpt; 177ddc32a045bd3bd35968ace2dbe22179470baec0bTheodore Ts'o 178ddc32a045bd3bd35968ace2dbe22179470baec0bTheodore Ts'o#ifdef ENABLE_NLS 179ddc32a045bd3bd35968ace2dbe22179470baec0bTheodore Ts'o setlocale(LC_MESSAGES, ""); 180ddc32a045bd3bd35968ace2dbe22179470baec0bTheodore Ts'o setlocale(LC_CTYPE, ""); 181ddc32a045bd3bd35968ace2dbe22179470baec0bTheodore Ts'o bindtextdomain(NLS_CAT_NAME, LOCALEDIR); 182ddc32a045bd3bd35968ace2dbe22179470baec0bTheodore Ts'o textdomain(NLS_CAT_NAME); 183ddc32a045bd3bd35968ace2dbe22179470baec0bTheodore Ts'o#endif 184ddc32a045bd3bd35968ace2dbe22179470baec0bTheodore Ts'o 185a6d8302b4873527798a77c1ba3106a04b71dfeacTheodore Ts'o add_error_table(&et_ext2_error_table); 18624b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o 187f35fd3d5eeb3e35660ea87adbc170978c3cdf9e3Theodore Ts'o fprintf (stderr, "resize2fs %s (%s)\n", 188ba0af7566347b3c2366cbb18715f465f70089019Theodore Ts'o E2FSPROGS_VERSION, E2FSPROGS_DATE); 18924b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o if (argc && *argv) 19024b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o program_name = *argv; 1912e561e024947b75864579bf4fea10c848ca0169eTheodore Ts'o 192199ddaaa445e14fca8113b0db85e2576267071c9Josef Bacik while ((c = getopt (argc, argv, "d:fFhMPpS:")) != EOF) { 19324b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o switch (c) { 19424b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o case 'h': 19524b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o usage(program_name); 19624b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o break; 197f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o case 'f': 198f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o force = 1; 199f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o break; 200c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o case 'F': 201c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o flush = 1; 202c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o break; 203199ddaaa445e14fca8113b0db85e2576267071c9Josef Bacik case 'M': 204199ddaaa445e14fca8113b0db85e2576267071c9Josef Bacik force_min_size = 1; 205199ddaaa445e14fca8113b0db85e2576267071c9Josef Bacik break; 206199ddaaa445e14fca8113b0db85e2576267071c9Josef Bacik case 'P': 207199ddaaa445e14fca8113b0db85e2576267071c9Josef Bacik print_min_size = 1; 208199ddaaa445e14fca8113b0db85e2576267071c9Josef Bacik break; 20905e112a11b6508c2b12d5d4ee0c322171db9b538Theodore Ts'o case 'd': 21005e112a11b6508c2b12d5d4ee0c322171db9b538Theodore Ts'o flags |= atoi(optarg); 21105e112a11b6508c2b12d5d4ee0c322171db9b538Theodore Ts'o break; 21205e112a11b6508c2b12d5d4ee0c322171db9b538Theodore Ts'o case 'p': 21305e112a11b6508c2b12d5d4ee0c322171db9b538Theodore Ts'o flags |= RESIZE_PERCENT_COMPLETE; 21405e112a11b6508c2b12d5d4ee0c322171db9b538Theodore Ts'o break; 21546c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o case 'S': 21646c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o use_stride = atoi(optarg); 21746c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o break; 21824b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o default: 219f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o usage(program_name); 22024b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o } 22124b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o } 222f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o if (optind == argc) 223f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o usage(program_name); 2242e561e024947b75864579bf4fea10c848ca0169eTheodore Ts'o 22524b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o device_name = argv[optind++]; 22655f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o if (optind < argc) 22755f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o new_size_str = argv[optind++]; 228f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o if (optind < argc) 229f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o usage(program_name); 230efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 2312e8ca9a26b0bd7dae546a3f9a98df67b043fe3beTheodore Ts'o io_options = strchr(device_name, '?'); 2322e8ca9a26b0bd7dae546a3f9a98df67b043fe3beTheodore Ts'o if (io_options) 2332e8ca9a26b0bd7dae546a3f9a98df67b043fe3beTheodore Ts'o *io_options++ = 0; 2342e8ca9a26b0bd7dae546a3f9a98df67b043fe3beTheodore Ts'o 235bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o /* 236bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o * Figure out whether or not the device is mounted, and if it is 237bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o * where it is mounted. 238bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o */ 239bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o len=80; 240bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o while (1) { 241bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o mtpt = malloc(len); 242bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o if (!mtpt) 243bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o return ENOMEM; 244bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o mtpt[len-1] = 0; 245efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o retval = ext2fs_check_mount_point(device_name, &mount_flags, 246bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o mtpt, len); 247bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o if (retval) { 248bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o com_err("ext2fs_check_mount_point", retval, 249bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o _("while determining whether %s is mounted."), 250bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o device_name); 251bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o exit(1); 252bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o } 2533a4d9869d47c462c84688b0f8b15df5ab6f93381Theodore Ts'o if (!(mount_flags & EXT2_MF_MOUNTED) || (mtpt[len-1] == 0)) 254bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o break; 255bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o free(mtpt); 256bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o len = 2 * len; 257bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o } 258fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o 259fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o#ifdef HAVE_OPEN64 260fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o fd = open64(device_name, O_RDWR); 261fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o#else 262fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o fd = open(device_name, O_RDWR); 263fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o#endif 264fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o if (fd < 0) { 265fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o com_err("open", errno, _("while opening %s"), 266fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o device_name); 267fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o exit(1); 268fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o } 269fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o 270fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o#ifdef HAVE_FSTAT64 271fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o ret = fstat64(fd, &st_buf); 272fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o#else 273fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o ret = fstat(fd, &st_buf); 274fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o#endif 275fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o if (ret < 0) { 276efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o com_err("open", errno, 277fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o _("while getting stat information for %s"), 278fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o device_name); 279fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o exit(1); 280fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o } 281efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 282c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o if (flush) { 28348e08e034ead9c3518fe3e130b2ff5012d31e055Theodore Ts'o retval = ext2fs_sync_device(fd, 1); 28448e08e034ead9c3518fe3e130b2ff5012d31e055Theodore Ts'o if (retval) { 285efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o com_err(argv[0], retval, 286a13575f4d29a908add19ea27baa102bc6944ee30Theodore Ts'o _("while trying to flush %s"), 287c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o device_name); 288c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o exit(1); 289c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o } 290fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o } 291fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o 292fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o if (!S_ISREG(st_buf.st_mode )) { 293c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o close(fd); 294fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o fd = -1; 295c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o } 296c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o 297f38cf3cb34addaa53d1f855d7607b151082a4229Theodore Ts'o#ifdef CONFIG_TESTIO_DEBUG 298f38cf3cb34addaa53d1f855d7607b151082a4229Theodore Ts'o if (getenv("TEST_IO_FLAGS") || getenv("TEST_IO_BLOCK")) { 29905e112a11b6508c2b12d5d4ee0c322171db9b538Theodore Ts'o io_ptr = test_io_manager; 30005e112a11b6508c2b12d5d4ee0c322171db9b538Theodore Ts'o test_io_backing_manager = unix_io_manager; 301efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o } else 302f38cf3cb34addaa53d1f855d7607b151082a4229Theodore Ts'o#endif 30305e112a11b6508c2b12d5d4ee0c322171db9b538Theodore Ts'o io_ptr = unix_io_manager; 30405e112a11b6508c2b12d5d4ee0c322171db9b538Theodore Ts'o 3055d2ef12f6ed4c35c7e6baa7cb83ced738a3f1976Theodore Ts'o if (!(mount_flags & EXT2_MF_MOUNTED)) 3065d2ef12f6ed4c35c7e6baa7cb83ced738a3f1976Theodore Ts'o io_flags = EXT2_FLAG_RW | EXT2_FLAG_EXCLUSIVE; 307efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o retval = ext2fs_open2(device_name, io_options, io_flags, 3082e8ca9a26b0bd7dae546a3f9a98df67b043fe3beTheodore Ts'o 0, 0, io_ptr, &fs); 30924b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o if (retval) { 310a13575f4d29a908add19ea27baa102bc6944ee30Theodore Ts'o com_err (program_name, retval, _("while trying to open %s"), 31124b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o device_name); 312a13575f4d29a908add19ea27baa102bc6944ee30Theodore Ts'o printf (_("Couldn't find valid filesystem superblock.\n")); 31324b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o exit (1); 31424b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o } 315236efede1922fa173b3c2f20d9e0886856664ab4Jose R. Santos 316101c84f2e049bffcdb6c5ba1784842cdd50dbf05Theodore Ts'o /* 317101c84f2e049bffcdb6c5ba1784842cdd50dbf05Theodore Ts'o * Check for compatibility with the feature sets. We need to 318101c84f2e049bffcdb6c5ba1784842cdd50dbf05Theodore Ts'o * be more stringent than ext2fs_open(). 319101c84f2e049bffcdb6c5ba1784842cdd50dbf05Theodore Ts'o */ 32076dd5e5c2842fb1a7b858aad3e68b5e9c16890c9Theodore Ts'o if (fs->super->s_feature_compat & ~EXT2_LIB_FEATURE_COMPAT_SUPP) { 321101c84f2e049bffcdb6c5ba1784842cdd50dbf05Theodore Ts'o com_err(program_name, EXT2_ET_UNSUPP_FEATURE, 322101c84f2e049bffcdb6c5ba1784842cdd50dbf05Theodore Ts'o "(%s)", device_name); 323101c84f2e049bffcdb6c5ba1784842cdd50dbf05Theodore Ts'o exit(1); 324101c84f2e049bffcdb6c5ba1784842cdd50dbf05Theodore Ts'o } 325a8d632a4e9fd528631d2ce8c28b4aade8da0a862Theodore Ts'o 326a8d632a4e9fd528631d2ce8c28b4aade8da0a862Theodore Ts'o /* 327a8d632a4e9fd528631d2ce8c28b4aade8da0a862Theodore Ts'o * XXXX The combination of flex_bg and !resize_inode causes 328a8d632a4e9fd528631d2ce8c28b4aade8da0a862Theodore Ts'o * major problems for resize2fs, since when the group descriptors 329a8d632a4e9fd528631d2ce8c28b4aade8da0a862Theodore Ts'o * grow in size this can potentially require multiple inode 330a8d632a4e9fd528631d2ce8c28b4aade8da0a862Theodore Ts'o * tables to be moved aside to make room, and resize2fs chokes 331a8d632a4e9fd528631d2ce8c28b4aade8da0a862Theodore Ts'o * rather badly in this scenario. It's a rare combination, 332a8d632a4e9fd528631d2ce8c28b4aade8da0a862Theodore Ts'o * except when a filesystem is expanded more than a certain 333a8d632a4e9fd528631d2ce8c28b4aade8da0a862Theodore Ts'o * size, so for now, we'll just prohibit that combination. 334a8d632a4e9fd528631d2ce8c28b4aade8da0a862Theodore Ts'o * This is something we should fix eventually, though. 335a8d632a4e9fd528631d2ce8c28b4aade8da0a862Theodore Ts'o */ 336a8d632a4e9fd528631d2ce8c28b4aade8da0a862Theodore Ts'o if ((fs->super->s_feature_incompat & EXT4_FEATURE_INCOMPAT_FLEX_BG) && 337a8d632a4e9fd528631d2ce8c28b4aade8da0a862Theodore Ts'o !(fs->super->s_feature_compat & EXT2_FEATURE_COMPAT_RESIZE_INODE)) { 338a8d632a4e9fd528631d2ce8c28b4aade8da0a862Theodore Ts'o com_err(program_name, 0, _("%s: The combination of flex_bg " 339a8d632a4e9fd528631d2ce8c28b4aade8da0a862Theodore Ts'o "and\n\t!resize_inode features " 340a8d632a4e9fd528631d2ce8c28b4aade8da0a862Theodore Ts'o "is not supported by resize2fs.\n"), 341a8d632a4e9fd528631d2ce8c28b4aade8da0a862Theodore Ts'o device_name); 342a8d632a4e9fd528631d2ce8c28b4aade8da0a862Theodore Ts'o exit(1); 343a8d632a4e9fd528631d2ce8c28b4aade8da0a862Theodore Ts'o } 344efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 3450d04d88a8d88fc11120746bc72a5ffb7d7f05cb0Eric Sandeen min_size = calculate_minimum_resize_size(fs); 3460d04d88a8d88fc11120746bc72a5ffb7d7f05cb0Eric Sandeen 347199ddaaa445e14fca8113b0db85e2576267071c9Josef Bacik if (print_min_size) { 3485fa92bc76888404b161b3fd0fd7e6b63e064badfEric Sandeen if (!force && ((fs->super->s_lastcheck < fs->super->s_mtime) || 3495fa92bc76888404b161b3fd0fd7e6b63e064badfEric Sandeen (fs->super->s_state & EXT2_ERROR_FS) || 3505fa92bc76888404b161b3fd0fd7e6b63e064badfEric Sandeen ((fs->super->s_state & EXT2_VALID_FS) == 0))) { 3515fa92bc76888404b161b3fd0fd7e6b63e064badfEric Sandeen fprintf(stderr, 3525fa92bc76888404b161b3fd0fd7e6b63e064badfEric Sandeen _("Please run 'e2fsck -f %s' first.\n\n"), 3535fa92bc76888404b161b3fd0fd7e6b63e064badfEric Sandeen device_name); 3545fa92bc76888404b161b3fd0fd7e6b63e064badfEric Sandeen exit(1); 3555fa92bc76888404b161b3fd0fd7e6b63e064badfEric Sandeen } 3568728d50657e90e0ca39981106ad617d600b9acadValerie Aurora Henson printf(_("Estimated minimum size of the filesystem: %llu\n"), 3570d04d88a8d88fc11120746bc72a5ffb7d7f05cb0Eric Sandeen min_size); 358199ddaaa445e14fca8113b0db85e2576267071c9Josef Bacik exit(0); 359199ddaaa445e14fca8113b0db85e2576267071c9Josef Bacik } 360199ddaaa445e14fca8113b0db85e2576267071c9Josef Bacik 361a7ccdff8e128c24564011d760a996496b0a981b3Theodore Ts'o /* Determine the system page size if possible */ 362a7ccdff8e128c24564011d760a996496b0a981b3Theodore Ts'o#ifdef HAVE_SYSCONF 363a7ccdff8e128c24564011d760a996496b0a981b3Theodore Ts'o#if (!defined(_SC_PAGESIZE) && defined(_SC_PAGE_SIZE)) 364a7ccdff8e128c24564011d760a996496b0a981b3Theodore Ts'o#define _SC_PAGESIZE _SC_PAGE_SIZE 365a7ccdff8e128c24564011d760a996496b0a981b3Theodore Ts'o#endif 366a7ccdff8e128c24564011d760a996496b0a981b3Theodore Ts'o#ifdef _SC_PAGESIZE 367a7ccdff8e128c24564011d760a996496b0a981b3Theodore Ts'o sysval = sysconf(_SC_PAGESIZE); 368a7ccdff8e128c24564011d760a996496b0a981b3Theodore Ts'o if (sysval > 0) 369a7ccdff8e128c24564011d760a996496b0a981b3Theodore Ts'o sys_page_size = sysval; 370a7ccdff8e128c24564011d760a996496b0a981b3Theodore Ts'o#endif /* _SC_PAGESIZE */ 371a7ccdff8e128c24564011d760a996496b0a981b3Theodore Ts'o#endif /* HAVE_SYSCONF */ 372a7ccdff8e128c24564011d760a996496b0a981b3Theodore Ts'o 373f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o /* 374f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o * Get the size of the containing partition, and use this for 375fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o * defaults and for making sure the new filesystem doesn't 376f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o * exceed the partition size. 377f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o */ 3788728d50657e90e0ca39981106ad617d600b9acadValerie Aurora Henson retval = ext2fs_get_device_size2(device_name, fs->blocksize, 3798728d50657e90e0ca39981106ad617d600b9acadValerie Aurora Henson &max_size); 380f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o if (retval) { 381f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o com_err(program_name, retval, 382a13575f4d29a908add19ea27baa102bc6944ee30Theodore Ts'o _("while trying to determine filesystem size")); 383f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o exit(1); 384f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o } 385199ddaaa445e14fca8113b0db85e2576267071c9Josef Bacik if (force_min_size) 3861d8af189bd3762c09175ff4d9b6cdd98fe8c8150Peng Tao new_size = min_size; 387199ddaaa445e14fca8113b0db85e2576267071c9Josef Bacik else if (new_size_str) { 3888728d50657e90e0ca39981106ad617d600b9acadValerie Aurora Henson new_size = parse_num_blocks2(new_size_str, 3898728d50657e90e0ca39981106ad617d600b9acadValerie Aurora Henson fs->super->s_log_block_size); 390279a000fdcfd5fa79f18c975978d1c6bfa3113a3Eric Sandeen if (new_size == 0) { 391279a000fdcfd5fa79f18c975978d1c6bfa3113a3Eric Sandeen com_err(program_name, 0, 392279a000fdcfd5fa79f18c975978d1c6bfa3113a3Eric Sandeen _("Invalid new size: %s\n"), new_size_str); 393279a000fdcfd5fa79f18c975978d1c6bfa3113a3Eric Sandeen exit(1); 394279a000fdcfd5fa79f18c975978d1c6bfa3113a3Eric Sandeen } 39555f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o } else { 396f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o new_size = max_size; 397a7ccdff8e128c24564011d760a996496b0a981b3Theodore Ts'o /* Round down to an even multiple of a pagesize */ 398a7ccdff8e128c24564011d760a996496b0a981b3Theodore Ts'o if (sys_page_size > fs->blocksize) 399a7ccdff8e128c24564011d760a996496b0a981b3Theodore Ts'o new_size &= ~((sys_page_size / fs->blocksize)-1); 400a7ccdff8e128c24564011d760a996496b0a981b3Theodore Ts'o } 40146c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o 4020d04d88a8d88fc11120746bc72a5ffb7d7f05cb0Eric Sandeen if (!force && new_size < min_size) { 4030d04d88a8d88fc11120746bc72a5ffb7d7f05cb0Eric Sandeen com_err(program_name, 0, 4048728d50657e90e0ca39981106ad617d600b9acadValerie Aurora Henson _("New size smaller than minimum (%llu)\n"), min_size); 4050d04d88a8d88fc11120746bc72a5ffb7d7f05cb0Eric Sandeen exit(1); 4060d04d88a8d88fc11120746bc72a5ffb7d7f05cb0Eric Sandeen } 40746c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o if (use_stride >= 0) { 408de8f3a76218255e443ba57dec5d74850180fa75dAndreas Dilger if (use_stride >= (int) fs->super->s_blocks_per_group) { 409efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o com_err(program_name, 0, 41046c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o _("Invalid stride length")); 41146c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o exit(1); 41246c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o } 41396c6a3acd377698cb99ffd9925bec9b20ca4f6f9Theodore Ts'o fs->stride = fs->super->s_raid_stride = use_stride; 41496c6a3acd377698cb99ffd9925bec9b20ca4f6f9Theodore Ts'o ext2fs_mark_super_dirty(fs); 41546c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o } else 41646c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o determine_fs_stride(fs); 417efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 418116db1b513f6901415d1f5f8c01fc297d7cc64a4Theodore Ts'o /* 419116db1b513f6901415d1f5f8c01fc297d7cc64a4Theodore Ts'o * If we are resizing a plain file, and it's not big enough, 420116db1b513f6901415d1f5f8c01fc297d7cc64a4Theodore Ts'o * automatically extend it in a sparse fashion by writing the 421116db1b513f6901415d1f5f8c01fc297d7cc64a4Theodore Ts'o * last requested block. 422116db1b513f6901415d1f5f8c01fc297d7cc64a4Theodore Ts'o */ 423fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o new_file_size = ((__u64) new_size) * fs->blocksize; 424efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o if ((__u64) new_file_size > 425fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o (((__u64) 1) << (sizeof(st_buf.st_size)*8 - 1)) - 1) 426fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o fd = -1; 427fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o if ((new_file_size > st_buf.st_size) && 428fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o (fd > 0)) { 429fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o if ((ext2fs_llseek(fd, new_file_size-1, SEEK_SET) >= 0) && 430fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o (write(fd, "0", 1) == 1)) 431116db1b513f6901415d1f5f8c01fc297d7cc64a4Theodore Ts'o max_size = new_size; 432116db1b513f6901415d1f5f8c01fc297d7cc64a4Theodore Ts'o } 433f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o if (!force && (new_size > max_size)) { 434a13575f4d29a908add19ea27baa102bc6944ee30Theodore Ts'o fprintf(stderr, _("The containing partition (or device)" 4358728d50657e90e0ca39981106ad617d600b9acadValerie Aurora Henson " is only %llu (%dk) blocks.\nYou requested a new size" 4368728d50657e90e0ca39981106ad617d600b9acadValerie Aurora Henson " of %llu blocks.\n\n"), max_size, 437792a088162dcbd4e8f062e6cd42427e42c428ef7Theodore Ts'o fs->blocksize / 1024, new_size); 438f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o exit(1); 439f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o } 4404efbac6fed75c29d3d5f1b676b932754653a2ac5Valerie Aurora Henson if (new_size == ext2fs_blocks_count(fs->super)) { 4418728d50657e90e0ca39981106ad617d600b9acadValerie Aurora Henson fprintf(stderr, _("The filesystem is already %llu blocks " 442a13575f4d29a908add19ea27baa102bc6944ee30Theodore Ts'o "long. Nothing to do!\n\n"), new_size); 443f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o exit(0); 444f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o } 445bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o if (mount_flags & EXT2_MF_MOUNTED) { 446bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o retval = online_resize_fs(fs, mtpt, &new_size, flags); 447bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o } else { 448bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o if (!force && ((fs->super->s_lastcheck < fs->super->s_mtime) || 449bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o (fs->super->s_state & EXT2_ERROR_FS) || 450bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o ((fs->super->s_state & EXT2_VALID_FS) == 0))) { 451efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o fprintf(stderr, 452bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o _("Please run 'e2fsck -f %s' first.\n\n"), 453bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o device_name); 454bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o exit(1); 455bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o } 45696cdb37e27ff101fb23cefe422b4f77fb55209beTheodore Ts'o printf(_("Resizing the filesystem on " 4578728d50657e90e0ca39981106ad617d600b9acadValerie Aurora Henson "%s to %llu (%dk) blocks.\n"), 458bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o device_name, new_size, fs->blocksize / 1024); 459bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o retval = resize_fs(fs, &new_size, flags, 460bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o ((flags & RESIZE_PERCENT_COMPLETE) ? 461bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o resize_progress_func : 0)); 462f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o } 4633a4d9869d47c462c84688b0f8b15df5ab6f93381Theodore Ts'o free(mtpt); 4641e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o if (retval) { 465a13575f4d29a908add19ea27baa102bc6944ee30Theodore Ts'o com_err(program_name, retval, _("while trying to resize %s"), 4661e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o device_name); 46796cdb37e27ff101fb23cefe422b4f77fb55209beTheodore Ts'o fprintf(stderr, 46896cdb37e27ff101fb23cefe422b4f77fb55209beTheodore Ts'o _("Please run 'e2fsck -fy %s' to fix the filesystem\n" 46996cdb37e27ff101fb23cefe422b4f77fb55209beTheodore Ts'o "after the aborted resize operation.\n"), 47096cdb37e27ff101fb23cefe422b4f77fb55209beTheodore Ts'o device_name); 47196cdb37e27ff101fb23cefe422b4f77fb55209beTheodore Ts'o ext2fs_close(fs); 4721608211222685c65f3989f1f8d32e8f72d711c3dTheodore Ts'o exit(1); 4731e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o } 4748728d50657e90e0ca39981106ad617d600b9acadValerie Aurora Henson printf(_("The filesystem on %s is now %llu blocks long.\n\n"), 4757e71e4c545847b48b3dc04970aaf405f6f0e7b7dTheodore Ts'o device_name, new_size); 476fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o 477fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o if ((st_buf.st_size > new_file_size) && 478fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o (fd > 0)) { 479261cd3964fe1421bc8b9024c84888a5f1cba4195Theodore Ts'o#ifdef HAVE_FTRUNCATE64 480fb72556af88bf01459519d1028743c54a71bcca1Theodore Ts'o retval = ftruncate64(fd, new_file_size); 481fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o#else 482fb72556af88bf01459519d1028743c54a71bcca1Theodore Ts'o retval = 0; 48398dca6c552d73cc39a3cb9d16947b2df5c55ef21Theodore Ts'o /* Only truncate if new_file_size doesn't overflow off_t */ 48498dca6c552d73cc39a3cb9d16947b2df5c55ef21Theodore Ts'o if (((off_t) new_file_size) == new_file_size) 485fb72556af88bf01459519d1028743c54a71bcca1Theodore Ts'o retval = ftruncate(fd, (off_t) new_file_size); 486fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o#endif 487fb72556af88bf01459519d1028743c54a71bcca1Theodore Ts'o if (retval) 488fb72556af88bf01459519d1028743c54a71bcca1Theodore Ts'o com_err(program_name, retval, 489fb72556af88bf01459519d1028743c54a71bcca1Theodore Ts'o _("while trying to truncate %s"), 490fb72556af88bf01459519d1028743c54a71bcca1Theodore Ts'o device_name); 491fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o } 492fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o if (fd > 0) 493fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o close(fd); 494a6d8302b4873527798a77c1ba3106a04b71dfeacTheodore Ts'o remove_error_table(&et_ext2_error_table); 4950a617317ee6e947bd9f975c861599dd3dc41aa13Theodore Ts'o return (0); 49624b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o} 497