From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B17B5FBF6; Thu, 17 Jul 2025 23:41:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752795703; cv=none; b=EJVG1gi3JxzPcrl+FNuDZDwfIVhDVDxwcoxehvhu94gLD7zPPcHTeezvZJBDEME2jhW3eiovHNmOJ7RhAvPJvxVVxklRORSoVUI8a+HlSQFqTKdIbaa8hmX0GUoPBv8sVemrLATgDajTlGEOjtFoP1Sffgeb3rv9+Te4jQLm+WM= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752795703; c=relaxed/simple; bh=xvJmBtiydJ1SKYiHJJXxo+Fus4cS4h+eQU/GQxXfxmA=; h=Date:Subject:From:To:Cc:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=RA2Q+K//qCWM3ktZ+4iewELwSReUKg1IdMLxZ+hwI0KB1gTGMJkJgBOZKYdjGSYa+NDpsCwyENtt1zuDivyv/FjgAGhyrY56XDXQcujJOGSDfT1egk8Xl9qPoo78GZBWumIFJG513bibkEVY/x+HsPj6IpC3gDJEM7GODaC2470= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=UP/fZR9+; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="UP/fZR9+" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2D60CC4CEE3; Thu, 17 Jul 2025 23:41:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1752795703; bh=xvJmBtiydJ1SKYiHJJXxo+Fus4cS4h+eQU/GQxXfxmA=; h=Date:Subject:From:To:Cc:In-Reply-To:References:From; b=UP/fZR9+/SVr5uGk42vEtIsyqzX04prwjAN7D+KbJsn4gZcJE4cSOZmCDXcRRjX0P zSnKTFIuWuY8L0ZkzZ5x22iqYGNsONJbFNkHo5y6fXGyIJXGtoUQftuZ5mm9GH5HbN a5A9EFrZOnNKRn57XHKO4nL1MaU2n5EHNHWk5UyaMNCRgTXYGnasbZ6p3HXzcH7JEg nhvDNg31om0TKX4XjF3WpXDYek93HmMYSvkwHAqFVT3rW8R68qVrE+vcLIknzYBAuh CWq4sg+Oq/x0sW4NG2mbytO6d071R2zhC8xX30Li4nGh8wUGmyBZnnPADF0uoP+EkH VFxBe6or455pA== Date: Thu, 17 Jul 2025 16:41:42 -0700 Subject: [PATCH 09/22] fuse2fs: add extent dump function for debugging From: "Darrick J. Wong" To: tytso@mit.edu Cc: joannelkoong@gmail.com, miklos@szeredi.hu, John@groves.net, linux-fsdevel@vger.kernel.org, bernd@bsbernd.com, linux-ext4@vger.kernel.org, neal@gompa.dev Message-ID: <175279461196.715479.3079978524520560665.stgit@frogsfrogsfrogs> In-Reply-To: <175279460935.715479.15460687085573767955.stgit@frogsfrogsfrogs> References: <175279460935.715479.15460687085573767955.stgit@frogsfrogsfrogs> Precedence: bulk X-Mailing-List: linux-fsdevel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit From: Darrick J. Wong Add a function to dump an inode's extent map for debugging purposes. Signed-off-by: "Darrick J. Wong" --- misc/fuse2fs.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/misc/fuse2fs.c b/misc/fuse2fs.c index 88b71af417c0d7..0137403b7a25b9 100644 --- a/misc/fuse2fs.c +++ b/misc/fuse2fs.c @@ -498,6 +498,74 @@ static int fuse2fs_iomap_enabled(const struct fuse2fs *ff) # define fuse2fs_iomap_enabled(...) (0) #endif +static inline void fuse2fs_dump_extents(struct fuse2fs *ff, ext2_ino_t ino, + struct ext2_inode_large *inode, + const char *why) +{ + ext2_filsys fs = ff->fs; + unsigned int nr = 0; + blk64_t blockcount = 0; + struct ext2_inode_large xinode; + struct ext2fs_extent extent; + ext2_extent_handle_t extents; + int op = EXT2_EXTENT_ROOT; + errcode_t retval; + + if (!inode) { + inode = &xinode; + + retval = fuse2fs_read_inode(fs, ino, inode); + if (retval) { + com_err(__func__, retval, _("reading ino %u"), ino); + return; + } + } + + if (!(inode->i_flags & EXT4_EXTENTS_FL)) + return; + + printf("%s: %s ino=%u isize %llu iblocks %llu\n", __func__, why, ino, + EXT2_I_SIZE(inode), + (ext2fs_get_stat_i_blocks(fs, EXT2_INODE(inode)) * 512) / + fs->blocksize); + fflush(stdout); + + retval = ext2fs_extent_open(fs, ino, &extents); + if (retval) { + com_err(__func__, retval, _("opening extents of ino \"%u\""), + ino); + return; + } + + while ((retval = ext2fs_extent_get(extents, op, &extent)) == 0) { + op = EXT2_EXTENT_NEXT; + + if (extent.e_flags & EXT2_EXTENT_FLAGS_SECOND_VISIT) + continue; + + printf("[%u]: %s ino=%u lblk 0x%llx pblk 0x%llx len 0x%x flags 0x%x\n", + nr++, why, ino, extent.e_lblk, extent.e_pblk, + extent.e_len, extent.e_flags); + fflush(stdout); + if (extent.e_flags & EXT2_EXTENT_FLAGS_LEAF) + blockcount += extent.e_len; + else + blockcount++; + } + if (retval == EXT2_ET_EXTENT_NO_NEXT) + retval = 0; + if (retval) { + com_err(__func__, retval, ("getting extents of ino %u"), + ino); + } + if (inode->i_file_acl) + blockcount++; + printf("%s: %s sum(e_len) %llu\n", __func__, why, blockcount); + fflush(stdout); + + ext2fs_extent_free(extents); +} + static void get_now(struct timespec *now) { #ifdef CLOCK_REALTIME