All of lore.kernel.org
 help / color / mirror / Atom feed
From: Divya Indi <divya.indi@oracle.com>
To: Qu Wenruo <quwenruo@cn.fujitsu.com>, linux-btrfs@vger.kernel.org
Cc: ashish.samant@oracle.com, bo.li.liu@oracle.com
Subject: Re: [PATCH 3/3] btrfs-progs: Add command to check if balance op is req
Date: Wed, 19 Oct 2016 10:08:23 -0700	[thread overview]
Message-ID: <84b80642-1c56-127c-ce1c-e38fd3bf0043@oracle.com> (raw)
In-Reply-To: <c451366c-089c-5fe0-bfdb-ba3941f79d9d@cn.fujitsu.com>

On 10/17/2016 06:42 PM, Qu Wenruo wrote:
>
>
> At 10/18/2016 08:35 AM, Divya Indi wrote:
>> Add new subcommand to btrfs inspect-internal
>>
>> btrfs inspect-internal balance_check <path>
>> Checks whether 'btrfs balance' can help creating more space (Only
>> considers data block groups).
>
> I didn't think it's good to add a new subcommand just for that.
>
> Why not output such relocation sugguestion for you previous bg-analyze 
> subcommand?
> (It's better to make it a parameter to trigger such output)
>
> Thanks,
> Qu
Or maybe as an option to btrfs balance start?
Eg: btrfs balance start --check-only <path>
>>
>> Signed-off-by: Divya Indi <divya.indi@oracle.com>
>> Reviewed-by: Ashish Samant <ashish.samant@oracle.com>
>> Reviewed-by: Liu Bo <bo.li.liu@oracle.com>
>> ---
>>  cmds-inspect.c |  147 
>> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>>  1 files changed, 147 insertions(+), 0 deletions(-)
>>
>> diff --git a/cmds-inspect.c b/cmds-inspect.c
>> index 0e2f15a..5baaa49 100644
>> --- a/cmds-inspect.c
>> +++ b/cmds-inspect.c
>> @@ -267,6 +267,151 @@ static const char * const 
>> cmd_inspect_inode_resolve_usage[] = {
>>      NULL
>>  };
>>
>> +static const char * const cmd_inspect_balance_check_usage[] = {
>> +    "btrfs inspect-internal balance_check <path>",
>> +    "To check whether 'btrfs balance' can help creating more space",
>> +    "",
>> +    "",
>> +    NULL
>> +};
>> +
>> +static int cmd_inspect_balance_check(int argc, char **argv)
>> +{
>> +    struct btrfs_ioctl_search_args args;
>> +    struct btrfs_ioctl_search_args bg_args;
>> +    struct btrfs_ioctl_search_key *sk;
>> +    struct btrfs_ioctl_search_key *bg_sk;
>> +    struct btrfs_ioctl_search_header *header;
>> +    struct btrfs_ioctl_search_header *bg_header;
>> +    struct btrfs_block_group_item *bg;
>> +    struct btrfs_chunk *chunk;
>> +    unsigned long off = 0;
>> +    unsigned long bg_off = 0;
>> +    DIR *dirstream = NULL;
>> +    int fd;
>> +    int i;
>> +    u64 total_free = 0;
>> +    u64 min_used = (u64)-1;
>> +    u64 free_of_min_used = 0;
>> +    u64 bg_of_min_used = 0;
>> +    u64 flags;
>> +    u64 used;
>> +    int ret = 0;
>> +    int nr_data_bgs = 0;
>> +
>> +    if (check_argc_exact(argc, 2))
>> +        usage(cmd_inspect_balance_check_usage);
>> +
>> +    fd = btrfs_open_dir(argv[optind], &dirstream, 1);
>> +    if (fd < 0)
>> +        return 1;
>> +
>> +    memset(&args, 0, sizeof(args));
>> +    sk = &args.key;
>> +    sk->min_offset = sk->min_transid = 0;
>> +    sk->max_offset = sk->max_transid = (u64)-1;
>> +
>> +    printf("%20s%20s%20s\n", "Start", "Len", "Used");
>> +    while (1) {
>> +        ret = get_chunks(fd, &args);
>> +        if (ret < 0)
>> +            goto out;
>> +
>> +        /*
>> +         * it should not happen.
>> +         */
>> +        if (sk->nr_items == 0)
>> +            break;
>> +
>> +        off = 0;
>> +        memset(&bg_args, 0, sizeof(bg_args));
>> +        bg_sk = &bg_args.key;
>> +
>> +        /* For every chunk, look up 1 exact match for block group in
>> +         * the extent tree. */
>> +        bg_sk->tree_id = BTRFS_EXTENT_TREE_OBJECTID;
>> +        bg_sk->min_type = BTRFS_BLOCK_GROUP_ITEM_KEY;
>> +        bg_sk->max_type = BTRFS_BLOCK_GROUP_ITEM_KEY;
>> +        bg_sk->min_transid =  0;
>> +        bg_sk->max_transid = (u64)-1;
>> +
>> +        for (i = 0; i < sk->nr_items; i++) {
>> +            header = (struct btrfs_ioctl_search_header *)(args.buf
>> +                                      + off);
>> +            off += sizeof(*header);
>> +            if (header->type == BTRFS_CHUNK_ITEM_KEY) {
>> +                chunk = (struct btrfs_chunk *)
>> +                    (args.buf + off);
>> +                ret = get_bg_info(fd, &bg_args, header->offset,
>> +                          chunk->length);
>> +                if (ret < 0)
>> +                    goto out;
>> +
>> +                /*
>> +                 * it should not happen.
>> +                 */
>> +                if (bg_sk->nr_items == 0)
>> +                    continue;
>> +
>> +                bg_off = 0;
>> +                bg_header = (struct btrfs_ioctl_search_header *)
>> +                        (bg_args.buf + bg_off);
>> +                bg_off += sizeof(*bg_header);
>> +                bg = (struct btrfs_block_group_item *)
>> +                     (bg_args.buf + bg_off);
>> +
>> +                flags = btrfs_block_group_flags(bg);
>> +                if (flags & BTRFS_BLOCK_GROUP_DATA) {
>> +                    used = btrfs_block_group_used(bg);
>> +                    nr_data_bgs++;
>> +                    printf("%20llu%20s%20s\n",
>> +                        bg_header->objectid,
>> +                        pretty_size(bg_header->offset),
>> +                        pretty_size(used));
>> +                    total_free += bg_header->offset - used;
>> +                    if (min_used >= used) {
>> +                        min_used = used;
>> +                        free_of_min_used =
>> +                            bg_header->offset - used;
>> +                        bg_of_min_used =
>> +                            bg_header->objectid;
>> +                    }
>> +                }
>> +            }
>> +
>> +            off += header->len;
>> +            sk->min_offset = header->offset + header->len;
>> +        }
>> +        sk->nr_items = 4096;
>> +
>> +    }
>> +
>> +    if (nr_data_bgs <= 1) {
>> +        printf("Data block groups in fs = %d, no need to do 
>> balance.\n",
>> +                nr_data_bgs);
>> +        ret = 1;
>> +        goto out;
>> +    }
>> +
>> +    printf("Total data bgs: %d\nTotal free space: %s\n"
>> +           "For min used bg %llu used = %s free = %s\n",
>> +        nr_data_bgs, pretty_size(total_free), bg_of_min_used,
>> +        pretty_size(min_used), pretty_size(free_of_min_used));
>> +
>> +    if (total_free - free_of_min_used > min_used) {
>> +        printf("run 'btrfs balance start -dvrange=%llu..%llu 
>> <mountpoint>'\n",
>> +                bg_of_min_used, bg_of_min_used + 1);
>> +        ret = 0;
>> +    } else {
>> +        printf("Please don't balance data block groups, no free 
>> space\n");
>> +        ret = 1;
>> +    }
>> +
>> +out:
>> +    close_file_or_dir(fd, dirstream);
>> +    return ret;
>> +}
>> +
>>  static int cmd_inspect_inode_resolve(int argc, char **argv)
>>  {
>>      int fd;
>> @@ -816,6 +961,8 @@ const struct cmd_group inspect_cmd_group = {
>>              cmd_inspect_min_dev_size_usage, NULL, 0 },
>>          { "bg_analysis", cmd_inspect_bg_analysis,
>>              cmd_inspect_bg_analysis_usage, NULL, 0 },
>> +        { "balance_check", cmd_inspect_balance_check,
>> +            cmd_inspect_balance_check_usage, NULL, 0 },
>>          { "dump-tree", cmd_inspect_dump_tree,
>>                  cmd_inspect_dump_tree_usage, NULL, 0 },
>>          { "dump-super", cmd_inspect_dump_super,
>>
>
>


  reply	other threads:[~2016-10-19 17:08 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-10-18  0:35 btrfs-progs: Add 2 new subcommands to inspect-internal Divya Indi
2016-10-18  0:35 ` [PATCH 1/3] btrfs-progs: Generic functions to retrieve chunks and their bg info Divya Indi
2016-10-18  0:35   ` [PATCH 2/3] btrfs-progs: Add a command to show " Divya Indi
2016-10-18  0:35     ` [PATCH 3/3] btrfs-progs: Add command to check if balance op is req Divya Indi
2016-10-18  1:42       ` Qu Wenruo
2016-10-19 17:08         ` Divya Indi [this message]
2016-10-28 15:20           ` David Sterba
2016-10-28 16:29             ` Graham Cobb
2016-10-31 16:33               ` David Sterba
2016-11-02  0:39                 ` divya.indi
2016-10-30 14:10             ` Qu Wenruo
2016-10-18  1:39     ` [PATCH 2/3] btrfs-progs: Add a command to show bg info Qu Wenruo
2016-10-18  5:24       ` Roman Mamedov
2016-10-19 17:33         ` Divya Indi
2016-10-28 16:00     ` David Sterba
2016-11-02  0:40       ` divya.indi
2016-10-18  1:34   ` [PATCH 1/3] btrfs-progs: Generic functions to retrieve chunks and their " Qu Wenruo
2016-10-28 15:44   ` David Sterba
2016-11-02  0:39     ` divya.indi
2017-06-07 17:03     ` Goffredo Baroncelli
2017-06-09 21:57       ` divya.indi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=84b80642-1c56-127c-ce1c-e38fd3bf0043@oracle.com \
    --to=divya.indi@oracle.com \
    --cc=ashish.samant@oracle.com \
    --cc=bo.li.liu@oracle.com \
    --cc=linux-btrfs@vger.kernel.org \
    --cc=quwenruo@cn.fujitsu.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.