From patchwork Thu Sep 20 13:26:58 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Junhui Tang X-Patchwork-Id: 10607755 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 3DA6C14DA for ; Thu, 20 Sep 2018 13:26:04 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 2C6B327CF3 for ; Thu, 20 Sep 2018 13:26:04 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 208DE29005; Thu, 20 Sep 2018 13:26:04 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 9FE7127CF3 for ; Thu, 20 Sep 2018 13:26:03 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732496AbeITTJd (ORCPT ); Thu, 20 Sep 2018 15:09:33 -0400 Received: from mail-qt0-f194.google.com ([209.85.216.194]:35818 "EHLO mail-qt0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731580AbeITTJd (ORCPT ); Thu, 20 Sep 2018 15:09:33 -0400 Received: by mail-qt0-f194.google.com with SMTP id j7-v6so8448385qtp.2; Thu, 20 Sep 2018 06:26:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:from:date:message-id:subject:to:cc; bh=vbIPPTiBKNEIdPVLKrYaJp0x+wn3IdQ5mICSIM84xFM=; b=F5JscwKmZ4tmje/CJwZpeG5I0EyBEOhIc3XBWsNFG/D7SjHIeHXeEePQaEjBoCop5K UnT6Z9KsI5AW7Ou0qH8Qn8RGwxE5Y+xET3iuxlBI0AQCfGU7mVOJK+8YMPmvzHEmC3YR ltmy9niuwi+YDI3m45cpY1nSNA73+/ZM6Jinpy4nHTk6FNqJp9M9wK1sIfR9lQ11a2Zx k+ItW1C8gG5q6MGyorMgVxpNszEdl718nMaMpTF6ta/RJ7wRwu/6bu+qPPFNXk2a8dkD QcZR9jfuIIjj4HxBgKzo6ku4ZvuVPWyn4XwsnoKjjWrUS2YEjVZl+9onGuMqPkAdfK2B aIsA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to:cc; bh=vbIPPTiBKNEIdPVLKrYaJp0x+wn3IdQ5mICSIM84xFM=; b=jairYK8bSbAXnSXOq6bVdjoJ1dPUU70suIetQtAq6GEmzpDPp85JXMcRCWeXsOjueN PVSBdGYbYUXxfyWvPpNqLc9Lw1Dj7LBInRfPDnD/L0zfYWiIFF8qRts0+U+jWGIUYdVk gOVFIHSZXjcDrZptCDRaYbDUpZvyNem/Pb3zGo05p2ZQP5vfyre0VcdtdZmenecVEHNn UMtMIqk0WSURXMwa/O2sFluIIW/3XhmS219lx7fy8VefAorXw8DYbTqN017RejiKqdMi 9+VjGdD1Ghzc3Rvxhcd4u3rCXZAKTGeL990VNHqW6bhlgkjlxgx9D7Hx8VV2hWCU5t1P wovA== X-Gm-Message-State: APzg51Dq1iDBw7E5w8V/u1YVU2lk8XcHhN2hba3KUOjJ16mokpOetWpT zBbymO9Mfbahj7JCXUPlI0GCMMP/NFRjSboZ57H9LPDsrYI= X-Google-Smtp-Source: ANB0VdaZXHecG7IY9hH5RUhJjmj5hwD3UxlJijr5y6ipKemYYak5yti/+1nxnMgiddE7Wcn593aZ1hImqBUKVbXGdG0= X-Received: by 2002:ac8:530d:: with SMTP id t13-v6mr28834310qtn.309.1537449961664; Thu, 20 Sep 2018 06:26:01 -0700 (PDT) MIME-Version: 1.0 From: Junhui Tang Date: Thu, 20 Sep 2018 21:26:58 +0800 Message-ID: Subject: [PATCH] bcache: add a command to show bcache topology To: colyli@suse.de Cc: linux-bcache@vger.kernel.org, linux-block@vger.kernel.org Sender: linux-block-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-block@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From 647ac21a0068df1fafb038a628791d2fcc135462 Mon Sep 17 00:00:00 2001 From: Tang Junhui Date: Fri, 21 Sep 2018 04:52:20 +0800 Subject: [PATCH] bcache: add a command to show bcache topology This patch add a command to show bcache topology as bellow: [root@ceph x86_64]# cat /sys/fs/bcache/show ( sdb ) : ( sdg:bcache4 sdf:bcache3 sde:bcache2 sdd:bcache1 sdc:bcache0 ) ( sdh ) : ( sdm:bcache9 sdl:bcache8 sdk:bcache7 sdj:bcache6 sdi:bcache5 ) In the output result, each line shows cache devices in the first () and its cached devices in the second (). By this command, we can be easily to know cached device bcache4 base on backing device sdg and cache device sdb, we also can see bcache0 bcache1 bcache2 bcache3 and bcache4 are in the same cache set. Signed-off-by: Tang Junhui --- drivers/md/bcache/bcache.h | 3 +++ drivers/md/bcache/super.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) static bool bch_is_open_backing(struct block_device *bdev) { @@ -2246,6 +2249,52 @@ static ssize_t register_bcache(struct kobject *k, struct kobj_attribute *attr, goto out; } +static ssize_t show_bcache(struct kobject *k, struct kobj_attribute *attr, + char *buffer) +{ + unsigned int i; + struct cache_set *c, *tc; + struct cache *ca; + struct cached_dev *dc, *t; + ssize_t ret = 0; + bool uncached = false; + char name[BDEVNAME_SIZE]; + + if (!try_module_get(THIS_MODULE)) + return -EBUSY; + mutex_lock(&bch_register_lock); + + list_for_each_entry_safe(c, tc, &bch_cache_sets, list) { + ret += scnprintf(buffer + ret, PAGE_SIZE - ret, "%s", "("); + for_each_cache(ca, c, i) + ret += scnprintf(buffer + ret, PAGE_SIZE - ret, " %s", + bdevname(ca->bdev, name)); + ret += scnprintf(buffer + ret, PAGE_SIZE - ret, "%s", " ) : ("); + list_for_each_entry_safe(dc, t, &c->cached_devs, list) + ret += scnprintf(buffer + ret, PAGE_SIZE - ret, + " %s:%s", + bdevname(dc->bdev, name), + dc->disk.disk ? dc->disk.disk->disk_name : " "); + ret += scnprintf(buffer + ret, PAGE_SIZE - ret, "%s", " )\n"); + } + list_for_each_entry_safe(dc, t, &uncached_devices, list) { + if (!uncached) { + ret += scnprintf(buffer + ret, PAGE_SIZE - ret, + "%s", "( ) : ("); + uncached = true; + } + ret += scnprintf(buffer + ret, PAGE_SIZE - ret, " %s:%s", + bdevname(dc->bdev, name), + dc->disk.disk ? dc->disk.disk->disk_name : " "); + } + if (uncached) + ret += scnprintf(buffer + ret, PAGE_SIZE - ret, "%s", " )\n"); + + mutex_unlock(&bch_register_lock); + module_put(THIS_MODULE); + return ret; +} + static int bcache_reboot(struct notifier_block *n, unsigned long code, void *x) { if (code == SYS_DOWN || @@ -2326,6 +2375,7 @@ static int __init bcache_init(void) { static const struct attribute *files[] = { &ksysfs_register.attr, + &ksysfs_show.attr, &ksysfs_register_quiet.attr, NULL }; diff --git a/drivers/md/bcache/bcache.h b/drivers/md/bcache/bcache.h index 05f82ff6..52ef9b3 100644 --- a/drivers/md/bcache/bcache.h +++ b/drivers/md/bcache/bcache.h @@ -881,6 +881,9 @@ static inline uint8_t bucket_gc_gen(struct bucket *b) #define kobj_attribute_write(n, fn) \ static struct kobj_attribute ksysfs_##n = __ATTR(n, S_IWUSR, NULL, fn) +#define kobj_attribute_read(n, fn) \ + static struct kobj_attribute ksysfs_##n = __ATTR(n, 0400, fn, NULL) + #define kobj_attribute_rw(n, show, store) \ static struct kobj_attribute ksysfs_##n = \ __ATTR(n, S_IWUSR|S_IRUSR, show, store) diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c index 55a3764..d0d5484 100644 --- a/drivers/md/bcache/super.c +++ b/drivers/md/bcache/super.c @@ -2129,8 +2129,11 @@ static int register_cache(struct cache_sb *sb, struct page *sb_page, static ssize_t register_bcache(struct kobject *, struct kobj_attribute *, const char *, size_t); +static ssize_t show_bcache(struct kobject *, struct kobj_attribute *, + char *); kobj_attribute_write(register, register_bcache); +kobj_attribute_read(show, show_bcache); kobj_attribute_write(register_quiet, register_bcache);