From patchwork Thu Mar 16 19:32:08 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13178254 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id C4B2BC6FD19 for ; Thu, 16 Mar 2023 19:32:20 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229560AbjCPTcT (ORCPT ); Thu, 16 Mar 2023 15:32:19 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60592 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229716AbjCPTcT (ORCPT ); Thu, 16 Mar 2023 15:32:19 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2A922E500E for ; Thu, 16 Mar 2023 12:32:12 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 83D04B822F3 for ; Thu, 16 Mar 2023 19:32:10 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4226CC433D2; Thu, 16 Mar 2023 19:32:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1678995129; bh=KE4WdxMUWFKmeLNYsL2kE10GM4Wd1aTBlhTHXOAUi9U=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=vIRH0YIo/i/2jkozvRDD/U4xUCbdMxUbDzz0jAyNyZZDRjvXEEajQ08B0t/XCzu0Z Yh7gGRgPmKXwebmHxQQL3j5RP9DNIBqqdC2FlfKC6+APHKbGp9SRpqY6jAfVBnr6vX nBbinnxPCXQQ2NVpuym/zut1TphLY33l7CADkCpwrvtLgHioZxxihGtCTxn98hlufX BZkwPU3h5/TVNfwjKmgfXENRTZO+zc8FxwbuQ00TyetPYbMvahOg3TvOvKPtRGplKf NNR7LCsi4BJr2ztau1d1WOGpd8a1fEt1N7jHWjcGLspvHRlLoiRlNDvxmzBQDWSYY+ v8zDuGTRjwyFw== Date: Thu, 16 Mar 2023 12:32:08 -0700 Subject: [PATCH 1/4] xfs: revert "xfsprogs: Print pptrs in ATTRI items" From: "Darrick J. Wong" To: djwong@kernel.org Cc: allison.henderson@oracle.com, linux-xfs@vger.kernel.org Message-ID: <167899416806.17000.4113016671170150035.stgit@frogsfrogsfrogs> In-Reply-To: <167899416793.17000.8105050564560343480.stgit@frogsfrogsfrogs> References: <167899416793.17000.8105050564560343480.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org From: Darrick J. Wong Parent pointers are stored inside extended attributes, which means that they're a higher level data structure. logprint shouldn't be reporting parent pointers as "ATTRI" items, so let's replace all that with proper helpers that will decode a parent pointer xattri log item. But first, get rid of all this code that adds a bunch of repetitive logic and unnecessary heap allocations. Signed-off-by: Darrick J. Wong --- logprint/log_redo.c | 193 ++++++--------------------------------------------- logprint/logprint.h | 5 + 2 files changed, 26 insertions(+), 172 deletions(-) diff --git a/logprint/log_redo.c b/logprint/log_redo.c index f7e9c9ad9..b596af02c 100644 --- a/logprint/log_redo.c +++ b/logprint/log_redo.c @@ -674,31 +674,6 @@ xfs_attri_copy_log_format( return 1; } -/* iovec length must be 32-bit aligned */ -static inline size_t ATTR_NVEC_SIZE(size_t size) -{ - return round_up(size, sizeof(int32_t)); -} - -static int -xfs_attri_copy_name_format( - char *buf, - uint len, - struct xfs_parent_name_rec *dst_attri_fmt) -{ - uint dst_len = ATTR_NVEC_SIZE(sizeof(struct xfs_parent_name_rec)); - - if (len == dst_len) { - memcpy((char *)dst_attri_fmt, buf, len); - return 0; - } - - fprintf(stderr, _("%s: bad size of attri name format: %u; expected %u\n"), - progname, len, dst_len); - - return 1; -} - int xlog_print_trans_attri( char **ptr, @@ -739,8 +714,7 @@ xlog_print_trans_attri( (*i)++; head = (xlog_op_header_t *)*ptr; xlog_print_op_header(head, *i, ptr); - error = xlog_print_trans_attri_name(ptr, be32_to_cpu(head->oh_len), - src_f->alfi_attr_filter); + error = xlog_print_trans_attri_name(ptr, be32_to_cpu(head->oh_len)); if (error) goto error; } @@ -750,8 +724,7 @@ xlog_print_trans_attri( (*i)++; head = (xlog_op_header_t *)*ptr; xlog_print_op_header(head, *i, ptr); - error = xlog_print_trans_attri_name(ptr, be32_to_cpu(head->oh_len), - src_f->alfi_attr_filter); + error = xlog_print_trans_attri_name(ptr, be32_to_cpu(head->oh_len)); if (error) goto error; } @@ -762,7 +735,7 @@ xlog_print_trans_attri( head = (xlog_op_header_t *)*ptr; xlog_print_op_header(head, *i, ptr); error = xlog_print_trans_attri_value(ptr, be32_to_cpu(head->oh_len), - src_f->alfi_value_len, src_f->alfi_attr_filter); + src_f->alfi_value_len); } error: free(src_f); @@ -773,45 +746,13 @@ xlog_print_trans_attri( int xlog_print_trans_attri_name( char **ptr, - uint src_len, - uint attr_flags) + uint src_len) { - struct xfs_parent_name_rec *src_f = NULL; - uint dst_len; + printf(_("ATTRI: name len:%u\n"), src_len); + print_or_dump(*ptr, src_len); - /* - * If this is not a parent pointer, just do a bin dump - */ - if (!(attr_flags & XFS_ATTR_PARENT)) { - printf(_("ATTRI: name len:%u\n"), src_len); - print_or_dump(*ptr, src_len); - goto out; - } - - dst_len = ATTR_NVEC_SIZE(sizeof(struct xfs_parent_name_rec)); - if (dst_len != src_len) { - fprintf(stderr, _("%s: bad size of attri name format: %u; expected %u\n"), - progname, src_len, dst_len); - return 1; - } - - /* - * memmove to ensure 8-byte alignment for the long longs in - * xfs_parent_name_rec structure - */ - if ((src_f = (struct xfs_parent_name_rec *)malloc(src_len)) == NULL) { - fprintf(stderr, _("%s: xlog_print_trans_attri_name: malloc failed\n"), progname); - exit(1); - } - memmove((char*)src_f, *ptr, src_len); - - printf(_("ATTRI: #p_ino: %llu p_gen: %u, p_diroffset: %u\n"), - be64_to_cpu(src_f->p_ino), be32_to_cpu(src_f->p_gen), - be32_to_cpu(src_f->p_diroffset)); - - free(src_f); -out: *ptr += src_len; + return 0; } /* xlog_print_trans_attri */ @@ -819,32 +760,15 @@ int xlog_print_trans_attri_value( char **ptr, uint src_len, - int value_len, - uint attr_flags) + int value_len) { int len = min(value_len, src_len); - char *f = NULL; - /* - * If this is not a parent pointer, just do a bin dump - */ - if (!(attr_flags & XFS_ATTR_PARENT)) { - printf(_("ATTRI: value len:%u\n"), value_len); - print_or_dump(*ptr, min(len, MAX_ATTR_VAL_PRINT)); - goto out; - } + printf(_("ATTRI: value len:%u\n"), value_len); + print_or_dump(*ptr, len); - if ((f = (char *)malloc(src_len)) == NULL) { - fprintf(stderr, _("%s: xlog_print_trans_attri: malloc failed\n"), progname); - exit(1); - } - - memcpy(f, *ptr, value_len); - printf(_("ATTRI: value: %.*s\n"), value_len, f); - - free(f); -out: *ptr += src_len; + return 0; } /* xlog_print_trans_attri_value */ @@ -855,9 +779,6 @@ xlog_recover_print_attri( struct xfs_attri_log_format *f, *src_f = NULL; uint src_len, dst_len; - struct xfs_parent_name_rec *rec, *src_rec = NULL; - char *value, *src_value = NULL; - int region = 0; src_f = (struct xfs_attri_log_format *)item->ri_buf[0].i_addr; @@ -882,93 +803,27 @@ xlog_recover_print_attri( if (f->alfi_name_len > 0) { region++; - - if (f->alfi_attr_filter & XFS_ATTR_PARENT) { - src_rec = (struct xfs_parent_name_rec *)item->ri_buf[region].i_addr; - src_len = item->ri_buf[region].i_len; - - dst_len = ATTR_NVEC_SIZE(sizeof(struct xfs_parent_name_rec)); - - if ((rec = ((struct xfs_parent_name_rec *)malloc(dst_len))) == NULL) { - fprintf(stderr, _("%s: xlog_recover_print_attri: malloc failed\n"), - progname); - exit(1); - } - if (xfs_attri_copy_name_format((char *)src_rec, src_len, rec)) { - goto out; - } - - printf(_("ATTRI: #inode: %llu gen: %u, offset: %u\n"), - be64_to_cpu(rec->p_ino), be32_to_cpu(rec->p_gen), - be32_to_cpu(rec->p_diroffset)); - - free(rec); - } - else { - printf(_("ATTRI: name len:%u\n"), f->alfi_name_len); - print_or_dump((char *)item->ri_buf[region].i_addr, - f->alfi_name_len); - } + printf(_("ATTRI: name len:%u\n"), f->alfi_name_len); + print_or_dump((char *)item->ri_buf[region].i_addr, + f->alfi_name_len); } if (f->alfi_nname_len > 0) { region++; - - if (f->alfi_attr_filter & XFS_ATTR_PARENT) { - src_rec = (struct xfs_parent_name_rec *)item->ri_buf[region].i_addr; - src_len = item->ri_buf[region].i_len; - - dst_len = ATTR_NVEC_SIZE(sizeof(struct xfs_parent_name_rec)); - - if ((rec = ((struct xfs_parent_name_rec *)malloc(dst_len))) == NULL) { - fprintf(stderr, _("%s: xlog_recover_print_attri: malloc failed\n"), - progname); - exit(1); - } - if (xfs_attri_copy_name_format((char *)src_rec, src_len, rec)) { - goto out; - } - - printf(_("ATTRI: new #inode: %llu gen: %u, offset: %u\n"), - be64_to_cpu(rec->p_ino), be32_to_cpu(rec->p_gen), - be32_to_cpu(rec->p_diroffset)); - - free(rec); - } - else { - printf(_("ATTRI: nname len:%u\n"), f->alfi_nname_len); - print_or_dump((char *)item->ri_buf[region].i_addr, - f->alfi_nname_len); - } + printf(_("ATTRI: nname len:%u\n"), f->alfi_nname_len); + print_or_dump((char *)item->ri_buf[region].i_addr, + f->alfi_nname_len); } if (f->alfi_value_len > 0) { + int len = f->alfi_value_len; + + if (len > MAX_ATTR_VAL_PRINT) + len = MAX_ATTR_VAL_PRINT; + region++; - - if (f->alfi_attr_filter & XFS_ATTR_PARENT) { - src_value = (char *)item->ri_buf[region].i_addr; - - if ((value = ((char *)malloc(f->alfi_value_len))) == NULL) { - fprintf(stderr, _("%s: xlog_recover_print_attri: malloc failed\n"), - progname); - exit(1); - } - - memcpy((char *)value, (char *)src_value, f->alfi_value_len); - printf("ATTRI: value: %.*s\n", f->alfi_value_len, value); - - free(value); - } - else { - int len = f->alfi_value_len; - - if (len > MAX_ATTR_VAL_PRINT) - len = MAX_ATTR_VAL_PRINT; - - printf(_("ATTRI: value len:%u\n"), f->alfi_value_len); - print_or_dump((char *)item->ri_buf[region].i_addr, - len); - } + printf(_("ATTRI: value len:%u\n"), f->alfi_value_len); + print_or_dump((char *)item->ri_buf[region].i_addr, len); } out: diff --git a/logprint/logprint.h b/logprint/logprint.h index b8e1c9328..b4479c240 100644 --- a/logprint/logprint.h +++ b/logprint/logprint.h @@ -59,9 +59,8 @@ extern void xlog_recover_print_bud(struct xlog_recover_item *item); #define MAX_ATTR_VAL_PRINT 128 extern int xlog_print_trans_attri(char **ptr, uint src_len, int *i); -extern int xlog_print_trans_attri_name(char **ptr, uint src_len, uint attr_flags); -extern int xlog_print_trans_attri_value(char **ptr, uint src_len, int value_len, - uint attr_flags); +extern int xlog_print_trans_attri_name(char **ptr, uint src_len); +extern int xlog_print_trans_attri_value(char **ptr, uint src_len, int value_len); extern void xlog_recover_print_attri(struct xlog_recover_item *item); extern int xlog_print_trans_attrd(char **ptr, uint len); extern void xlog_recover_print_attrd(struct xlog_recover_item *item); From patchwork Thu Mar 16 19:32:24 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13178255 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id AE690C6FD1F for ; Thu, 16 Mar 2023 19:32:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229705AbjCPTch (ORCPT ); Thu, 16 Mar 2023 15:32:37 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60966 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230027AbjCPTch (ORCPT ); Thu, 16 Mar 2023 15:32:37 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [145.40.68.75]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 69E62E5012 for ; Thu, 16 Mar 2023 12:32:27 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 16E1CB82282 for ; Thu, 16 Mar 2023 19:32:26 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id CA597C433EF; Thu, 16 Mar 2023 19:32:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1678995144; bh=mlTRfPKMHv/Zsb/KsydfPf27LtQyM8AFNP3ijxLHc7U=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=hV7XMIGeiIUmdNB1s31xaQh8IHxZ5BJ6apNgXD+51+3fXNSX4Vp4KYGv2aWB0SQ74 v8lUluDuRN54qjwL260VJpAlC2zzjlz45CP2WLVX+Bbd53IvsjSwt7CY+opVJLZIxc 0Yj9ay3EPxzpGImeUPXQFdIWy6VVJgLb9lYQ51EdS+EMduqGqlZYFhT9zSG6Arm2BX UVSoP3gk217W1QBGxRhIF1pc1lv7LK4GmuKZTk2RY+RCzhhczaPS86gw5aoaJP/9bA xFz7pG5uI7JTajUgjt36eUFcC1f5DRqk4r9JlAe6Ji8KgLwvZn+GbQjTobfDngQV/P iImNYbXw1IHHw== Date: Thu, 16 Mar 2023 12:32:24 -0700 Subject: [PATCH 2/4] xfs_logprint: print missing attri header fields From: "Darrick J. Wong" To: djwong@kernel.org Cc: allison.henderson@oracle.com, linux-xfs@vger.kernel.org Message-ID: <167899416819.17000.15788664674920600947.stgit@frogsfrogsfrogs> In-Reply-To: <167899416793.17000.8105050564560343480.stgit@frogsfrogsfrogs> References: <167899416793.17000.8105050564560343480.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org From: Darrick J. Wong Not sure why logprint doesn't print the op flags, inode, or attr filter fields. Make it do that. Signed-off-by: Darrick J. Wong --- logprint/log_redo.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/logprint/log_redo.c b/logprint/log_redo.c index b596af02c..a90abc2d8 100644 --- a/logprint/log_redo.c +++ b/logprint/log_redo.c @@ -705,9 +705,15 @@ xlog_print_trans_attri( memmove((char*)src_f, *ptr, src_len); *ptr += src_len; - printf(_("ATTRI: #regs: %d name_len: %d, nname_len: %d value_len: %d id: 0x%llx\n"), - src_f->alfi_size, src_f->alfi_name_len, src_f->alfi_nname_len, - src_f->alfi_value_len, (unsigned long long)src_f->alfi_id); + printf(_("ATTRI: #regs: %d f: 0x%x, ino: 0x%llx, attr_filter: 0x%x, name_len: %d, newname_len: %d, value_len: %d id: 0x%llx\n"), + src_f->alfi_size, + src_f->alfi_op_flags, + (unsigned long long)src_f->alfi_ino, + src_f->alfi_attr_filter, + src_f->alfi_name_len, + src_f->alfi_nname_len, + src_f->alfi_value_len, + (unsigned long long)src_f->alfi_id); if (src_f->alfi_name_len > 0) { printf(_("\n")); @@ -798,8 +804,15 @@ xlog_recover_print_attri( if (xfs_attri_copy_log_format((char*)src_f, src_len, f)) goto out; - printf(_("ATTRI: #regs: %d name_len: %d, nname_len:%d, value_len: %d id: 0x%llx\n"), - f->alfi_size, f->alfi_name_len, f->alfi_nname_len, f->alfi_value_len, (unsigned long long)f->alfi_id); + printf(_("ATTRI: #regs: %d f: 0x%x, ino: 0x%llx, attr_filter: 0x%x, name_len: %d, newname_len:%d, value_len: %d id: 0x%llx\n"), + f->alfi_size, + f->alfi_op_flags, + (unsigned long long)f->alfi_ino, + f->alfi_attr_filter, + f->alfi_name_len, + f->alfi_nname_len, + f->alfi_value_len, + (unsigned long long)f->alfi_id); if (f->alfi_name_len > 0) { region++; From patchwork Thu Mar 16 19:32:40 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13178256 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9F845C6FD1F for ; Thu, 16 Mar 2023 19:32:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229826AbjCPTcp (ORCPT ); Thu, 16 Mar 2023 15:32:45 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:32932 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230167AbjCPTco (ORCPT ); Thu, 16 Mar 2023 15:32:44 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 724EEDCA56 for ; Thu, 16 Mar 2023 12:32:41 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 07C1A620FD for ; Thu, 16 Mar 2023 19:32:41 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 61C21C433D2; Thu, 16 Mar 2023 19:32:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1678995160; bh=PPFpq2UuGqY65EWq2TO4ayWCGW1uu3jd9gUCGmqCH1U=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=lsc/ReRW06Epq1WhfMv/Mdcic5PRvoJKuQAUkTT9yG5TKri3P/2cUpnR3IHiY7ao8 L6Cy8aZBZY0fI3qar+VVkkFJVwTKBrtwP4C8HOOjW7vBwKtXiuw0ytcOQRm14LBPTD MEYpW+ZlcR+rKgThJGxnRQvt6ft9khuEp2EUajDEh755cP46Ov4DdJF8M1IQhc2lZ+ 642FeKLeiarr/LmPySj0anUHGqUAdKLKTh6ljDuXoVotXtlBegiYlXR95S8GmgnfYP 7xZstswAbgwQvzqwsp//sot5S3RYtIvaX5vCyLGtxGwgMQPXu02N/srJenQ0PyeASp MVDw/tpzTnNAQ== Date: Thu, 16 Mar 2023 12:32:40 -0700 Subject: [PATCH 3/4] xfs: make logprint note attr names and newnames consistently From: "Darrick J. Wong" To: djwong@kernel.org Cc: allison.henderson@oracle.com, linux-xfs@vger.kernel.org Message-ID: <167899416832.17000.18438320386846754812.stgit@frogsfrogsfrogs> In-Reply-To: <167899416793.17000.8105050564560343480.stgit@frogsfrogsfrogs> References: <167899416793.17000.8105050564560343480.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org From: Darrick J. Wong Fix logprint to print "ATTRI: name" and "ATTRI: newname" consistently. Signed-off-by: Darrick J. Wong --- logprint/log_redo.c | 15 +++++++++------ logprint/logprint.h | 2 +- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/logprint/log_redo.c b/logprint/log_redo.c index a90abc2d8..f0d64ae9f 100644 --- a/logprint/log_redo.c +++ b/logprint/log_redo.c @@ -720,7 +720,8 @@ xlog_print_trans_attri( (*i)++; head = (xlog_op_header_t *)*ptr; xlog_print_op_header(head, *i, ptr); - error = xlog_print_trans_attri_name(ptr, be32_to_cpu(head->oh_len)); + error = xlog_print_trans_attri_name(ptr, + be32_to_cpu(head->oh_len), "name"); if (error) goto error; } @@ -730,7 +731,8 @@ xlog_print_trans_attri( (*i)++; head = (xlog_op_header_t *)*ptr; xlog_print_op_header(head, *i, ptr); - error = xlog_print_trans_attri_name(ptr, be32_to_cpu(head->oh_len)); + error = xlog_print_trans_attri_name(ptr, + be32_to_cpu(head->oh_len), "newname"); if (error) goto error; } @@ -752,15 +754,16 @@ xlog_print_trans_attri( int xlog_print_trans_attri_name( char **ptr, - uint src_len) + uint src_len, + const char *tag) { - printf(_("ATTRI: name len:%u\n"), src_len); + printf(_("ATTRI: %s len:%u\n"), tag, src_len); print_or_dump(*ptr, src_len); *ptr += src_len; return 0; -} /* xlog_print_trans_attri */ +} int xlog_print_trans_attri_value( @@ -823,7 +826,7 @@ xlog_recover_print_attri( if (f->alfi_nname_len > 0) { region++; - printf(_("ATTRI: nname len:%u\n"), f->alfi_nname_len); + printf(_("ATTRI: newname len:%u\n"), f->alfi_nname_len); print_or_dump((char *)item->ri_buf[region].i_addr, f->alfi_nname_len); } diff --git a/logprint/logprint.h b/logprint/logprint.h index b4479c240..067226ffb 100644 --- a/logprint/logprint.h +++ b/logprint/logprint.h @@ -59,7 +59,7 @@ extern void xlog_recover_print_bud(struct xlog_recover_item *item); #define MAX_ATTR_VAL_PRINT 128 extern int xlog_print_trans_attri(char **ptr, uint src_len, int *i); -extern int xlog_print_trans_attri_name(char **ptr, uint src_len); +extern int xlog_print_trans_attri_name(char **ptr, uint src_len, const char *tag); extern int xlog_print_trans_attri_value(char **ptr, uint src_len, int value_len); extern void xlog_recover_print_attri(struct xlog_recover_item *item); extern int xlog_print_trans_attrd(char **ptr, uint len); From patchwork Thu Mar 16 19:32:55 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 13178257 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 80A29C6FD19 for ; Thu, 16 Mar 2023 19:33:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230027AbjCPTdB (ORCPT ); Thu, 16 Mar 2023 15:33:01 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33236 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229716AbjCPTdA (ORCPT ); Thu, 16 Mar 2023 15:33:00 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 84DB4BBB3 for ; Thu, 16 Mar 2023 12:32:58 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 42EC3B82302 for ; Thu, 16 Mar 2023 19:32:57 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 02666C433D2; Thu, 16 Mar 2023 19:32:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1678995176; bh=NXlNBHHXCTZrFmhgAh0gm84lgmN9Klu/XJQlcq6jFYU=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=rgBzo6+efP+F5okjqMLSNJDLvWYvuQiOJC0xMc5xfnqtUVTCySoi7cmUaBaV3LPx1 p2AEeTPOJW0H/MOmjTTS6QnQJxdcNWmF7jUGqZfmhrgsZoY7ko2J7LrWKZJp4YpMpy rMxvmrQCEoUAJ5fKTm/rhKuHGhf3Pgn/7hQDDOJnmB3nKvB/be1DecJFqReIC5W25Q Ep+W++3RIG/g4Fd90puz/994houTlQnbkfojBV1sKSEp1p2CSdokM41edq0tMgjRix rSmreOsoIoljORoLE4CftPGXMAuIOz9tjs5qicu1MSFnnJcrYCwmLI0zmnR1rajXa4 V+pV2QYty44FA== Date: Thu, 16 Mar 2023 12:32:55 -0700 Subject: [PATCH 4/4] xfs_logprint: decode parent pointers fully From: "Darrick J. Wong" To: djwong@kernel.org Cc: allison.henderson@oracle.com, linux-xfs@vger.kernel.org Message-ID: <167899416845.17000.1149289596796145954.stgit@frogsfrogsfrogs> In-Reply-To: <167899416793.17000.8105050564560343480.stgit@frogsfrogsfrogs> References: <167899416793.17000.8105050564560343480.stgit@frogsfrogsfrogs> User-Agent: StGit/0.19 MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org From: Darrick J. Wong Decode logged parent pointers fully when dumping log contents. Between the existing ATTRI: printouts and the new ones introduced here, we can figure out what was stored in each log iovec, as well as the higher level parent pointer that was logged. Signed-off-by: Darrick J. Wong --- libxfs/libxfs_api_defs.h | 1 + logprint/log_redo.c | 63 +++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/libxfs/libxfs_api_defs.h b/libxfs/libxfs_api_defs.h index 60d3339a7..092934935 100644 --- a/libxfs/libxfs_api_defs.h +++ b/libxfs/libxfs_api_defs.h @@ -141,6 +141,7 @@ #define xfs_mode_to_ftype libxfs_mode_to_ftype #define xfs_parent_add libxfs_parent_add #define xfs_parent_finish libxfs_parent_finish +#define xfs_parent_irec_from_disk libxfs_parent_irec_from_disk #define xfs_parent_start libxfs_parent_start #define xfs_perag_get libxfs_perag_get #define xfs_perag_put libxfs_perag_put diff --git a/logprint/log_redo.c b/logprint/log_redo.c index f0d64ae9f..0f4891436 100644 --- a/logprint/log_redo.c +++ b/logprint/log_redo.c @@ -674,6 +674,46 @@ xfs_attri_copy_log_format( return 1; } +static void +dump_pptr( + const char *tag, + const void *name_ptr, + unsigned int name_len, + const void *value_ptr, + unsigned int value_len) +{ + struct xfs_parent_name_irec irec; + + libxfs_parent_irec_from_disk(&irec, name_ptr, value_ptr, value_len); + + printf("PPTR: %s attr_namelen %u attr_valuelen %u\n", tag, name_len, value_len); + printf("PPTR: %s parent_ino %llu parent_gen %u diroffset %u namelen %u name '%.*s'\n", + tag, (unsigned long long)irec.p_ino, irec.p_gen, + irec.p_diroffset, + irec.p_namelen, irec.p_namelen, irec.p_name); +} + +static void +dump_pptr_update( + const void *name_ptr, + unsigned int name_len, + const void *newname_ptr, + unsigned int newname_len, + const void *value_ptr, + unsigned int value_len) +{ + if (newname_ptr && name_ptr) { + dump_pptr("OLDNAME", name_ptr, name_len, value_ptr, value_len); + dump_pptr("NEWNAME", newname_ptr, newname_len, "", 0); + return; + } + + if (name_ptr) + dump_pptr("NAME", name_ptr, name_len, value_ptr, value_len); + if (newname_ptr) + dump_pptr("NNAME", newname_ptr, newname_len, NULL, 0); +} + int xlog_print_trans_attri( char **ptr, @@ -682,6 +722,8 @@ xlog_print_trans_attri( { struct xfs_attri_log_format *src_f = NULL; xlog_op_header_t *head = NULL; + void *name_ptr = NULL, *newname_ptr = NULL; + void *value_ptr = NULL; uint dst_len; int error = 0; @@ -720,6 +762,7 @@ xlog_print_trans_attri( (*i)++; head = (xlog_op_header_t *)*ptr; xlog_print_op_header(head, *i, ptr); + name_ptr = *ptr; error = xlog_print_trans_attri_name(ptr, be32_to_cpu(head->oh_len), "name"); if (error) @@ -731,6 +774,7 @@ xlog_print_trans_attri( (*i)++; head = (xlog_op_header_t *)*ptr; xlog_print_op_header(head, *i, ptr); + newname_ptr = *ptr; error = xlog_print_trans_attri_name(ptr, be32_to_cpu(head->oh_len), "newname"); if (error) @@ -742,9 +786,17 @@ xlog_print_trans_attri( (*i)++; head = (xlog_op_header_t *)*ptr; xlog_print_op_header(head, *i, ptr); + value_ptr = *ptr; error = xlog_print_trans_attri_value(ptr, be32_to_cpu(head->oh_len), src_f->alfi_value_len); + if (error) + goto error; } + + if (src_f->alfi_attr_filter & XFS_ATTR_PARENT) + dump_pptr_update(name_ptr, src_f->alfi_name_len, + newname_ptr, src_f->alfi_nname_len, + value_ptr, src_f->alfi_value_len); error: free(src_f); @@ -787,7 +839,8 @@ xlog_recover_print_attri( { struct xfs_attri_log_format *f, *src_f = NULL; uint src_len, dst_len; - + void *name_ptr = NULL, *newname_ptr = NULL; + void *value_ptr = NULL; int region = 0; src_f = (struct xfs_attri_log_format *)item->ri_buf[0].i_addr; @@ -822,6 +875,7 @@ xlog_recover_print_attri( printf(_("ATTRI: name len:%u\n"), f->alfi_name_len); print_or_dump((char *)item->ri_buf[region].i_addr, f->alfi_name_len); + name_ptr = item->ri_buf[region].i_addr; } if (f->alfi_nname_len > 0) { @@ -829,6 +883,7 @@ xlog_recover_print_attri( printf(_("ATTRI: newname len:%u\n"), f->alfi_nname_len); print_or_dump((char *)item->ri_buf[region].i_addr, f->alfi_nname_len); + newname_ptr = item->ri_buf[region].i_addr; } if (f->alfi_value_len > 0) { @@ -840,8 +895,14 @@ xlog_recover_print_attri( region++; printf(_("ATTRI: value len:%u\n"), f->alfi_value_len); print_or_dump((char *)item->ri_buf[region].i_addr, len); + value_ptr = item->ri_buf[region].i_addr; } + if (src_f->alfi_attr_filter & XFS_ATTR_PARENT) + dump_pptr_update(name_ptr, src_f->alfi_name_len, + newname_ptr, src_f->alfi_nname_len, + value_ptr, src_f->alfi_value_len); + out: free(f);