public inbox for stable@vger.kernel.org
 help / color / mirror / Atom feed
From: David Sterba <dsterba@suse.com>
To: stable@vger.kernel.org
Subject: [PATCH 02/21] Btrfs: do not create empty block group if we have allocated data
Date: Fri,  3 Jun 2016 17:42:10 +0200	[thread overview]
Message-ID: <1464968530-6233-1-git-send-email-dsterba@suse.com> (raw)
In-Reply-To: <20160603154006.GP29147@suse.cz>

From: Liu Bo <bo.li.liu@oracle.com>

commit cf25ce518e8ef9d59b292e51193bed2b023a32da upstream.

Now we force to create empty block group to keep data profile alive,
however, in the below example, we eventually get an empty block group
while we're trying to get more space for other types (metadata/system),

- Before,
block group "A": size=2G, used=1.2G
block group "B": size=2G, used=512M

- After "btrfs balance start -dusage=50 mount_point",
block group "A": size=2G, used=(1.2+0.5)G
block group "C": size=2G, used=0

Since there is no data in block group C, it won't be deleted
automatically and we have to get the unused 2G until the next mount.

Balance itself just moves data and doesn't remove data, so it's safe
to not create such a empty block group if we already have data
 allocated in other block groups.

Signed-off-by: Liu Bo <bo.li.liu@oracle.com>
Signed-off-by: David Sterba <dsterba@suse.com>
---
 fs/btrfs/volumes.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index 366b335946fa..adb5f697a963 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -3401,6 +3401,7 @@ static int __btrfs_balance(struct btrfs_fs_info *fs_info)
 	u32 count_meta = 0;
 	u32 count_sys = 0;
 	int chunk_reserved = 0;
+	u64 bytes_used = 0;
 
 	/* step one make some room on all the devices */
 	devices = &fs_info->fs_devices->devices;
@@ -3539,7 +3540,13 @@ static int __btrfs_balance(struct btrfs_fs_info *fs_info)
 			goto loop;
 		}
 
-		if ((chunk_type & BTRFS_BLOCK_GROUP_DATA) && !chunk_reserved) {
+		ASSERT(fs_info->data_sinfo);
+		spin_lock(&fs_info->data_sinfo->lock);
+		bytes_used = fs_info->data_sinfo->bytes_used;
+		spin_unlock(&fs_info->data_sinfo->lock);
+
+		if ((chunk_type & BTRFS_BLOCK_GROUP_DATA) &&
+		    !chunk_reserved && !bytes_used) {
 			trans = btrfs_start_transaction(chunk_root, 0);
 			if (IS_ERR(trans)) {
 				mutex_unlock(&fs_info->delete_unused_bgs_mutex);
-- 
2.7.1


  parent reply	other threads:[~2016-06-03 15:42 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-06-03 15:40 Btrfs stable patches for 4.5.x David Sterba
2016-06-03 15:42 ` [PATCH 01/21] btrfs: bugfix: handle FS_IOC32_{GETFLAGS,SETFLAGS,GETVERSION} in btrfs_ioctl David Sterba
2016-06-03 15:42 ` David Sterba [this message]
2016-06-03 15:42 ` [PATCH 03/21] btrfs: allow balancing to dup with multi-device David Sterba
2016-06-03 15:42 ` [PATCH 04/21] btrfs: fix mixed block count of available space David Sterba
2016-06-03 15:42 ` [PATCH 05/21] btrfs: avoid overflowing f_bfree David Sterba
2016-06-03 15:42 ` [PATCH 06/21] btrfs: fix lock dep warning, move scratch dev out of device_list_mutex and uuid_mutex David Sterba
2016-06-03 15:42 ` [PATCH 07/21] btrfs: add read-only check to sysfs handler of features David Sterba
2016-06-03 15:42 ` [PATCH 08/21] btrfs: add check to sysfs handler of label David Sterba
2016-06-03 15:42 ` [PATCH 09/21] Btrfs: fix divide error upon chunk's stripe_len David Sterba
2016-06-03 15:42 ` [PATCH 10/21] Btrfs: remove BUG_ON()'s in btrfs_map_block David Sterba
2016-06-03 15:42 ` [PATCH 11/21] btrfs: fix lock dep warning move scratch super outside of chunk_mutex David Sterba
2016-06-03 15:42 ` [PATCH 12/21] btrfs: add write protection to SET_FEATURES ioctl David Sterba
2016-06-03 15:42 ` [PATCH 13/21] btrfs: fix int32 overflow in shrink_delalloc() David Sterba
2016-06-03 15:42 ` [PATCH 14/21] Btrfs: fix fspath error deallocation David Sterba
2016-06-03 15:42 ` [PATCH 15/21] btrfs: fix memory leak during RAID 5/6 device replacement David Sterba
2016-06-03 15:42 ` [PATCH 16/21] btrfs: pass the right error code to the btrfs_std_error David Sterba
2016-06-03 15:42 ` [PATCH 17/21] Btrfs: fix for incorrect directory entries after fsync log replay David Sterba
2016-06-03 15:42 ` [PATCH 18/21] Btrfs: fix empty symlink after creating symlink and fsync parent dir David Sterba
2016-06-03 15:42 ` [PATCH 19/21] Btrfs: fix unexpected return value of fiemap David Sterba
2016-06-03 15:42 ` [PATCH 20/21] btrfs: scrub: Set bbio to NULL before calling btrfs_map_block David Sterba
2016-06-03 15:42 ` [PATCH 21/21] btrfs: make state preallocation more speculative in __set_extent_bit David Sterba
2016-06-05 21:48 ` Btrfs stable patches for 4.5.x Greg KH

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=1464968530-6233-1-git-send-email-dsterba@suse.com \
    --to=dsterba@suse.com \
    --cc=stable@vger.kernel.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox