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 38e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallchar *program_name; 39e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic char *device_name, *io_options; 4024b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o 41dfcdc32f8d6623a35a9e66f503c535e4081b7266Theodore Ts'ostatic void usage (char *prog) 4224b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o{ 43199ddaaa445e14fca8113b0db85e2576267071c9Josef Bacik fprintf (stderr, _("Usage: %s [-d debug_flags] [-f] [-F] [-M] [-P] " 44199ddaaa445e14fca8113b0db85e2576267071c9Josef Bacik "[-p] device [new_size]\n\n"), prog); 452e561e024947b75864579bf4fea10c848ca0169eTheodore Ts'o 4624b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o exit (1); 4724b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o} 4824b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o 493b627e8d6735fd81906117d580ee70292b2cfaafTheodore Ts'ostatic errcode_t resize_progress_func(ext2_resize_t rfs, int pass, 503b627e8d6735fd81906117d580ee70292b2cfaafTheodore Ts'o unsigned long cur, unsigned long max) 5163b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o{ 5263b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o ext2_sim_progmeter progress; 5363b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o const char *label; 5463b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o errcode_t retval; 5563b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o 5663b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o progress = (ext2_sim_progmeter) rfs->prog_data; 57f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o if (max == 0) 583b627e8d6735fd81906117d580ee70292b2cfaafTheodore Ts'o return 0; 5963b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o if (cur == 0) { 6063b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o if (progress) 6163b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o ext2fs_progress_close(progress); 6263b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o progress = 0; 6363b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o switch (pass) { 64a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o case E2_RSZ_EXTEND_ITABLE_PASS: 65a13575f4d29a908add19ea27baa102bc6944ee30Theodore Ts'o label = _("Extending the inode table"); 6663b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o break; 6763b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o case E2_RSZ_BLOCK_RELOC_PASS: 68a13575f4d29a908add19ea27baa102bc6944ee30Theodore Ts'o label = _("Relocating blocks"); 6963b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o break; 70a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o case E2_RSZ_INODE_SCAN_PASS: 71a13575f4d29a908add19ea27baa102bc6944ee30Theodore Ts'o label = _("Scanning inode table"); 7263b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o break; 7363b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o case E2_RSZ_INODE_REF_UPD_PASS: 74a13575f4d29a908add19ea27baa102bc6944ee30Theodore Ts'o label = _("Updating inode references"); 7563b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o break; 7663b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o case E2_RSZ_MOVE_ITABLE_PASS: 77a13575f4d29a908add19ea27baa102bc6944ee30Theodore Ts'o label = _("Moving inode table"); 7863b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o break; 79a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o default: 80a13575f4d29a908add19ea27baa102bc6944ee30Theodore Ts'o label = _("Unknown pass?!?"); 81a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o break; 8263b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o } 83a13575f4d29a908add19ea27baa102bc6944ee30Theodore Ts'o printf(_("Begin pass %d (max = %lu)\n"), pass, max); 8463b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o retval = ext2fs_progress_init(&progress, label, 30, 8563b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o 40, max, 0); 8663b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o if (retval) 8763b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o progress = 0; 8863b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o rfs->prog_data = (void *) progress; 8963b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o } 9063b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o if (progress) 9163b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o ext2fs_progress_update(progress, cur); 9263b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o if (cur >= max) { 9363b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o if (progress) 9463b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o ext2fs_progress_close(progress); 9563b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o progress = 0; 9663b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o rfs->prog_data = 0; 9763b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o } 983b627e8d6735fd81906117d580ee70292b2cfaafTheodore Ts'o return 0; 9963b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o} 10063b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o 10146c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'ostatic void determine_fs_stride(ext2_filsys fs) 10246c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o{ 10346c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o unsigned int group; 10446c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o unsigned long long sum; 105e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall unsigned int has_sb, prev_has_sb = 0, num; 10646c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o int i_stride, b_stride; 10746c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o 10896c6a3acd377698cb99ffd9925bec9b20ca4f6f9Theodore Ts'o if (fs->stride) 10996c6a3acd377698cb99ffd9925bec9b20ca4f6f9Theodore Ts'o return; 11046c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o num = 0; sum = 0; 11146c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o for (group = 0; group < fs->group_desc_count; group++) { 11246c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o has_sb = ext2fs_bg_has_super(fs, group); 11346c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o if (group == 0 || has_sb != prev_has_sb) 11446c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o goto next; 115e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall b_stride = ext2fs_block_bitmap_loc(fs, group) - 116e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_block_bitmap_loc(fs, group - 1) - 11746c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o fs->super->s_blocks_per_group; 118e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall i_stride = ext2fs_inode_bitmap_loc(fs, group) - 119e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_inode_bitmap_loc(fs, group - 1) - 12046c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o fs->super->s_blocks_per_group; 12146c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o if (b_stride != i_stride || 12246c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o b_stride < 0) 12346c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o goto next; 12446c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o 12546c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o /* printf("group %d has stride %d\n", group, b_stride); */ 12646c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o sum += b_stride; 12746c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o num++; 128efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 12946c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o next: 13046c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o prev_has_sb = has_sb; 13146c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o } 13246c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o 13346c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o if (fs->group_desc_count > 12 && num < 3) 13446c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o sum = 0; 13546c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o 13646c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o if (num) 13746c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o fs->stride = sum / num; 13846c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o else 13946c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o fs->stride = 0; 14046c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o 14196c6a3acd377698cb99ffd9925bec9b20ca4f6f9Theodore Ts'o fs->super->s_raid_stride = fs->stride; 14296c6a3acd377698cb99ffd9925bec9b20ca4f6f9Theodore Ts'o ext2fs_mark_super_dirty(fs); 14396c6a3acd377698cb99ffd9925bec9b20ca4f6f9Theodore Ts'o 14446c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o#if 0 14546c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o if (fs->stride) 14646c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o printf("Using RAID stride of %d\n", fs->stride); 14746c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o#endif 14846c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o} 14946c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o 150e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstatic void bigalloc_check(ext2_filsys fs, int force) 151e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 152e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (!force && EXT2_HAS_RO_COMPAT_FEATURE(fs->super, 153e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXT4_FEATURE_RO_COMPAT_BIGALLOC)) { 154e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fprintf(stderr, "%s", _("\nResizing bigalloc file systems has " 155e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "not been fully tested. Proceed at\n" 156e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "your own risk! Use the force option " 157e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "if you want to go ahead anyway.\n\n")); 158e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall exit(1); 159e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 160e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 161e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 1620a617317ee6e947bd9f975c861599dd3dc41aa13Theodore Ts'oint main (int argc, char ** argv) 16324b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o{ 16424b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o errcode_t retval; 16524b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o ext2_filsys fs; 16624b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o int c; 16705e112a11b6508c2b12d5d4ee0c322171db9b538Theodore Ts'o int flags = 0; 168c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o int flush = 0; 169f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o int force = 0; 1705d2ef12f6ed4c35c7e6baa7cb83ced738a3f1976Theodore Ts'o int io_flags = 0; 171199ddaaa445e14fca8113b0db85e2576267071c9Josef Bacik int force_min_size = 0; 172199ddaaa445e14fca8113b0db85e2576267071c9Josef Bacik int print_min_size = 0; 173fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o int fd, ret; 174e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall blk64_t new_size = 0; 1758728d50657e90e0ca39981106ad617d600b9acadValerie Aurora Henson blk64_t max_size = 0; 176e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall blk64_t min_size = 0; 17724b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o io_manager io_ptr; 17855f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o char *new_size_str = 0; 17946c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o int use_stride = -1; 180e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ext2fs_struct_stat st_buf; 181fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o __s64 new_file_size; 182544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o unsigned int sys_page_size = 4096; 183a7ccdff8e128c24564011d760a996496b0a981b3Theodore Ts'o long sysval; 184bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o int len, mount_flags; 185bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o char *mtpt; 186ddc32a045bd3bd35968ace2dbe22179470baec0bTheodore Ts'o 187ddc32a045bd3bd35968ace2dbe22179470baec0bTheodore Ts'o#ifdef ENABLE_NLS 188ddc32a045bd3bd35968ace2dbe22179470baec0bTheodore Ts'o setlocale(LC_MESSAGES, ""); 189ddc32a045bd3bd35968ace2dbe22179470baec0bTheodore Ts'o setlocale(LC_CTYPE, ""); 190ddc32a045bd3bd35968ace2dbe22179470baec0bTheodore Ts'o bindtextdomain(NLS_CAT_NAME, LOCALEDIR); 191ddc32a045bd3bd35968ace2dbe22179470baec0bTheodore Ts'o textdomain(NLS_CAT_NAME); 192e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall set_com_err_gettext(gettext); 193ddc32a045bd3bd35968ace2dbe22179470baec0bTheodore Ts'o#endif 194ddc32a045bd3bd35968ace2dbe22179470baec0bTheodore Ts'o 195a6d8302b4873527798a77c1ba3106a04b71dfeacTheodore Ts'o add_error_table(&et_ext2_error_table); 19624b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o 197f35fd3d5eeb3e35660ea87adbc170978c3cdf9e3Theodore Ts'o fprintf (stderr, "resize2fs %s (%s)\n", 198ba0af7566347b3c2366cbb18715f465f70089019Theodore Ts'o E2FSPROGS_VERSION, E2FSPROGS_DATE); 19924b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o if (argc && *argv) 20024b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o program_name = *argv; 2012e561e024947b75864579bf4fea10c848ca0169eTheodore Ts'o 202199ddaaa445e14fca8113b0db85e2576267071c9Josef Bacik while ((c = getopt (argc, argv, "d:fFhMPpS:")) != EOF) { 20324b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o switch (c) { 20424b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o case 'h': 20524b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o usage(program_name); 20624b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o break; 207f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o case 'f': 208f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o force = 1; 209f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o break; 210c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o case 'F': 211c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o flush = 1; 212c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o break; 213199ddaaa445e14fca8113b0db85e2576267071c9Josef Bacik case 'M': 214199ddaaa445e14fca8113b0db85e2576267071c9Josef Bacik force_min_size = 1; 215199ddaaa445e14fca8113b0db85e2576267071c9Josef Bacik break; 216199ddaaa445e14fca8113b0db85e2576267071c9Josef Bacik case 'P': 217199ddaaa445e14fca8113b0db85e2576267071c9Josef Bacik print_min_size = 1; 218199ddaaa445e14fca8113b0db85e2576267071c9Josef Bacik break; 21905e112a11b6508c2b12d5d4ee0c322171db9b538Theodore Ts'o case 'd': 22005e112a11b6508c2b12d5d4ee0c322171db9b538Theodore Ts'o flags |= atoi(optarg); 22105e112a11b6508c2b12d5d4ee0c322171db9b538Theodore Ts'o break; 22205e112a11b6508c2b12d5d4ee0c322171db9b538Theodore Ts'o case 'p': 22305e112a11b6508c2b12d5d4ee0c322171db9b538Theodore Ts'o flags |= RESIZE_PERCENT_COMPLETE; 22405e112a11b6508c2b12d5d4ee0c322171db9b538Theodore Ts'o break; 22546c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o case 'S': 22646c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o use_stride = atoi(optarg); 22746c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o break; 22824b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o default: 229f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o usage(program_name); 23024b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o } 23124b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o } 232f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o if (optind == argc) 233f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o usage(program_name); 2342e561e024947b75864579bf4fea10c848ca0169eTheodore Ts'o 23524b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o device_name = argv[optind++]; 23655f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o if (optind < argc) 23755f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o new_size_str = argv[optind++]; 238f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o if (optind < argc) 239f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o usage(program_name); 240efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 2412e8ca9a26b0bd7dae546a3f9a98df67b043fe3beTheodore Ts'o io_options = strchr(device_name, '?'); 2422e8ca9a26b0bd7dae546a3f9a98df67b043fe3beTheodore Ts'o if (io_options) 2432e8ca9a26b0bd7dae546a3f9a98df67b043fe3beTheodore Ts'o *io_options++ = 0; 2442e8ca9a26b0bd7dae546a3f9a98df67b043fe3beTheodore Ts'o 245bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o /* 246bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o * Figure out whether or not the device is mounted, and if it is 247bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o * where it is mounted. 248bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o */ 249bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o len=80; 250bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o while (1) { 251bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o mtpt = malloc(len); 252bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o if (!mtpt) 253bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o return ENOMEM; 254bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o mtpt[len-1] = 0; 255efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o retval = ext2fs_check_mount_point(device_name, &mount_flags, 256bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o mtpt, len); 257bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o if (retval) { 258bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o com_err("ext2fs_check_mount_point", retval, 259bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o _("while determining whether %s is mounted."), 260bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o device_name); 261bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o exit(1); 262bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o } 2633a4d9869d47c462c84688b0f8b15df5ab6f93381Theodore Ts'o if (!(mount_flags & EXT2_MF_MOUNTED) || (mtpt[len-1] == 0)) 264bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o break; 265bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o free(mtpt); 266bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o len = 2 * len; 267bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o } 268fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o 269e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fd = ext2fs_open_file(device_name, O_RDWR, 0); 270fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o if (fd < 0) { 271fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o com_err("open", errno, _("while opening %s"), 272fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o device_name); 273fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o exit(1); 274fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o } 275fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o 276e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ret = ext2fs_fstat(fd, &st_buf); 277fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o if (ret < 0) { 278efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o com_err("open", errno, 279fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o _("while getting stat information for %s"), 280fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o device_name); 281fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o exit(1); 282fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o } 283efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 284c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o if (flush) { 28548e08e034ead9c3518fe3e130b2ff5012d31e055Theodore Ts'o retval = ext2fs_sync_device(fd, 1); 28648e08e034ead9c3518fe3e130b2ff5012d31e055Theodore Ts'o if (retval) { 287efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o com_err(argv[0], retval, 288a13575f4d29a908add19ea27baa102bc6944ee30Theodore Ts'o _("while trying to flush %s"), 289c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o device_name); 290c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o exit(1); 291c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o } 292fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o } 293fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o 294fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o if (!S_ISREG(st_buf.st_mode )) { 295c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o close(fd); 296fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o fd = -1; 297c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o } 298c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o 299f38cf3cb34addaa53d1f855d7607b151082a4229Theodore Ts'o#ifdef CONFIG_TESTIO_DEBUG 300f38cf3cb34addaa53d1f855d7607b151082a4229Theodore Ts'o if (getenv("TEST_IO_FLAGS") || getenv("TEST_IO_BLOCK")) { 30105e112a11b6508c2b12d5d4ee0c322171db9b538Theodore Ts'o io_ptr = test_io_manager; 30205e112a11b6508c2b12d5d4ee0c322171db9b538Theodore Ts'o test_io_backing_manager = unix_io_manager; 303efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o } else 304f38cf3cb34addaa53d1f855d7607b151082a4229Theodore Ts'o#endif 30505e112a11b6508c2b12d5d4ee0c322171db9b538Theodore Ts'o io_ptr = unix_io_manager; 30605e112a11b6508c2b12d5d4ee0c322171db9b538Theodore Ts'o 3075d2ef12f6ed4c35c7e6baa7cb83ced738a3f1976Theodore Ts'o if (!(mount_flags & EXT2_MF_MOUNTED)) 3085d2ef12f6ed4c35c7e6baa7cb83ced738a3f1976Theodore Ts'o io_flags = EXT2_FLAG_RW | EXT2_FLAG_EXCLUSIVE; 309e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 310e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall io_flags |= EXT2_FLAG_64BITS; 311e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 312efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o retval = ext2fs_open2(device_name, io_options, io_flags, 3132e8ca9a26b0bd7dae546a3f9a98df67b043fe3beTheodore Ts'o 0, 0, io_ptr, &fs); 31424b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o if (retval) { 315e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err(program_name, retval, _("while trying to open %s"), 316e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall device_name); 317e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf("%s", _("Couldn't find valid filesystem superblock.\n")); 31824b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o exit (1); 31924b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o } 320236efede1922fa173b3c2f20d9e0886856664ab4Jose R. Santos 321101c84f2e049bffcdb6c5ba1784842cdd50dbf05Theodore Ts'o /* 322101c84f2e049bffcdb6c5ba1784842cdd50dbf05Theodore Ts'o * Check for compatibility with the feature sets. We need to 323101c84f2e049bffcdb6c5ba1784842cdd50dbf05Theodore Ts'o * be more stringent than ext2fs_open(). 324101c84f2e049bffcdb6c5ba1784842cdd50dbf05Theodore Ts'o */ 32576dd5e5c2842fb1a7b858aad3e68b5e9c16890c9Theodore Ts'o if (fs->super->s_feature_compat & ~EXT2_LIB_FEATURE_COMPAT_SUPP) { 326101c84f2e049bffcdb6c5ba1784842cdd50dbf05Theodore Ts'o com_err(program_name, EXT2_ET_UNSUPP_FEATURE, 327101c84f2e049bffcdb6c5ba1784842cdd50dbf05Theodore Ts'o "(%s)", device_name); 328101c84f2e049bffcdb6c5ba1784842cdd50dbf05Theodore Ts'o exit(1); 329101c84f2e049bffcdb6c5ba1784842cdd50dbf05Theodore Ts'o } 330a8d632a4e9fd528631d2ce8c28b4aade8da0a862Theodore Ts'o 331e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall min_size = calculate_minimum_resize_size(fs, flags); 3320d04d88a8d88fc11120746bc72a5ffb7d7f05cb0Eric Sandeen 333199ddaaa445e14fca8113b0db85e2576267071c9Josef Bacik if (print_min_size) { 3348587d393b0f305a8e7c4f4908701af209e261696Eric Sandeen if (!force && ((fs->super->s_state & EXT2_ERROR_FS) || 3355fa92bc76888404b161b3fd0fd7e6b63e064badfEric Sandeen ((fs->super->s_state & EXT2_VALID_FS) == 0))) { 3365fa92bc76888404b161b3fd0fd7e6b63e064badfEric Sandeen fprintf(stderr, 3375fa92bc76888404b161b3fd0fd7e6b63e064badfEric Sandeen _("Please run 'e2fsck -f %s' first.\n\n"), 3385fa92bc76888404b161b3fd0fd7e6b63e064badfEric Sandeen device_name); 3395fa92bc76888404b161b3fd0fd7e6b63e064badfEric Sandeen exit(1); 3405fa92bc76888404b161b3fd0fd7e6b63e064badfEric Sandeen } 341e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf(_("Estimated minimum size of the filesystem: %llu\n"), 3420d04d88a8d88fc11120746bc72a5ffb7d7f05cb0Eric Sandeen min_size); 343199ddaaa445e14fca8113b0db85e2576267071c9Josef Bacik exit(0); 344199ddaaa445e14fca8113b0db85e2576267071c9Josef Bacik } 345199ddaaa445e14fca8113b0db85e2576267071c9Josef Bacik 346a7ccdff8e128c24564011d760a996496b0a981b3Theodore Ts'o /* Determine the system page size if possible */ 347a7ccdff8e128c24564011d760a996496b0a981b3Theodore Ts'o#ifdef HAVE_SYSCONF 348a7ccdff8e128c24564011d760a996496b0a981b3Theodore Ts'o#if (!defined(_SC_PAGESIZE) && defined(_SC_PAGE_SIZE)) 349a7ccdff8e128c24564011d760a996496b0a981b3Theodore Ts'o#define _SC_PAGESIZE _SC_PAGE_SIZE 350a7ccdff8e128c24564011d760a996496b0a981b3Theodore Ts'o#endif 351a7ccdff8e128c24564011d760a996496b0a981b3Theodore Ts'o#ifdef _SC_PAGESIZE 352a7ccdff8e128c24564011d760a996496b0a981b3Theodore Ts'o sysval = sysconf(_SC_PAGESIZE); 353a7ccdff8e128c24564011d760a996496b0a981b3Theodore Ts'o if (sysval > 0) 354a7ccdff8e128c24564011d760a996496b0a981b3Theodore Ts'o sys_page_size = sysval; 355a7ccdff8e128c24564011d760a996496b0a981b3Theodore Ts'o#endif /* _SC_PAGESIZE */ 356a7ccdff8e128c24564011d760a996496b0a981b3Theodore Ts'o#endif /* HAVE_SYSCONF */ 357a7ccdff8e128c24564011d760a996496b0a981b3Theodore Ts'o 358f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o /* 359f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o * Get the size of the containing partition, and use this for 360fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o * defaults and for making sure the new filesystem doesn't 361f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o * exceed the partition size. 362f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o */ 3638728d50657e90e0ca39981106ad617d600b9acadValerie Aurora Henson retval = ext2fs_get_device_size2(device_name, fs->blocksize, 364e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall &max_size); 365f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o if (retval) { 366e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err(program_name, retval, "%s", 367a13575f4d29a908add19ea27baa102bc6944ee30Theodore Ts'o _("while trying to determine filesystem size")); 368f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o exit(1); 369f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o } 370199ddaaa445e14fca8113b0db85e2576267071c9Josef Bacik if (force_min_size) 3711d8af189bd3762c09175ff4d9b6cdd98fe8c8150Peng Tao new_size = min_size; 372199ddaaa445e14fca8113b0db85e2576267071c9Josef Bacik else if (new_size_str) { 373e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall new_size = parse_num_blocks2(new_size_str, 374e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fs->super->s_log_block_size); 375279a000fdcfd5fa79f18c975978d1c6bfa3113a3Eric Sandeen if (new_size == 0) { 376279a000fdcfd5fa79f18c975978d1c6bfa3113a3Eric Sandeen com_err(program_name, 0, 377279a000fdcfd5fa79f18c975978d1c6bfa3113a3Eric Sandeen _("Invalid new size: %s\n"), new_size_str); 378279a000fdcfd5fa79f18c975978d1c6bfa3113a3Eric Sandeen exit(1); 379279a000fdcfd5fa79f18c975978d1c6bfa3113a3Eric Sandeen } 38055f4cbd96e0029f0ff67c4913192d87bf52fd149Theodore Ts'o } else { 381f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o new_size = max_size; 382a7ccdff8e128c24564011d760a996496b0a981b3Theodore Ts'o /* Round down to an even multiple of a pagesize */ 383a7ccdff8e128c24564011d760a996496b0a981b3Theodore Ts'o if (sys_page_size > fs->blocksize) 384a7ccdff8e128c24564011d760a996496b0a981b3Theodore Ts'o new_size &= ~((sys_page_size / fs->blocksize)-1); 385a7ccdff8e128c24564011d760a996496b0a981b3Theodore Ts'o } 386e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (!EXT2_HAS_INCOMPAT_FEATURE(fs->super, 387e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXT4_FEATURE_INCOMPAT_64BIT)) { 388e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall /* Take 16T down to 2^32-1 blocks */ 389e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (new_size == (1ULL << 32)) 390e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall new_size--; 391e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall else if (new_size > (1ULL << 32)) { 392e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err(program_name, 0, "%s", 393e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall _("New size too large to be " 394e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "expressed in 32 bits\n")); 395e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall exit(1); 396e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 397e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 39846c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o 3990d04d88a8d88fc11120746bc72a5ffb7d7f05cb0Eric Sandeen if (!force && new_size < min_size) { 4000d04d88a8d88fc11120746bc72a5ffb7d7f05cb0Eric Sandeen com_err(program_name, 0, 401e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall _("New size smaller than minimum (%llu)\n"), min_size); 4020d04d88a8d88fc11120746bc72a5ffb7d7f05cb0Eric Sandeen exit(1); 4030d04d88a8d88fc11120746bc72a5ffb7d7f05cb0Eric Sandeen } 40446c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o if (use_stride >= 0) { 405de8f3a76218255e443ba57dec5d74850180fa75dAndreas Dilger if (use_stride >= (int) fs->super->s_blocks_per_group) { 406e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall com_err(program_name, 0, "%s", 40746c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o _("Invalid stride length")); 40846c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o exit(1); 40946c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o } 41096c6a3acd377698cb99ffd9925bec9b20ca4f6f9Theodore Ts'o fs->stride = fs->super->s_raid_stride = use_stride; 41196c6a3acd377698cb99ffd9925bec9b20ca4f6f9Theodore Ts'o ext2fs_mark_super_dirty(fs); 41246c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o } else 41346c5490d13eef1a80634995fd52fd35a2ff55e7fTheodore Ts'o determine_fs_stride(fs); 414efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 415116db1b513f6901415d1f5f8c01fc297d7cc64a4Theodore Ts'o /* 416116db1b513f6901415d1f5f8c01fc297d7cc64a4Theodore Ts'o * If we are resizing a plain file, and it's not big enough, 417116db1b513f6901415d1f5f8c01fc297d7cc64a4Theodore Ts'o * automatically extend it in a sparse fashion by writing the 418116db1b513f6901415d1f5f8c01fc297d7cc64a4Theodore Ts'o * last requested block. 419116db1b513f6901415d1f5f8c01fc297d7cc64a4Theodore Ts'o */ 420fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o new_file_size = ((__u64) new_size) * fs->blocksize; 421efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o if ((__u64) new_file_size > 422fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o (((__u64) 1) << (sizeof(st_buf.st_size)*8 - 1)) - 1) 423fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o fd = -1; 424fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o if ((new_file_size > st_buf.st_size) && 425fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o (fd > 0)) { 426fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o if ((ext2fs_llseek(fd, new_file_size-1, SEEK_SET) >= 0) && 427fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o (write(fd, "0", 1) == 1)) 428116db1b513f6901415d1f5f8c01fc297d7cc64a4Theodore Ts'o max_size = new_size; 429116db1b513f6901415d1f5f8c01fc297d7cc64a4Theodore Ts'o } 430f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o if (!force && (new_size > max_size)) { 431a13575f4d29a908add19ea27baa102bc6944ee30Theodore Ts'o fprintf(stderr, _("The containing partition (or device)" 4328728d50657e90e0ca39981106ad617d600b9acadValerie Aurora Henson " is only %llu (%dk) blocks.\nYou requested a new size" 433e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall " of %llu blocks.\n\n"), max_size, 434792a088162dcbd4e8f062e6cd42427e42c428ef7Theodore Ts'o fs->blocksize / 1024, new_size); 435f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o exit(1); 436f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o } 437e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall if (new_size == ext2fs_blocks_count(fs->super)) { 438e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall fprintf(stderr, _("The filesystem is already %llu blocks " 439a13575f4d29a908add19ea27baa102bc6944ee30Theodore Ts'o "long. Nothing to do!\n\n"), new_size); 440f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o exit(0); 441f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o } 442bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o if (mount_flags & EXT2_MF_MOUNTED) { 443e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall bigalloc_check(fs, force); 444bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o retval = online_resize_fs(fs, mtpt, &new_size, flags); 445bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o } else { 446bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o if (!force && ((fs->super->s_lastcheck < fs->super->s_mtime) || 447bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o (fs->super->s_state & EXT2_ERROR_FS) || 448bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o ((fs->super->s_state & EXT2_VALID_FS) == 0))) { 449efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o fprintf(stderr, 450bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o _("Please run 'e2fsck -f %s' first.\n\n"), 451bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o device_name); 452bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o exit(1); 453bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o } 454e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall bigalloc_check(fs, force); 45596cdb37e27ff101fb23cefe422b4f77fb55209beTheodore Ts'o printf(_("Resizing the filesystem on " 456e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall "%s to %llu (%dk) blocks.\n"), 457bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o device_name, new_size, fs->blocksize / 1024); 458bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o retval = resize_fs(fs, &new_size, flags, 459bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o ((flags & RESIZE_PERCENT_COMPLETE) ? 460bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o resize_progress_func : 0)); 461f4b2a6db3f13f4210697bcd273086006c719929bTheodore Ts'o } 4623a4d9869d47c462c84688b0f8b15df5ab6f93381Theodore Ts'o free(mtpt); 4631e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o if (retval) { 464a13575f4d29a908add19ea27baa102bc6944ee30Theodore Ts'o com_err(program_name, retval, _("while trying to resize %s"), 4651e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o device_name); 46696cdb37e27ff101fb23cefe422b4f77fb55209beTheodore Ts'o fprintf(stderr, 46796cdb37e27ff101fb23cefe422b4f77fb55209beTheodore Ts'o _("Please run 'e2fsck -fy %s' to fix the filesystem\n" 46896cdb37e27ff101fb23cefe422b4f77fb55209beTheodore Ts'o "after the aborted resize operation.\n"), 46996cdb37e27ff101fb23cefe422b4f77fb55209beTheodore Ts'o device_name); 47096cdb37e27ff101fb23cefe422b4f77fb55209beTheodore Ts'o ext2fs_close(fs); 4711608211222685c65f3989f1f8d32e8f72d711c3dTheodore Ts'o exit(1); 4721e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o } 473e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall printf(_("The filesystem on %s is now %llu blocks long.\n\n"), 4747e71e4c545847b48b3dc04970aaf405f6f0e7b7dTheodore Ts'o device_name, new_size); 475fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o 476fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o if ((st_buf.st_size > new_file_size) && 477fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o (fd > 0)) { 478261cd3964fe1421bc8b9024c84888a5f1cba4195Theodore Ts'o#ifdef HAVE_FTRUNCATE64 479fb72556af88bf01459519d1028743c54a71bcca1Theodore Ts'o retval = ftruncate64(fd, new_file_size); 480fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o#else 481fb72556af88bf01459519d1028743c54a71bcca1Theodore Ts'o retval = 0; 48298dca6c552d73cc39a3cb9d16947b2df5c55ef21Theodore Ts'o /* Only truncate if new_file_size doesn't overflow off_t */ 48398dca6c552d73cc39a3cb9d16947b2df5c55ef21Theodore Ts'o if (((off_t) new_file_size) == new_file_size) 484fb72556af88bf01459519d1028743c54a71bcca1Theodore Ts'o retval = ftruncate(fd, (off_t) new_file_size); 485fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o#endif 486fb72556af88bf01459519d1028743c54a71bcca1Theodore Ts'o if (retval) 487fb72556af88bf01459519d1028743c54a71bcca1Theodore Ts'o com_err(program_name, retval, 488fb72556af88bf01459519d1028743c54a71bcca1Theodore Ts'o _("while trying to truncate %s"), 489fb72556af88bf01459519d1028743c54a71bcca1Theodore Ts'o device_name); 490fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o } 491fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o if (fd > 0) 492fe07357f590d2606fe9641e277c171c4f7dcc512Theodore Ts'o close(fd); 493a6d8302b4873527798a77c1ba3106a04b71dfeacTheodore Ts'o remove_error_table(&et_ext2_error_table); 4940a617317ee6e947bd9f975c861599dd3dc41aa13Theodore Ts'o return (0); 49524b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o} 496