Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp1591085pxb; Thu, 4 Feb 2021 17:52:31 -0800 (PST) X-Google-Smtp-Source: ABdhPJwHJ1FteLJb3V4Bg57JXKATSuZZ5mYk8yN5Zr57KyswzIIRBm2D60/Y7qf3FXNdKWO5Trz5 X-Received: by 2002:a05:6402:18f:: with SMTP id r15mr1389712edv.53.1612489951285; Thu, 04 Feb 2021 17:52:31 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1612489951; cv=none; d=google.com; s=arc-20160816; b=WTBV64yTy+ICqGH/se6dAKdzJP/TpXgM4qtGlE035OuJzjfinvOn2UD4jZOyxzuGmI ZU58vcjRyKt9jN7+/qAox/KNm9r5lffOfhIMKe1wdK+qOpfFn36SpOabwKchhk9cH1EY VgpmdkznlNwVMkC2B4x1xeMzZbra7A8JkSgvdnZKt/CYtUi7D9ywlxKThCBizoUfEUGG gRrMq6wszm7kop1q5Xykul/+6t1lJUbuTfWmchInPfKt4HXUL3DRrYm4HMMf/qttEttk +s03zkUayQvHh8HfWHUg9ZU9wghMDmn0rT0sNVsw5/v2NUFv0pubECUxL9rXrLq32d07 +kkA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=RI6BKTkMfh9NjM4KTjN1e04RS7UgFLGTZmhcEBLUYDA=; b=zX3+fCj7DzWx/KPM4Tn07+lenLmJ7FLlwktOeyZFUmO+ob/xmy6PFD+fR8JzmsTeUz uYRs29cf3gmdG7TyvLPXuUq1p712ti84hPQ3Jh56pksxC1R6U9bgBG+pKIX0dNpEcdVW ilE01ux1iSUHKctbyyWozR2hBGHNrPFOsKqFvbAlWNya7QXlLr/F3+bmrgeChNBEH6M2 ljHjKrtZl5+7SC9rHEq3konSZveIdGwcVM0BWSpdxoezZMww5e3i29P+s+nloWPYCHaR 7ksN3A984bSmgNWdmdgPGUJMWqzg+9Z44R/uI7eOBaKGjCxI76Guhz8Gl08Zz9VK2bCH YmUg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=Y3xjQJBS; spf=pass (google.com: domain of linux-ext4-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-ext4-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id b14si933807edy.511.2021.02.04.17.52.05; Thu, 04 Feb 2021 17:52:31 -0800 (PST) Received-SPF: pass (google.com: domain of linux-ext4-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=Y3xjQJBS; spf=pass (google.com: domain of linux-ext4-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-ext4-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230436AbhBDXhF (ORCPT + 99 others); Thu, 4 Feb 2021 18:37:05 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59414 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230039AbhBDXg4 (ORCPT ); Thu, 4 Feb 2021 18:36:56 -0500 Received: from mail-pg1-x52e.google.com (mail-pg1-x52e.google.com [IPv6:2607:f8b0:4864:20::52e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A48ADC06178A for ; Thu, 4 Feb 2021 15:36:16 -0800 (PST) Received: by mail-pg1-x52e.google.com with SMTP id b21so3228522pgk.7 for ; Thu, 04 Feb 2021 15:36:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=RI6BKTkMfh9NjM4KTjN1e04RS7UgFLGTZmhcEBLUYDA=; b=Y3xjQJBSqetp/ayigDiW7virAd6ocVyaA1Lx/V5Ez+7iAveAGyCZmP6EXyHXPDcrqD 3jYe4bOsncVoLK4WCvl78cj4y9E2iWa1y/+yhc8u/UF6h4JZ43a9b6K7i8agQ7h3B6Ar sSwm8wjG/vOcis0dVOs4deee5gfgXs6E+np1pp71dhtq4kGecCZCFuXu+yQ6dvV5zaeD D06DRIgqxYdhjW/H3zua3tW+z1fEjkHWqvZpakcSdi3bDbDLznpINFlZXL1+NE6OvtFf 1lQhyu4TdXPENDwTW8JzIuiPRx27xqGaj3YrQXv0QQDNHTkcRNLSq6fHOEmT1qHytwjJ Ywig== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=RI6BKTkMfh9NjM4KTjN1e04RS7UgFLGTZmhcEBLUYDA=; b=NWMHrOFHIPhbyCoQlIkaf+I+og5qSjSCM+usHX6Uq5FcbSmI11WqVorzR7H6gyeeBg ucPxnGUepG/ogZgvFpYefnHmUvDFlpa/mD/SazkaCvyZK61X6GVjJtUORVIrOcmCLYn7 UQFNPJuqKXAnNk/7daXQzSEFIEtCqmBO1A1TlGvi+u3R6fYsl0zpn1H2/6Z/+LWRvZfR H0SU0Fc5XJ6SrxWWUcPYkG6NWkiVkohSbmvSayGN7zDqQPeaRjrqHAqn2GUqii1mi0pW utU5Wn+x67fZdikwJAg7jZ8tfUu4J9mF9JnETuGSGcnfELhE5ymf95wP+obbuUAd8j7w G42A== X-Gm-Message-State: AOAM530zDJP4v6XkIjIsrSc+qrHcf/UEhVuUF4WJATzuq6oC7d9k85pz znk5D+V1Jpj5YpD0ufUhUhOnu87UGso= X-Received: by 2002:a63:1602:: with SMTP id w2mr1483974pgl.128.1612481775835; Thu, 04 Feb 2021 15:36:15 -0800 (PST) Received: from harshads-520.kir.corp.google.com ([2620:15c:17:10:5142:d9c7:4222:def5]) by smtp.googlemail.com with ESMTPSA id mv14sm10236149pjb.0.2021.02.04.15.36.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 04 Feb 2021 15:36:15 -0800 (PST) From: Harshad Shirwadkar X-Google-Original-From: Harshad Shirwadkar To: linux-ext4@vger.kernel.org Cc: tytso@mit.edu, Harshad Shirwadkar Subject: [PATCH 3/3] e2fsck: endianness fixes for fast commit replay Date: Thu, 4 Feb 2021 15:36:01 -0800 Message-Id: <20210204233601.2369470-3-harshads@google.com> X-Mailer: git-send-email 2.30.0.365.g02bc693789-goog In-Reply-To: <20210204233601.2369470-1-harshads@google.com> References: <20210204233601.2369470-1-harshads@google.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org From: Harshad Shirwadkar There are a few places where the endianness conversion wasn't done right. This patch fixes that. Verified that after this patch, j_recover_fast_commit passes on big endian qemu VM. root@debian-powerpc:~/e2fsprogs/tests# make j_recover_fast_commit j_recover_fast_commit: : ok Signed-off-by: Harshad Shirwadkar --- e2fsck/journal.c | 44 ++++++++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/e2fsck/journal.c b/e2fsck/journal.c index 922c252d..2708942a 100644 --- a/e2fsck/journal.c +++ b/e2fsck/journal.c @@ -706,19 +706,19 @@ out: static void ext4_fc_replay_fixup_iblocks(struct ext2_inode_large *ondisk_inode, struct ext2_inode_large *fc_inode) { - if (le32_to_cpu(ondisk_inode->i_flags) & EXT4_EXTENTS_FL) { + if (ondisk_inode->i_flags & EXT4_EXTENTS_FL) { struct ext3_extent_header *eh; eh = (struct ext3_extent_header *)(&ondisk_inode->i_block[0]); - if (eh->eh_magic != EXT3_EXT_MAGIC) { + if (le16_to_cpu(eh->eh_magic) != EXT3_EXT_MAGIC) { memset(eh, 0, sizeof(*eh)); - eh->eh_magic = EXT3_EXT_MAGIC; + eh->eh_magic = cpu_to_le16(EXT3_EXT_MAGIC); eh->eh_max = cpu_to_le16( (sizeof(ondisk_inode->i_block) - sizeof(struct ext3_extent_header)) / - sizeof(struct ext3_extent)); + sizeof(struct ext3_extent)); } - } else if (le32_to_cpu(ondisk_inode->i_flags) & EXT4_INLINE_DATA_FL) { + } else if (ondisk_inode->i_flags & EXT4_INLINE_DATA_FL) { memcpy(ondisk_inode->i_block, fc_inode->i_block, sizeof(fc_inode->i_block)); } @@ -728,34 +728,41 @@ static int ext4_fc_handle_inode(e2fsck_t ctx, struct ext4_fc_tl *tl) { struct e2fsck_fc_replay_state *state = &ctx->fc_replay_state; int ino, inode_len = EXT2_GOOD_OLD_INODE_SIZE; - struct ext2_inode_large *inode = NULL; - struct ext4_fc_inode *fc_inode; + struct ext2_inode_large *inode = NULL, *fc_inode = NULL; + struct ext4_fc_inode *fc_inode_val; errcode_t err; blk64_t blks; - fc_inode = (struct ext4_fc_inode *)ext4_fc_tag_val(tl); - ino = le32_to_cpu(fc_inode->fc_ino); + fc_inode_val = (struct ext4_fc_inode *)ext4_fc_tag_val(tl); + ino = le32_to_cpu(fc_inode_val->fc_ino); if (EXT2_INODE_SIZE(ctx->fs->super) > EXT2_GOOD_OLD_INODE_SIZE) inode_len += ext2fs_le16_to_cpu( - ((struct ext2_inode_large *)fc_inode->fc_raw_inode) + ((struct ext2_inode_large *)fc_inode_val->fc_raw_inode) ->i_extra_isize); err = ext2fs_get_mem(inode_len, &inode); if (err) - return errcode_to_errno(err); + goto out; + err = ext2fs_get_mem(inode_len, &fc_inode); + if (err) + goto out; ext4_fc_flush_extents(ctx, ino); err = ext2fs_read_inode_full(ctx->fs, ino, (struct ext2_inode *)inode, inode_len); if (err) goto out; - memcpy(inode, fc_inode->fc_raw_inode, - offsetof(struct ext2_inode_large, i_block)); - memcpy(&inode->i_generation, - &((struct ext2_inode_large *)(fc_inode->fc_raw_inode))->i_generation, +#ifdef WORDS_BIGENDIAN + ext2fs_swap_inode_full(ctx->fs, fc_inode, + (struct ext2_inode_large *)fc_inode_val->fc_raw_inode, + 0, sizeof(*inode)); +#else + memcpy(fc_inode, fc_inode_val->fc_raw_inode, inode_len); +#endif + memcpy(inode, fc_inode, offsetof(struct ext2_inode_large, i_block)); + memcpy(&inode->i_generation, &fc_inode->i_generation, inode_len - offsetof(struct ext2_inode_large, i_generation)); - ext4_fc_replay_fixup_iblocks(inode, - (struct ext2_inode_large *)fc_inode->fc_raw_inode); + ext4_fc_replay_fixup_iblocks(inode, fc_inode); err = ext2fs_count_blocks(ctx->fs, ino, EXT2_INODE(inode), &blks); if (err) goto out; @@ -774,6 +781,7 @@ static int ext4_fc_handle_inode(e2fsck_t ctx, struct ext4_fc_tl *tl) out: ext2fs_free_mem(&inode); + ext2fs_free_mem(&fc_inode); return errcode_to_errno(err); } @@ -819,7 +827,7 @@ static int ext4_fc_handle_del_range(e2fsck_t ctx, struct ext4_fc_tl *tl) memset(&extent, 0, sizeof(extent)); extent.e_lblk = ext2fs_le32_to_cpu(del_range->fc_lblk); - extent.e_len = ext2fs_le16_to_cpu(del_range->fc_len); + extent.e_len = ext2fs_le32_to_cpu(del_range->fc_len); ret = ext4_fc_read_extents(ctx, ino); if (ret) return ret; -- 2.30.0.365.g02bc693789-goog