Return-Path: Received: from mail-pl1-f196.google.com ([209.85.214.196]:46716 "EHLO mail-pl1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725993AbfABSVF (ORCPT ); Wed, 2 Jan 2019 13:21:05 -0500 Received: by mail-pl1-f196.google.com with SMTP id t13so14800399ply.13 for ; Wed, 02 Jan 2019 10:21:04 -0800 (PST) From: Andreas Dilger Message-Id: Content-Type: multipart/signed; boundary="Apple-Mail=_9FAD244C-C5E1-4035-9D38-5FFF9D3263D0"; protocol="application/pgp-signature"; micalg=pgp-sha256 Mime-Version: 1.0 (Mac OS X Mail 10.3 \(3273\)) Subject: Re: [PATCH v6 2/4] e2image: add -b and -B options to use supperblock backup Date: Wed, 2 Jan 2019 11:21:01 -0700 In-Reply-To: <20190101210737.87248-3-c17828@cray.com> Cc: Ext4 Developers List To: Artem Blagodarenko References: <20190101210737.87248-1-c17828@cray.com> <20190101210737.87248-3-c17828@cray.com> Sender: linux-ext4-owner@vger.kernel.org List-ID: --Apple-Mail=_9FAD244C-C5E1-4035-9D38-5FFF9D3263D0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=us-ascii On Jan 1, 2019, at 2:07 PM, Artem Blagodarenko = wrote: >=20 > e2image has no ability to use superblock backup to copy metadata. > This feature can be useful if someone wants to make partition > image and fix it using e2fsck utility. >=20 > New -b option allows to pass superblock number, like e2fsck utility = do. Some minor typos in commit message: s/do/does/ > e2image doesn't change primary superblock and store is as is, so s/is/it/ (first instance) > it can be fixed using e2fsck latter. Option -B allows to set > superblock size. s/to set/setting/ > Signed-off-by: Artem Blagodarenko Reviewed-by: Andreas Dilger > --- > misc/e2image.8.in | 33 +++++++++++++++++++++++++++++++++ > misc/e2image.c | 43 +++++++++++++++++++++++++++++++++++++------ > 2 files changed, 70 insertions(+), 6 deletions(-) >=20 > diff --git a/misc/e2image.8.in b/misc/e2image.8.in > index a7bfdf24..bbbb57ae 100644 > --- a/misc/e2image.8.in > +++ b/misc/e2image.8.in > @@ -12,6 +12,15 @@ e2image \- Save critical ext2/ext3/ext4 filesystem = metadata to a file > ] > [ > .B \-f > +.B \-b > +.I superblock > +] > +[ > +.B \-B > +.I blocksize > +] > +[ > +.B \-fr > ] > .I device > .I image-file > @@ -167,6 +176,22 @@ the > option will prevent analysis of problems related to hash-tree indexed > directories. > .PP > +Option > +.B \-b > +.I superblock > +can be used to get image from partition with broken primary = superblock. > +The partition is copied as-is including broken primary superblock. > +.PP > +Option > +.B \-B > +.I blocksize > +can be used to set superblock block size. Normally, e2fsck will = search > +for the superblock at various different block sizes in an attempt to = find > +the appropriate blocksize. This search can be fooled in some cases. = This > +option forces e2fsck to only try locating the superblock at a = particular > +blocksize. If the superblock is not found, e2fsck will terminate with = a > +fatal error. > +.PP > Note that this will work even if you substitute "/dev/hda1" for = another raw > disk image, or QCOW2 image previously created by > .BR e2image . > @@ -217,6 +242,14 @@ This can be useful to write a qcow2 image = containing all data to a > sparse image file where it can be loop mounted, or to a disk = partition. > Note that this may not work with qcow2 images not generated by = e2image. > .PP > +Options > +.B \-b > +.I superblock > +and > +.B \-B > +.I blocksize > +can be used same way as for raw images. > +.PP > .SH INCLUDING DATA > Normally > .B e2image > diff --git a/misc/e2image.c b/misc/e2image.c > index 9e21d0db..3c881fee 100644 > --- a/misc/e2image.c > +++ b/misc/e2image.c > @@ -104,7 +104,8 @@ static int get_bits_from_size(size_t size) >=20 > static void usage(void) > { > - fprintf(stderr, _("Usage: %s [ -r|Q ] [ -f ] device = image-file\n"), > + fprintf(stderr, _("Usage: %s [ -r|Q ] [ -f ] [ -b superblock ] [ = -B blocksize]" > + "[ -fr ] device image-file\n"), > program_name); > fprintf(stderr, _(" %s -I device image-file\n"), = program_name); > fprintf(stderr, _(" %s -ra [ -cfnp ] [ -o src_offset ] = " > @@ -1267,7 +1268,8 @@ static void = output_qcow2_meta_data_blocks(ext2_filsys fs, int fd) > free_qcow2_image(img); > } >=20 > -static void write_raw_image_file(ext2_filsys fs, int fd, int type, = int flags) > +static void write_raw_image_file(ext2_filsys fs, int fd, int type, = int flags, > + blk64_t superblock) > { > struct process_block_struct pb; > struct ext2_inode inode; > @@ -1295,6 +1297,22 @@ static void write_raw_image_file(ext2_filsys = fs, int fd, int type, int flags) > } > } >=20 > + if (superblock) { > + int j; > + > + ext2fs_mark_block_bitmap2(meta_block_map, superblock); > + meta_blocks_count++; > + > + /* > + * Mark the backup superblock descriptors > + */ > + for (j =3D 0; j < fs->desc_blocks; j++) { > + ext2fs_mark_block_bitmap2(meta_block_map, > + ext2fs_descriptor_block_loc2(fs, superblock, = j)); > + } > + meta_blocks_count +=3D fs->desc_blocks; > + } > + > mark_table_blocks(fs); > if (show_progress) > fprintf(stderr, "%s", _("Scanning inodes...\n")); > @@ -1474,6 +1492,8 @@ int main (int argc, char ** argv) > int ignore_rw_mount =3D 0; > int check =3D 0; > struct stat st; > + blk64_t superblock =3D 0; > + int blocksize =3D 0; >=20 > #ifdef ENABLE_NLS > setlocale(LC_MESSAGES, ""); > @@ -1487,8 +1507,14 @@ int main (int argc, char ** argv) > if (argc && *argv) > program_name =3D *argv; > add_error_table(&et_ext2_error_table); > - while ((c =3D getopt(argc, argv, "nrsIQafo:O:pc")) !=3D EOF) > + while ((c =3D getopt(argc, argv, "b:B:nrsIQafo:O:pc")) !=3D EOF) > switch (c) { > + case 'b': > + superblock =3D strtoull(optarg, NULL, 0); > + break; > + case 'B': > + blocksize =3D strtoul(optarg, NULL, 0); > + break; > case 'I': > flags |=3D E2IMAGE_INSTALL_FLAG; > break; > @@ -1540,6 +1566,11 @@ int main (int argc, char ** argv) > "with raw or QCOW2 = images.")); > exit(1); > } > + if (superblock && !img_type) { > + com_err(program_name, 0, "%s", _("-b option can only be = used " > + "with raw or QCOW2 = images.")); > + exit(1); > + } > if ((source_offset || dest_offset) && img_type !=3D E2IMAGE_RAW) = { > com_err(program_name, 0, "%s", > _("Offsets are only allowed with raw images.")); > @@ -1590,8 +1621,8 @@ int main (int argc, char ** argv) > } > } > sprintf(offset_opt, "offset=3D%llu", source_offset); > - retval =3D ext2fs_open2(device_name, offset_opt, open_flag, 0, = 0, > - unix_io_manager, &fs); > + retval =3D ext2fs_open2(device_name, offset_opt, open_flag, > + superblock, blocksize, unix_io_manager, = &fs); > if (retval) { > com_err (program_name, retval, _("while trying to open = %s"), > device_name); > @@ -1681,7 +1712,7 @@ skip_device: > exit(1); > } > if (img_type) > - write_raw_image_file(fs, fd, img_type, flags); > + write_raw_image_file(fs, fd, img_type, flags, = superblock); > else > write_image_file(fs, fd); >=20 > -- > 2.14.3 >=20 Cheers, Andreas --Apple-Mail=_9FAD244C-C5E1-4035-9D38-5FFF9D3263D0 Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename=signature.asc Content-Type: application/pgp-signature; name=signature.asc Content-Description: Message signed with OpenPGP -----BEGIN PGP SIGNATURE----- Comment: GPGTools - http://gpgtools.org iQIzBAEBCAAdFiEEDb73u6ZejP5ZMprvcqXauRfMH+AFAlwtAQ4ACgkQcqXauRfM H+BN5g//bBIb7qWZzgPD9Ui2M8BcbBXmE85/VLmCGN8E35vRIKYCp8nQEV1wGHTl jiZPrT/bD1NRbZuLRsliRPGWjxc9abzts2sZSFwkpKmHtorTupsF3sLhXo1HS/yD 8h9mNApFfQa2PqmUuBUoF6xgeCNH5B8DAdZ6V2NFUzJ/Foj8jxeAbvELxn5PVmYv D3hw8D5Jt92/4Kg/lc7/X5So656D8kQr+AXvDgocZhq+3B+WbWilgdkW78R7hWb2 4G2bupcSvxHXc1QgY+9eQMH7bTKALncuRlcrpCa3ULinKJTM4aMMCot1WysboAIR qqoeKkiHiGiPE2OZ7wdQJiMFIqRmqckmxamFGzZIpUXM1L2RLDGTzNgKXXF46eUW spgjCx24B4sE6CaqYLRplMJKlTWJZsXxBVQ5oWMUPPyK4lLn53OOaTn/hrqwM4nN yyA4ofhZn95nqld474nj7gOQHFL452ITXF2WcIFQQLi3+ECD0Rce+2gAzQ2Lx5ry 7Bk0PwHlyU8tvbAo/acAMlnX3lYoYgqBAgbUgdghIr+5FChzAXgD0Vf+M6IwxTz1 zesC3ZEsVPOjkWN0g+ck5CpLg2pweKdbJb5/FYk0WCmKQl9ssIMDoPbAUrkgiiH4 zZxMoMzfu5Ma5wAoGOdHhGTvppUaCBIZpQRkf4HjyAeRTIHWc0w= =erm0 -----END PGP SIGNATURE----- --Apple-Mail=_9FAD244C-C5E1-4035-9D38-5FFF9D3263D0--