From patchwork Tue Feb 20 09:59:49 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Viktor Prutyanov X-Patchwork-Id: 875458 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-ext4-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="OtZzzOtZ"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zlx243hw3z9s0b for ; Tue, 20 Feb 2018 21:00:28 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751168AbeBTKAZ (ORCPT ); Tue, 20 Feb 2018 05:00:25 -0500 Received: from mail-he1eur01on0116.outbound.protection.outlook.com ([104.47.0.116]:10020 "EHLO EUR01-HE1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751432AbeBTKAV (ORCPT ); Tue, 20 Feb 2018 05:00:21 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=OmcHomexrLK/J/WoUkv7hgYzDWXGIBJEjuSi3w3WtPY=; b=OtZzzOtZyx4JTr2MqTucwfUslvMvCgy1Mae4i/zlCH5Z2VTgHbZJlRRvpwmFLiLy0f9HiNrQ1ZWXtkREkBKStZl1kI8Gjm1o+N2G1tHT5RrzCdVt6zcKTTCCxdPkv4+zM4PXHaEVjCQ5fU7W1gW8XZ3qmpzqFtCa33OTb9a+8Tw= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=viktor.prutyanov@virtuozzo.com; Received: from vprutyanov-pc.sw.ru (195.214.232.6) by AM4PR08MB2849.eurprd08.prod.outlook.com (2603:10a6:205:d::31) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.506.18; Tue, 20 Feb 2018 10:00:09 +0000 From: Viktor Prutyanov To: linux-ext4@vger.kernel.org Cc: Theodore Ts'o , Dmitry Monakhov , Viktor Prutyanov Subject: [PATCH v3 4/5] dumpe2fs: add JSON output of journal Date: Tue, 20 Feb 2018 12:59:49 +0300 Message-Id: <20180220095950.23462-5-viktor.prutyanov@virtuozzo.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20180220095950.23462-1-viktor.prutyanov@virtuozzo.com> References: <20180220095950.23462-1-viktor.prutyanov@virtuozzo.com> MIME-Version: 1.0 X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HE1PR0902CA0058.eurprd09.prod.outlook.com (2603:10a6:7:15::47) To AM4PR08MB2849.eurprd08.prod.outlook.com (2603:10a6:205:d::31) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: c5530abc-c880-407b-3f2a-08d57848ba6d X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(5600026)(4604075)(4534165)(7168020)(4627221)(201703031133081)(201702281549075)(2017052603307)(7153060)(7193020); SRVR:AM4PR08MB2849; X-Microsoft-Exchange-Diagnostics: 1; AM4PR08MB2849; 3:BSX9kvBXPT73tXwquAOaUydyrhoV0Yf7AShRs82TT+4rlwjKOT9mkRrVzSuOFNeIcsv5smd+cnw7cO/s19wGHGI5jpqUSYvJ4+rB4+Lf6AwCkit7/+ZzBC3BomF7pmUeAP99IV9rNyXsM8UGakznLbYATr2DS1rR8SOK3fiX6gwTuxUGd6gLIA7nflhTqN5JuvUFptCgt0VfIfhx1OxBsDVnmBcn0SlLpVXEsJShqHlMfZhCv+sFdrChXKfp+6DA; 25:YTOjl3kaL2JvoRnFYPHE7YR8QPuGD3mHscbLNgUzSCRArg64kzBvlqoiOMATeYNtSGYxxrBP2C6ttkrLhoQFQq6MvHRUkbDjYVDq+Wp9zp9bCcOw170qYWafCHv/Vn2QLSl3SDxUrf2C1wFJRRN6K0Bcb5IUiSqkLdXVS7cfUa4DZhWuNSg7IFVjvcSdP3wjZwdUhrD+YqUUShxg6YHwwlNq/7mPFlC6KMhaZw+6Gs4lGvhLuzlwmUZlM6T/SiMWA8wwEuVlxCNKfinvBPkjAugOaTNgzYoautUgBTF4s5uLleaI6Hq775H24WRyqKvOP6u10p2egYUNvj+NctDqgA==; 31:bSglSo5jbBLiOprGi6jRdinOauCYzNyQN7NnBc98bxwbwOW6tB1e5rzYZ/8F9U2VOBL3ow64QjUkWegz0HwEzyahn9HxN8y+K7wlohnRnAEE0huBwq+uBZwPUqUB9I+f1Je1x5H+QEh27DB3pVsciY8MroIxLE7c93EoiZjqEkklMdAWU3Syx3g4MJS3X6jXNrA38/U5zoWWe9ANHYpqTB8C5gMbZ9nGZQqZd+Zdrbg= X-MS-TrafficTypeDiagnostic: AM4PR08MB2849: X-Microsoft-Exchange-Diagnostics: 1; AM4PR08MB2849; 20:mn7YNbJJkY2GjR519C2x+iHWeF29DdFsvGDsr3M/K2NUFWNiYNG7Hg6DTymse8bkcAXLROpYT7xapLS0BrarvFdRuWK4vGXBB/0zkmbIMDA2svliHGYbVXZIYgZyLHDyPsuuKax3dlNj9xCgeoZax2f+uhWiva3Ub88+q/JUXeCa4jpRNxoPttLVVXUa56i6Olf7wd9AaGTymcudC5J31H/F689EOq5Im72hx9t69kWUja48jHaWo/5EHc7cof9ofaVyCAlQDbnZrSeN3M+MHdQjFH1rfp8V5tgl4c2NNpe2uzFNOi6kkp1QRGq6vQkERio/RsQT5e43RuTfDNrINgKEnCP21BO7ocsprq1J7ZbVQKbE3eiMAYm8zjhEPThSllYTusn7v6jz6y0V7GPQpo6ktJ6nsqKe32zVcHrKjFt4lih8F52B4xmjn+KLCiUePvn5da9S3BSB9WSgE09dGypVQQxujLFEeZVW36CfKRHA2h2PBYYq6QK3SSKYxJmF; 4:VXFjsR6d16hV51wTM+sYVoBGCbQgpETtfqwSTCJEmRnFTAxvQFqx441RNMm4WnhsmMlYzi/LT0AM33YE9f3zqCWdwc0y4ADXy4v1CNAi6osTLwALOetDg1bIp/hKEkME3i6ivgV9bchmYapKS4w+9F6iD4h5gn3LMU6C9XvyzDREbwdZk4dVYBB3AxS4kjP/hwsUU9rcostSnrrh3qC+Nd0835dJJm13z1unTjBbO0acTmswdctZ92m7iHhy0SjokltrN1NtpMqsxrrFUn4OXQ== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040501)(2401047)(8121501046)(5005006)(3231101)(944501161)(93006095)(93001095)(10201501046)(3002001)(6041288)(20161123560045)(20161123564045)(20161123558120)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123562045)(6072148)(201708071742011); SRVR:AM4PR08MB2849; BCL:0; PCL:0; RULEID:; SRVR:AM4PR08MB2849; X-Forefront-PRVS: 05891FB07F X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(39850400004)(366004)(396003)(39380400002)(346002)(376002)(199004)(189003)(52116002)(16586007)(478600001)(54906003)(59450400001)(5660300001)(1076002)(68736007)(6666003)(51416003)(107886003)(69596002)(50466002)(86362001)(48376002)(8676002)(16526019)(186003)(76176011)(6116002)(55236004)(2950100002)(6916009)(26005)(3846002)(316002)(2906002)(386003)(81156014)(6506007)(81166006)(7736002)(97736004)(53416004)(8936002)(6486002)(305945005)(36756003)(50226002)(53936002)(66066001)(6512007)(47776003)(25786009)(2351001)(105586002)(4326008)(106356001)(2361001)(16060500001); DIR:OUT; SFP:1102; SCL:1; SRVR:AM4PR08MB2849; H:vprutyanov-pc.sw.ru; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; Received-SPF: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: 1; AM4PR08MB2849; 23:TFSUrGBnjnwBKSlXf5Gm13EmKiLyjXWDzV59g0D/SUjOTZxsN3s/ZqMowcS8ZYyoByvcbq6xz9Rhflw44PGcX793QRYawnGPocMyYN5x02+AFfkP+TYcJozE/GEQkoUgznQlKeH+UDmnKDjjSxrDzOH+loIYh7BbTLFaPuGi91zMY9S86f9zDjZL1rfy92nuGY9I1uI8HWTYIqlaU304g9j6RHtMAKptFLicKIpo0dQfowB5lNTvUrOTNuqlhdvZB8WJuFBavQq+HzE+nUNePIZ2P/8QJJaCVWhMW1M//iHjFoWi89DHZi2oSrq536oC9t/lbxaBskvp0rtl8tNggvhKpOuBvNCpRskcptR3IGLy9Gf6xO0+KcK0dgupi6LvXd/FfGMb7HraOzXDO1iUAimKLfKWZn6dxzoAzyzXzsB1BGH/dyhB8Kay3ehP8/GODmgfqjNtjB2RC1xOukEcWbEC4vNyDnJ+60WEXiwCjTvCkODJ1FCg9Uh0UkjrTrXJvDcO2qt4xdfx+SscfD/Y6eJOCWgzOi14G2pnfIVZLMKNMyE2oKx4Hnz6aih3tuOFwFmHMnUvcnzzORsREw2cHMMnl820wSRRI0hADpZb2HN7wXumvggIUDQvWGQKAAhI8FulsIcOI6iwCGPQj/XRrmnSmTWz9v1N9anLjlWTXrUADrKGRMcK3qqM75aT2aSiPJEPVCLiBGlvH9ir7bHNfrAAgKWrR3TOt1WDs075Z202ODe7iO/vf3DgAq5QQ2sVZ2CZ7OkFUvl9DLnXFkXlZ6uVw3SOzr1iXCrVBKEu84GHlz1NdlDBwizovl5eAmUENODzOe6OLS8g/t0/l5SKAkHknrhnE3IFavVr2U8+OQ4vJ2EMHJw4FQQq/qCyNzVQ8cIVRyV5sl3W7P7+ocnv8tUnM1dd4RcEKslLYqK+M7ZVuAR84TzSTKxGsDUAPYekJm/0IRGCvIF3Iv8I6DCKp79rFisjUm1swcy/yydMqd/tzUsoiFC4CaEllNuLmP+VxM/foUeBNQjoj5VngEK1w8N/dkc28EpnfghY+VIQZA4pbR3S0RlLvkTbmV24K0zjr0VdT7o55z9eEB1TK9BWxYACNuiqqUEQ1/g+/Sep+hAmDK8HBxWDofjq0sGOHLPDIsI2IGTMKYC2kwGTzCdMQqavacnNR2q0zuj95+q+/NDvz13xiFfdmq6PD3aMioHeFrpAEICK+ioZbl7fS6axBNKGW1ZVWpNofuN8xjUSBrHYsPRzl1+YpMlSxECrC10zWDD2bZJ+epB8TJDeDWsKWYbWgxkQSNP9CR9/h9AyNr0= X-Microsoft-Exchange-Diagnostics: 1; AM4PR08MB2849; 6:9O1vBT3nvu1vlM4EXmpwE4JKolBp5xAi51OtnNdTerjUfhTr3WAZMd7sypVkgQUbqFXJH104EdnTTT4NhjoRJ5pYcDhyTT2mhcsytDUrQKt6tMgBLiObpGL+/5I4AtLTp4t1uiVS1BdulP7dhORrsxSzoMcxYQFkyBGN8HGPfhh2wmb+lfDcuTVUkDCsWvcQG1z2MR+wckFrhH+p7/TE6AwKkcOjWbKW1cILsrorgJvV+BWgcx+x2TzFOC4szUtjcomMWh2G5l0txpnlIsOE7yHdfnhKI9CKluZohM6wPMfV6EbLDY7ZVq14c+u3QUUjelCRWRDgkW0fU5vnN9XW7EoLZFxRbx9uruqOqqx+jw0=; 5:x2ubWt4gCAEZp38JRNj6jQB0CCBBOxk/RxWoG0Ny0Zo4pAdeDhnzpLCtH+mX5wm+sgkEcnKQIysfAM5CXDkWlgFUuCCEtxDdb3GH6eGg8xFHVgscbWpNJ0efRO6tSHzbxy9vGTvy1v3BIFtufxTiG/qk0JDOTvE6i32Mq9BIROQ=; 24:5ilF5yun1vHfjkyr2SSSPIqq1lXyj5c+0UmCJ5Xi+Kt81FeGQERujD37LS6zFNNRFsKWA2MHERyXx4j3w+K3S8dGp95D1tSZMryUUOTtZ9s=; 7:RGynYLY2/5vukDvMIW5Dq5KJQB3GzhfdvEdhzgdhTJCCbgvf9gDqLwcLGxHtt+7oD4Pu2SFiqHYBkAVbCAYglE2kkJIiqshkJMjA0Kmk7+bEqXT+q27gtkhcFYM8Ql8KOGv38XzPzHGqqDUoYrs6LuN62LDQjlV4Q72Yi3bdA8LF2QEBtZVR/Bh1H7zfBMa9eFmLI76SH9C572FCPtf39dznc9gqSTMVyHU+17GJ/8PKLWusjD19TlasGpfMx23+ SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; AM4PR08MB2849; 20:t3yV0LuRLF4Xn2MMhgfB93nAo3MNtt50o9ClJS0COlAWx+mgLIyZSJ/AAMrUI3yc/SbVKw/rSCipphmK1hWJV96YkLiPxqomppCgGPLoofqK4gnPkG4JNgaknuLH6qRkmRxGFmKo3kBEzj2PFGPWftbxMUWRhembvOxDL2/e6MA= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Feb 2018 10:00:09.9899 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: c5530abc-c880-407b-3f2a-08d57848ba6d X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM4PR08MB2849 Sender: linux-ext4-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org This patch adds JSON output of journal information Signed-off-by: Viktor Prutyanov --- lib/e2p/e2p.h | 2 ++ lib/e2p/ljs.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ misc/dumpe2fs.c | 20 +++++++++++++------- 3 files changed, 72 insertions(+), 7 deletions(-) diff --git a/lib/e2p/e2p.h b/lib/e2p/e2p.h index 88c08d73..cd3793e5 100644 --- a/lib/e2p/e2p.h +++ b/lib/e2p/e2p.h @@ -83,3 +83,5 @@ int e2p_string2os(char *str); unsigned int e2p_percent(int percent, unsigned int base); void fill_json_super(struct json_obj *obj, struct ext2_super_block * s); +void e2p_fill_json_journal_super(struct json_obj *obj, char *journal_sb_buf, + int exp_block_size, int flags); diff --git a/lib/e2p/ljs.c b/lib/e2p/ljs.c index 2db700b0..c75610b8 100644 --- a/lib/e2p/ljs.c +++ b/lib/e2p/ljs.c @@ -111,3 +111,60 @@ void e2p_list_journal_super(FILE *f, char *journal_sb_buf, fprintf(f, "Journal errno: %d\n", (int) ntohl(jsb->s_errno)); } + +void e2p_fill_json_journal_super(struct json_obj *obj, char *journal_sb_buf, + int exp_block_size, int flags) +{ + journal_superblock_t *jsb = (journal_superblock_t *) journal_sb_buf; + __u32 *mask_ptr, mask, m; + unsigned int size; + int i, j, printed = 0; + unsigned int nr_users; + struct json_obj *journal_obj = json_obj_create_in_obj(obj, "journal"); + struct json_list *features_list, *users_list; + char buf[64]; + + features_list = json_list_create_in_obj(journal_obj, "journal-features", JSON_VAL_STRING); + for (i=0, mask_ptr=&jsb->s_feature_compat; i <3; i++,mask_ptr++) { + mask = e2p_be32(*mask_ptr); + for (j=0,m=1; j < 32; j++, m<<=1) { + if (mask & m) + json_list_add_str(features_list, e2p_jrnl_feature2string(i, m)); + } + } + size = (ntohl(jsb->s_blocksize) / 1024) * ntohl(jsb->s_maxlen); + if (size < 8192) + json_obj_add_fmt_buf_str(journal_obj, "journal-size", buf, sizeof(buf), "%uk", size); + else + json_obj_add_fmt_buf_str(journal_obj, "journal-size", buf, sizeof(buf), "%uM", size >> 10); + nr_users = (unsigned int) ntohl(jsb->s_nr_users); + if (exp_block_size != ntohl(jsb->s_blocksize)) + json_obj_add_fmt_buf_str(journal_obj, "journal-block-size", buf, sizeof(buf), "%u", + (unsigned int)ntohl(jsb->s_blocksize)); + json_obj_add_fmt_buf_str(journal_obj, "journal-length", buf, sizeof(buf), "%u", + (unsigned int)ntohl(jsb->s_maxlen)); + if (ntohl(jsb->s_first) != 1) + json_obj_add_fmt_buf_str(journal_obj, "journal-first-block", buf, sizeof(buf), "%u", + (unsigned int)ntohl(jsb->s_first)); + json_obj_add_fmt_buf_str(journal_obj, "journal-sequence", buf, sizeof(buf), "0x%08x", (unsigned int)ntohl(jsb->s_sequence)); + json_obj_add_fmt_buf_str(journal_obj, "journal-start", buf, sizeof(buf), "%u", (unsigned int)ntohl(jsb->s_start)); + if (nr_users != 1) + json_obj_add_fmt_buf_str(journal_obj, "journal-number-of-users", buf, sizeof(buf), "%u", nr_users); + if (jsb->s_feature_compat & e2p_be32(JFS_FEATURE_COMPAT_CHECKSUM)) + json_obj_add_str(journal_obj, "journal-checksum-type", "crc32"); + if ((jsb->s_feature_incompat & + e2p_be32(JFS_FEATURE_INCOMPAT_CSUM_V3)) || + (jsb->s_feature_incompat & + e2p_be32(JFS_FEATURE_INCOMPAT_CSUM_V2))) { + json_obj_add_str(journal_obj, "journal-checksum-type", journal_checksum_type_str(jsb->s_checksum_type)); + json_obj_add_fmt_buf_str(journal_obj, "journal-checksum", buf, sizeof(buf), "0x%08x", e2p_be32(jsb->s_checksum)); + } + if ((nr_users > 1) || + !e2p_is_null_uuid(&jsb->s_users[0])) { + users_list = json_list_create_in_obj(journal_obj, "journal-users", JSON_VAL_STRING); + for (i=0; i < nr_users; i++) + json_list_add_str(users_list, e2p_uuid2str(&jsb->s_users[i*16])); + } + if (jsb->s_errno != 0) + json_obj_add_fmt_buf_str(journal_obj, "journal-errno", buf, sizeof(buf), "%d", (int) ntohl(jsb->s_errno)); +} diff --git a/misc/dumpe2fs.c b/misc/dumpe2fs.c index 93e4b2ff..dc18d508 100644 --- a/misc/dumpe2fs.c +++ b/misc/dumpe2fs.c @@ -607,7 +607,7 @@ static void list_bad_blocks(ext2_filsys fs, int dump) ext2fs_badblocks_list_free(bb_list); } -static void print_inline_journal_information(ext2_filsys fs) +static void print_inline_journal_information(ext2_filsys fs, struct json_obj *obj) { journal_superblock_t *jsb; struct ext2_inode inode; @@ -643,10 +643,13 @@ static void print_inline_journal_information(ext2_filsys fs) _("Journal superblock magic number invalid!\n")); exit(1); } - e2p_list_journal_super(stdout, buf, fs->blocksize, 0); + if (obj) + e2p_fill_json_journal_super(obj, buf, fs->blocksize, 0); + else + e2p_list_journal_super(stdout, buf, fs->blocksize, 0); } -static void print_journal_information(ext2_filsys fs) +static void print_journal_information(ext2_filsys fs, struct json_obj *obj) { errcode_t retval; char buf[1024]; @@ -668,7 +671,10 @@ static void print_journal_information(ext2_filsys fs) _("Couldn't find journal superblock magic numbers")); exit(1); } - e2p_list_journal_super(stdout, buf, fs->blocksize, 0); + if (obj) + e2p_fill_json_journal_super(obj, buf, fs->blocksize, 0); + else + e2p_list_journal_super(stdout, buf, fs->blocksize, 0); } static void parse_extended_opts(const char *opts, blk64_t *superblock, @@ -762,7 +768,7 @@ int main (int argc, char ** argv) int c; int grp_only = 0; int json = 0; - struct json_obj *dump_obj; + struct json_obj *dump_obj = NULL; #ifdef ENABLE_NLS setlocale(LC_MESSAGES, ""); @@ -877,9 +883,9 @@ try_open_again: ext2fs_close_free(&fs); exit(0); } - if (!json && ext2fs_has_feature_journal(fs->super) && + if (ext2fs_has_feature_journal(fs->super) && (fs->super->s_journal_inum != 0)) - print_inline_journal_information(fs); + print_inline_journal_information(fs, dump_obj); if (!json) list_bad_blocks(fs, 0); if (header_only) {