Commit cc353a8b authored by Qu Wenruo's avatar Qu Wenruo Committed by David Sterba

btrfs: reduce width for stripe_len from u64 to u32

Currently btrfs uses fixed stripe length (64K), thus u32 is wide enough
for the usage.

Furthermore, even in the future we choose to enlarge stripe length to
larger values, I don't believe we would want stripe as large as 4G or
larger.

So this patch will reduce the width for all in-memory structures and
parameters, this involves:

- RAID56 related function argument lists
  This allows us to do direct division related to stripe_len.
  Although we will use bits shift to replace the division anyway.

- btrfs_io_geometry structure
  This involves one change to simplify the calculation of both @stripe_nr
  and @stripe_offset, using div64_u64_rem().
  And add extra sanity check to make sure @stripe_offset is always small
  enough for u32.

  This saves 8 bytes for the structure.

- map_lookup structure
  This convert @stripe_len to u32, which saves 8 bytes. (saved 4 bytes,
  and removed a 4-bytes hole)
Signed-off-by: default avatarQu Wenruo <wqu@suse.com>
Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent ad357938
...@@ -949,9 +949,10 @@ static struct page *page_in_rbio(struct btrfs_raid_bio *rbio, ...@@ -949,9 +949,10 @@ static struct page *page_in_rbio(struct btrfs_raid_bio *rbio,
* number of pages we need for the entire stripe across all the * number of pages we need for the entire stripe across all the
* drives * drives
*/ */
static unsigned long rbio_nr_pages(unsigned long stripe_len, int nr_stripes) static unsigned long rbio_nr_pages(u32 stripe_len, int nr_stripes)
{ {
return DIV_ROUND_UP(stripe_len, PAGE_SIZE) * nr_stripes; ASSERT(IS_ALIGNED(stripe_len, PAGE_SIZE));
return (stripe_len >> PAGE_SHIFT) * nr_stripes;
} }
/* /*
...@@ -960,13 +961,13 @@ static unsigned long rbio_nr_pages(unsigned long stripe_len, int nr_stripes) ...@@ -960,13 +961,13 @@ static unsigned long rbio_nr_pages(unsigned long stripe_len, int nr_stripes)
*/ */
static struct btrfs_raid_bio *alloc_rbio(struct btrfs_fs_info *fs_info, static struct btrfs_raid_bio *alloc_rbio(struct btrfs_fs_info *fs_info,
struct btrfs_io_context *bioc, struct btrfs_io_context *bioc,
u64 stripe_len) u32 stripe_len)
{ {
struct btrfs_raid_bio *rbio; struct btrfs_raid_bio *rbio;
int nr_data = 0; int nr_data = 0;
int real_stripes = bioc->num_stripes - bioc->num_tgtdevs; int real_stripes = bioc->num_stripes - bioc->num_tgtdevs;
int num_pages = rbio_nr_pages(stripe_len, real_stripes); int num_pages = rbio_nr_pages(stripe_len, real_stripes);
int stripe_npages = DIV_ROUND_UP(stripe_len, PAGE_SIZE); int stripe_npages = stripe_len >> PAGE_SHIFT;
void *p; void *p;
rbio = kzalloc(sizeof(*rbio) + rbio = kzalloc(sizeof(*rbio) +
...@@ -1691,8 +1692,7 @@ static void btrfs_raid_unplug(struct blk_plug_cb *cb, bool from_schedule) ...@@ -1691,8 +1692,7 @@ static void btrfs_raid_unplug(struct blk_plug_cb *cb, bool from_schedule)
/* /*
* our main entry point for writes from the rest of the FS. * our main entry point for writes from the rest of the FS.
*/ */
int raid56_parity_write(struct bio *bio, struct btrfs_io_context *bioc, int raid56_parity_write(struct bio *bio, struct btrfs_io_context *bioc, u32 stripe_len)
u64 stripe_len)
{ {
struct btrfs_fs_info *fs_info = bioc->fs_info; struct btrfs_fs_info *fs_info = bioc->fs_info;
struct btrfs_raid_bio *rbio; struct btrfs_raid_bio *rbio;
...@@ -2089,7 +2089,7 @@ static int __raid56_parity_recover(struct btrfs_raid_bio *rbio) ...@@ -2089,7 +2089,7 @@ static int __raid56_parity_recover(struct btrfs_raid_bio *rbio)
* of the drive. * of the drive.
*/ */
int raid56_parity_recover(struct bio *bio, struct btrfs_io_context *bioc, int raid56_parity_recover(struct bio *bio, struct btrfs_io_context *bioc,
u64 stripe_len, int mirror_num, int generic_io) u32 stripe_len, int mirror_num, int generic_io)
{ {
struct btrfs_fs_info *fs_info = bioc->fs_info; struct btrfs_fs_info *fs_info = bioc->fs_info;
struct btrfs_raid_bio *rbio; struct btrfs_raid_bio *rbio;
...@@ -2195,7 +2195,7 @@ static void read_rebuild_work(struct btrfs_work *work) ...@@ -2195,7 +2195,7 @@ static void read_rebuild_work(struct btrfs_work *work)
struct btrfs_raid_bio *raid56_parity_alloc_scrub_rbio(struct bio *bio, struct btrfs_raid_bio *raid56_parity_alloc_scrub_rbio(struct bio *bio,
struct btrfs_io_context *bioc, struct btrfs_io_context *bioc,
u64 stripe_len, struct btrfs_device *scrub_dev, u32 stripe_len, struct btrfs_device *scrub_dev,
unsigned long *dbitmap, int stripe_nsectors) unsigned long *dbitmap, int stripe_nsectors)
{ {
struct btrfs_fs_info *fs_info = bioc->fs_info; struct btrfs_fs_info *fs_info = bioc->fs_info;
......
...@@ -31,15 +31,14 @@ struct btrfs_raid_bio; ...@@ -31,15 +31,14 @@ struct btrfs_raid_bio;
struct btrfs_device; struct btrfs_device;
int raid56_parity_recover(struct bio *bio, struct btrfs_io_context *bioc, int raid56_parity_recover(struct bio *bio, struct btrfs_io_context *bioc,
u64 stripe_len, int mirror_num, int generic_io); u32 stripe_len, int mirror_num, int generic_io);
int raid56_parity_write(struct bio *bio, struct btrfs_io_context *bioc, int raid56_parity_write(struct bio *bio, struct btrfs_io_context *bioc, u32 stripe_len);
u64 stripe_len);
void raid56_add_scrub_pages(struct btrfs_raid_bio *rbio, struct page *page, void raid56_add_scrub_pages(struct btrfs_raid_bio *rbio, struct page *page,
u64 logical); u64 logical);
struct btrfs_raid_bio *raid56_parity_alloc_scrub_rbio(struct bio *bio, struct btrfs_raid_bio *raid56_parity_alloc_scrub_rbio(struct bio *bio,
struct btrfs_io_context *bioc, u64 stripe_len, struct btrfs_io_context *bioc, u32 stripe_len,
struct btrfs_device *scrub_dev, struct btrfs_device *scrub_dev,
unsigned long *dbitmap, int stripe_nsectors); unsigned long *dbitmap, int stripe_nsectors);
void raid56_parity_submit_scrub_rbio(struct btrfs_raid_bio *rbio); void raid56_parity_submit_scrub_rbio(struct btrfs_raid_bio *rbio);
......
...@@ -6313,7 +6313,7 @@ int btrfs_get_io_geometry(struct btrfs_fs_info *fs_info, struct extent_map *em, ...@@ -6313,7 +6313,7 @@ int btrfs_get_io_geometry(struct btrfs_fs_info *fs_info, struct extent_map *em,
u64 offset; u64 offset;
u64 stripe_offset; u64 stripe_offset;
u64 stripe_nr; u64 stripe_nr;
u64 stripe_len; u32 stripe_len;
u64 raid56_full_stripe_start = (u64)-1; u64 raid56_full_stripe_start = (u64)-1;
int data_stripes; int data_stripes;
...@@ -6324,19 +6324,13 @@ int btrfs_get_io_geometry(struct btrfs_fs_info *fs_info, struct extent_map *em, ...@@ -6324,19 +6324,13 @@ int btrfs_get_io_geometry(struct btrfs_fs_info *fs_info, struct extent_map *em,
offset = logical - em->start; offset = logical - em->start;
/* Len of a stripe in a chunk */ /* Len of a stripe in a chunk */
stripe_len = map->stripe_len; stripe_len = map->stripe_len;
/* Stripe where this block falls in */ /*
stripe_nr = div64_u64(offset, stripe_len); * Stripe_nr is where this block falls in
/* Offset of stripe in the chunk */ * stripe_offset is the offset of this block in its stripe.
stripe_offset = stripe_nr * stripe_len; */
if (offset < stripe_offset) { stripe_nr = div64_u64_rem(offset, stripe_len, &stripe_offset);
btrfs_crit(fs_info, ASSERT(stripe_offset < U32_MAX);
"stripe math has gone wrong, stripe_offset=%llu offset=%llu start=%llu logical=%llu stripe_len=%llu",
stripe_offset, offset, em->start, logical, stripe_len);
return -EINVAL;
}
/* stripe_offset is the offset of this block in its stripe */
stripe_offset = offset - stripe_offset;
data_stripes = nr_data_stripes(map); data_stripes = nr_data_stripes(map);
/* Only stripe based profiles needs to check against stripe length. */ /* Only stripe based profiles needs to check against stripe length. */
......
...@@ -23,11 +23,11 @@ struct btrfs_io_geometry { ...@@ -23,11 +23,11 @@ struct btrfs_io_geometry {
/* offset of logical address in chunk */ /* offset of logical address in chunk */
u64 offset; u64 offset;
/* length of single IO stripe */ /* length of single IO stripe */
u64 stripe_len; u32 stripe_len;
/* offset of address in stripe */
u32 stripe_offset;
/* number of stripe where address falls */ /* number of stripe where address falls */
u64 stripe_nr; u64 stripe_nr;
/* offset of address in stripe */
u64 stripe_offset;
/* offset of raid56 stripe into the chunk */ /* offset of raid56 stripe into the chunk */
u64 raid56_stripe_offset; u64 raid56_stripe_offset;
}; };
...@@ -430,7 +430,7 @@ struct map_lookup { ...@@ -430,7 +430,7 @@ struct map_lookup {
u64 type; u64 type;
int io_align; int io_align;
int io_width; int io_width;
u64 stripe_len; u32 stripe_len;
int num_stripes; int num_stripes;
int sub_stripes; int sub_stripes;
int verified_stripes; /* For mount time dev extent verification */ int verified_stripes; /* For mount time dev extent verification */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment