On Tue, Apr 06, 2010 at 07:13:58AM -0400, Chris Mason wrote: > On Tue, Apr 06, 2010 at 03:54:27PM +0800, Yan, Zheng wrote: > > On Thu, Mar 18, 2010 at 4:45 AM, Josef Bacik <jo...@redhat.com> wrote: > > > If the amount of free space left in a device is less than what we think > > > should > > > be the minimum size, just ignore the minimum size and use the amount we > > > have. I > > > ran into this running tests on a 600mb volume, the chunk allocator > > > wouldn't let > > > me allocate the last 52mb of the disk for data because we want to have at > > > least > > > 64mb chunks for data. This patch fixes that problem. Thanks, > > > > > > Signed-off-by: Josef Bacik <jo...@redhat.com> > > > > > > diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c > > > index 9df8e3f..1c5b5ba 100644 > > > --- a/fs/btrfs/volumes.c > > > +++ b/fs/btrfs/volumes.c > > > @@ -2244,8 +2244,10 @@ again: > > > do_div(calc_size, stripe_len); > > > calc_size *= stripe_len; > > > } > > > + > > > /* we don't want tiny stripes */ > > > - calc_size = max_t(u64, min_stripe_size, calc_size); > > > + if (!looped) > > > + calc_size = max_t(u64, min_stripe_size, calc_size); > > > > > > do_div(calc_size, stripe_len); > > > calc_size *= stripe_len; > > > > I encountered an Oops caused by 'calc_size == 0'. It's likely introduced > > by this change. (calc_size can be zero after calling do_div)
Ok, anyone object to this: >From 9f680ce04ea19dabbbafe01b57b61930a9b70741 Mon Sep 17 00:00:00 2001 From: Chris Mason <chris.ma...@oracle.com> Date: Tue, 6 Apr 2010 09:37:47 -0400 Subject: [PATCH] Btrfs: make sure the chunk allocator doesn't create zero length chunks A recent commit allowed for smaller chunks to be created, but didn't make sure they were always bigger than a stripe. After some divides, this led to zero length stripes. Signed-off-by: Chris Mason <chris.ma...@oracle.com> --- fs/btrfs/volumes.c | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index 9bf1f58..b584e9a 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c @@ -2249,6 +2249,12 @@ again: if (!looped) calc_size = max_t(u64, min_stripe_size, calc_size); + /* + * we're about to do_div by the stripe_len so lets make sure + * we end up with something bigger than a stripe + */ + calc_size = max_t(u64, calc_size, stripe_len * 4); + do_div(calc_size, stripe_len); calc_size *= stripe_len; -- 1.7.0.2 -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html