From patchwork Sun Jan 31 14:21:38 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Aneesh Kumar K.V" X-Patchwork-Id: 75976 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter.kernel.org (8.14.3/8.14.3) with ESMTP id o0VEMA0n002211 for ; Sun, 31 Jan 2010 14:22:10 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753823Ab0AaOWH (ORCPT ); Sun, 31 Jan 2010 09:22:07 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1753835Ab0AaOWF (ORCPT ); Sun, 31 Jan 2010 09:22:05 -0500 Received: from e23smtp03.au.ibm.com ([202.81.31.145]:48081 "EHLO e23smtp03.au.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753823Ab0AaOWB (ORCPT ); Sun, 31 Jan 2010 09:22:01 -0500 Received: from d23relay05.au.ibm.com (d23relay05.au.ibm.com [202.81.31.247]) by e23smtp03.au.ibm.com (8.14.3/8.13.1) with ESMTP id o0VEJ2tH006705 for ; Mon, 1 Feb 2010 01:19:02 +1100 Received: from d23av04.au.ibm.com (d23av04.au.ibm.com [9.190.235.139]) by d23relay05.au.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id o0VEH1eg1409236 for ; Mon, 1 Feb 2010 01:17:01 +1100 Received: from d23av04.au.ibm.com (loopback [127.0.0.1]) by d23av04.au.ibm.com (8.14.3/8.13.1/NCO v10.0 AVout) with ESMTP id o0VELxJh001521 for ; Mon, 1 Feb 2010 01:22:00 +1100 Received: from localhost.localdomain ([9.124.223.121]) by d23av04.au.ibm.com (8.14.3/8.13.1/NCO v10.0 AVin) with ESMTP id o0VELpmj001433; Mon, 1 Feb 2010 01:21:58 +1100 From: "Aneesh Kumar K.V" To: chris.mason@oracle.com Cc: linux-btrfs@vger.kernel.org, "Aneesh Kumar K.V" Subject: [PATCH 4/4] debug-btrfs: Add print_inode command Date: Sun, 31 Jan 2010 19:51:38 +0530 Message-Id: <1264947698-32371-5-git-send-email-aneesh.kumar@linux.vnet.ibm.com> X-Mailer: git-send-email 1.7.0.rc0.48.gdace5 In-Reply-To: <1264947698-32371-1-git-send-email-aneesh.kumar@linux.vnet.ibm.com> References: <1264947698-32371-1-git-send-email-aneesh.kumar@linux.vnet.ibm.com> Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter.kernel.org [140.211.167.41]); Sun, 31 Jan 2010 14:22:10 +0000 (UTC) diff --git a/debugbtrfs/cmds.c b/debugbtrfs/cmds.c index cd2901b..be7da31 100644 --- a/debugbtrfs/cmds.c +++ b/debugbtrfs/cmds.c @@ -23,6 +23,8 @@ #include "ctree.h" #include "disk-io.h" +#include "extent_io.h" +#include "transaction.h" #include "debug_btrfs.h" void do_show_debugfs_params(int argc, char *argv[]) @@ -48,3 +50,101 @@ void do_open_filesys(int argc, char *argv[]) return; } } + +void dump_inode_details(u64 ino, struct extent_buffer *leaf, + struct btrfs_inode_item *inode_item) +{ + char *format_space = " "; + printf("Inode: %10llu", (unsigned long long)ino); + printf("%sMode: %5o", format_space, + btrfs_inode_mode(leaf, inode_item) & 0777); + printf("%sUser: %d\n", format_space, btrfs_inode_uid(leaf, inode_item)); + printf("Size: %llu\n", (unsigned long long) + btrfs_inode_size(leaf, inode_item)); + return; +} + +void dump_file_extent(u64 offset, struct extent_buffer *leaf, + struct btrfs_file_extent_item *file_extent_item) +{ + printf("[%15llu - %15llu (%15llu)]\t->\t", (unsigned long long) offset, + (unsigned long long) + offset + btrfs_file_extent_num_bytes(leaf, file_extent_item), + btrfs_file_extent_num_bytes(leaf, file_extent_item)); + + printf("%15llu (%15llu)\n", (unsigned long long) + btrfs_file_extent_disk_bytenr(leaf, file_extent_item), + btrfs_file_extent_disk_num_bytes(leaf, file_extent_item)); + return ; +} + +void dump_file_hole_extent(u64 offset, u64 end_offset) +{ + printf("[%15llu - %15llu (%15llu)]\t->\t", (unsigned long long) offset, + (unsigned long long) end_offset, end_offset - offset); + printf("Hole\n"); +} + +void do_print_inode(int argc, char *argv[]) +{ + int ret; + u64 offset, inode_i_size; + struct btrfs_path *path; + struct btrfs_key inode_key; + struct extent_buffer *leaf; + struct btrfs_trans_handle *trans; + struct btrfs_inode_item *inode_item; + struct btrfs_file_extent_item *file_extent_item; + + + if (argc != 2) { + fprintf(stderr, "Usage inode inode_num\n"); + return; + } + inode_key.objectid = atoll(argv[1]); + inode_key.type = BTRFS_INODE_ITEM_KEY; + inode_key.offset = 0; + + path = btrfs_alloc_path(); + btrfs_init_path(path); + trans = btrfs_start_transaction(current_fs_root, 1); + + ret = btrfs_search_slot(trans, current_fs_root, &inode_key, path, 0, 0); + if (ret != 0) { + fprintf(stderr, "Failed get the inode details for %llu\n", + (unsigned long long)inode_key.objectid); + return; + } + leaf = path->nodes[0]; + inode_item = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_inode_item); + dump_inode_details(inode_key.objectid, leaf, inode_item); + inode_i_size = btrfs_inode_size(leaf, inode_item); + btrfs_release_path(current_fs_root, path); + + /* get the file extent details */ + offset = 0; + /* Dump header */ + printf("Extent details:\n"); + printf("[%15s - %15s (%15s)]\t->\t%15s (%15s)\n", + "Logical offset", + "End offset", + "Extent Size", + "Disk bytenr", + "Actual disk size"); + while (offset < inode_i_size) { + btrfs_init_path(path); + ret = btrfs_lookup_file_extent(trans, current_fs_root, path, + inode_key.objectid, offset, 0); + if (ret != 0) { + fprintf(stderr, "Not able to retrive extent information\n"); + break; + } + leaf = path->nodes[0]; + file_extent_item = btrfs_item_ptr(leaf, path->slots[0], + struct btrfs_file_extent_item); + dump_file_extent(offset, leaf, file_extent_item); + offset += btrfs_file_extent_num_bytes(leaf, file_extent_item); + btrfs_release_path(current_fs_root, path); + } + btrfs_commit_transaction(trans, current_fs_root); +} diff --git a/debugbtrfs/debug_btrfs_cmds.ct b/debugbtrfs/debug_btrfs_cmds.ct index a46dbde..98a7282 100644 --- a/debugbtrfs/debug_btrfs_cmds.ct +++ b/debugbtrfs/debug_btrfs_cmds.ct @@ -32,5 +32,8 @@ request do_dump_root_tree, "Show root tree", request do_dump_chunk_tree, "Show btrfs chunk tree", dump_chunk_tree; +request do_print_inode, "Print inode details", + print_inode; + end;