From patchwork Thu Dec 6 09:50:08 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Miao Xie X-Patchwork-Id: 1844391 Return-Path: X-Original-To: patchwork-linux-btrfs@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork1.kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by patchwork1.kernel.org (Postfix) with ESMTP id 2B5823FCA5 for ; Thu, 6 Dec 2012 09:49:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1422898Ab2LFJts (ORCPT ); Thu, 6 Dec 2012 04:49:48 -0500 Received: from cn.fujitsu.com ([222.73.24.84]:26892 "EHLO song.cn.fujitsu.com" rhost-flags-OK-FAIL-OK-OK) by vger.kernel.org with ESMTP id S1422895Ab2LFJtq (ORCPT ); Thu, 6 Dec 2012 04:49:46 -0500 X-IronPort-AV: E=Sophos;i="4.84,229,1355068800"; d="scan'208";a="6346243" Received: from unknown (HELO tang.cn.fujitsu.com) ([10.167.250.3]) by song.cn.fujitsu.com with ESMTP; 06 Dec 2012 17:47:57 +0800 Received: from fnstmail02.fnst.cn.fujitsu.com (tang.cn.fujitsu.com [127.0.0.1]) by tang.cn.fujitsu.com (8.14.3/8.13.1) with ESMTP id qB69nkos032736; Thu, 6 Dec 2012 17:49:46 +0800 Received: from [10.167.225.199] ([10.167.225.199]) by fnstmail02.fnst.cn.fujitsu.com (Lotus Domino Release 8.5.3) with ESMTP id 2012120617490505-274394 ; Thu, 6 Dec 2012 17:49:05 +0800 Message-ID: <50C06A50.2040500@cn.fujitsu.com> Date: Thu, 06 Dec 2012 17:50:08 +0800 From: Miao Xie Reply-To: miaox@cn.fujitsu.com User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Linux Btrfs CC: Arne Jansen Subject: [PATCH 7/9] Btrfs-progs: list all qgroups impact given path(exclude ancestral qgroups) References: <50C068D4.6020105@cn.fujitsu.com> In-Reply-To: <50C068D4.6020105@cn.fujitsu.com> X-MIMETrack: Itemize by SMTP Server on mailserver/fnst(Release 8.5.3|September 15, 2011) at 2012/12/06 17:49:05, Serialize by Router on mailserver/fnst(Release 8.5.3|September 15, 2011) at 2012/12/06 17:49:05, Serialize complete at 2012/12/06 17:49:05 Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org From: Wang Shilong This patch introduces '-f' option which can help you filter the qgroups by the path name, you may use it like: btrfs qgroup show -f For example: qgroupid(2/0) / \ / \ qgroupid(1/0) / \ / \ / \ qgroupid(0/1) qgroupid(0/2) sub1 sub2 / \ / \ dir1 file1 If we use the command: btrfs qgroup show -f sub1/dir1 The result will output 0/1 -- -- '-f' option helps you list all qgroups impact given path. (exclude ancestral qgroups) Signed-off-by: Wang shilong Signed-off-by: Miao Xie --- cmds-qgroup.c | 14 ++++++++++++-- qgroup.c | 16 +++++++++++++++- qgroup.h | 1 + 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/cmds-qgroup.c b/cmds-qgroup.c index b6cdb53..9447179 100644 --- a/cmds-qgroup.c +++ b/cmds-qgroup.c @@ -207,6 +207,8 @@ static const char * const cmd_qgroup_show_usage[] = { "-e print max exclusive size of qgroup", "-F list all qgroups which impact the given path" "(include ancestral qgroups)", + "-f list all qgroups which impact the given path" + "(exclude ancestral qgroups)", NULL }; @@ -224,7 +226,7 @@ static int cmd_qgroup_show(int argc, char **argv) optind = 1; while (1) { - c = getopt(argc, argv, "pcleF"); + c = getopt(argc, argv, "pcleFf"); if (c < 0) break; @@ -248,6 +250,9 @@ static int cmd_qgroup_show(int argc, char **argv) case 'F': filter_flag |= 0x1; break; + case 'f': + filter_flag |= 0x2; + break; default: usage(cmd_qgroup_show_usage); } @@ -263,9 +268,14 @@ static int cmd_qgroup_show(int argc, char **argv) } if (filter_flag) { qgroupid = btrfs_get_path_rootid(fd); - btrfs_qgroup_setup_filter(&filter_set, + if (filter_flag & 0x1) + btrfs_qgroup_setup_filter(&filter_set, BTRFS_QGROUP_FILTER_ALL_PARENT, qgroupid); + if (filter_flag & 0x2) + btrfs_qgroup_setup_filter(&filter_set, + BTRFS_QGROUP_FILTER_PARENT, + qgroupid); } ret = btrfs_show_qgroups(fd, filter_set); if (ret < 0) { diff --git a/qgroup.c b/qgroup.c index 6cb71e9..b8640dc 100644 --- a/qgroup.c +++ b/qgroup.c @@ -468,6 +468,18 @@ static int filter_all_parent_insert(struct qgroup_lookup *sort_tree, return 0; } +static int filter_by_parent(struct btrfs_qgroup *bq, u64 data) +{ + struct btrfs_qgroup *qgroup = + (struct btrfs_qgroup *)(unsigned long)data; + + if (data == 0) + return 0; + if (qgroup->qgroupid == bq->qgroupid) + return 1; + return 0; +} + static int filter_by_all_parent(struct btrfs_qgroup *bq, u64 data) { struct qgroup_lookup lookup; @@ -502,6 +514,7 @@ static int filter_by_all_parent(struct btrfs_qgroup *bq, u64 data) } static btrfs_qgroup_filter_func all_filter_funcs[] = { + [BTRFS_QGROUP_FILTER_PARENT] = filter_by_parent, [BTRFS_QGROUP_FILTER_ALL_PARENT] = filter_by_all_parent, }; @@ -586,7 +599,8 @@ static void pre_process_filter_set(struct qgroup_lookup *lookup, for (i = 0; i < set->nfilters; i++) { - if (set->filters[i].filter_func == filter_by_all_parent) { + if (set->filters[i].filter_func == filter_by_all_parent + || set->filters[i].filter_func == filter_by_parent) { qgroup_for_filter = qgroup_tree_search(lookup, set->filters[i].data); set->filters[i].data = diff --git a/qgroup.h b/qgroup.h index 30844fe..d1165fd 100644 --- a/qgroup.h +++ b/qgroup.h @@ -49,6 +49,7 @@ enum btrfs_qgroup_column_enum { }; enum btrfs_qgroup_filter_enum { + BTRFS_QGROUP_FILTER_PARENT, BTRFS_QGROUP_FILTER_ALL_PARENT, BTRFS_QGROUP_FILTER_MAX, };