Skip to contentSkip to conversation

Why we always balance system chunk alone with metadata?

DISCUSSION Qu Wenruo 2 participants 2 messages Mar 16, 2016 – Mar 17, 2016 Btrfs file system

lore
Share & tools
lore

Qu Wenruo

author
#0 lore raw

Hi,

During debugging a bug related to balancing metadata chunk, we found that if we specify -m option for "btrfs balance", it will always balance system chunk too.

cmds-balance.c:
---

        /*
         * allow -s only under --force, otherwise do with system chunks
         * the same thing we were ordered to do with meta chunks
         */
        if (args.flags & BTRFS_BALANCE_SYSTEM) {
                if (!force) {
                        error(
                            "Refusing to explicitly operate on system 
chunks.\n"
                            "Pass --force if you really want to do that.");
                        return 1;
                }
        } else if (args.flags & BTRFS_BALANCE_METADATA) {
                args.flags |= BTRFS_BALANCE_SYSTEM; <<< Here
                memcpy(&args.sys, &args.meta,
                        sizeof(struct btrfs_balance_args));
        }

---

I'm curious why we always bind system chunk to metadata balance?

Is there any special reason?
The patch introducing such behavior is dated back to 2012, and this makes us unable to do metadata *only* balance.

Any idea?

Thanks,
Qu

#1 lore raw

Qu Wenruo posted on Wed, 16 Mar 2016 10:48:48 +0800 as excerpted:

Quoted 25 lines

Hi,

During debugging a bug related to balancing metadata chunk, we found that if we specify -m option for "btrfs balance", it will always balance system chunk too.

cmds-balance.c:
---

         /*
          * allow -s only under --force, otherwise do with system chunks
          * the same thing we were ordered to do with meta chunks */
         if (args.flags & BTRFS_BALANCE_SYSTEM) {
                 if (!force) {
                         error(
                             "Refusing to explicitly operate on system
chunks.\n"
                             "Pass --force if you really want to do
                             that.");
                         return 1;
                 }
         } else if (args.flags & BTRFS_BALANCE_METADATA) {
                 args.flags |= BTRFS_BALANCE_SYSTEM; <<< Here
                 memcpy(&args.sys, &args.meta,
                         sizeof(struct btrfs_balance_args));
         }
Quoted 7 lines

---

I'm curious why we always bind system chunk to metadata balance?

Is there any special reason?
The patch introducing such behavior is dated back to 2012, and this makes us unable to do metadata *only* balance.

I always understood it as a convenient simplification for the sake of the user, for whom tracking data and metadata separately is already a major complication over what they're dealing with on most filesystems.

But I also wondered why there was no parallel to the -s system option for metadata ONLY, perhaps requiring --force just as the -s option does.

The --force requirement for -s /does/ encourage people not to touch it at all, separately, and there could be very good reasons to normally treat system as metadata and process them as a combined unit, but even then, it seems very odd to me to expose -s on its own, even if --force is required, and not a parallel, say -M, for metadata-only, again, possibly only if --force is used as well.

Signature · 3 lines
Duncan - List replies preferred.   No HTML msgs.
"Every nonfree program has a lord, a master --
and if you use the program, he is your master."  Richard Stallman