exofs: Override read-ahead to align on stripe_size

* Set all inode->i_mapping->backing_dev_info to point to
  the per super-block sb->s_bdi.

* Calculating a read_ahead that is:
  - preferable 2 stripes long
    (Future patch will add a mount option to override this)
  - Minimum 128K aligned up to stripe-size
  - Caped to maximum-IO-sizes round down to stripe_size.
    (Max sizes are governed by max bio-size that fits in a page
     times number-of-devices)

CC: Marc Dionne <marc.c.dionne@gmail.com>
Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
This commit is contained in:
bharrosh@panasas.com
2010-10-07 14:28:18 -04:00
committed by Boaz Harrosh
parent 97178b7b6c
commit 66cd6cad49
3 changed files with 35 additions and 4 deletions

View File

@@ -390,6 +390,23 @@ static int _read_and_match_data_map(struct exofs_sb_info *sbi, unsigned numdevs,
return 0;
}
static unsigned __ra_pages(struct exofs_layout *layout)
{
const unsigned _MIN_RA = 32; /* min 128K read-ahead */
unsigned ra_pages = layout->group_width * layout->stripe_unit /
PAGE_SIZE;
unsigned max_io_pages = exofs_max_io_pages(layout, ~0);
ra_pages *= 2; /* two stripes */
if (ra_pages < _MIN_RA)
ra_pages = roundup(_MIN_RA, ra_pages / 2);
if (ra_pages > max_io_pages)
ra_pages = max_io_pages;
return ra_pages;
}
/* @odi is valid only as long as @fscb_dev is valid */
static int exofs_devs_2_odi(struct exofs_dt_device_info *dt_dev,
struct osd_dev_info *odi)
@@ -623,6 +640,7 @@ static int exofs_fill_super(struct super_block *sb, void *data, int silent)
}
/* set up operation vectors */
sbi->bdi.ra_pages = __ra_pages(&sbi->layout);
sb->s_bdi = &sbi->bdi;
sb->s_fs_info = sbi;
sb->s_op = &exofs_sops;