summaryrefslogtreecommitdiff
path: root/fs/exofs/super.c
diff options
context:
space:
mode:
authorbharrosh@panasas.com <bharrosh@panasas.com>2010-10-07 14:28:18 -0400
committerBoaz Harrosh <bharrosh@panasas.com>2011-03-15 15:02:50 +0200
commit66cd6cad4919f980dd21307d0150ff251762a264 (patch)
tree4f2d9dc0f9070ce829d03097542e7968e02df41a /fs/exofs/super.c
parent97178b7b6c84bd14660b89474d27931a1ea65c66 (diff)
downloadlwn-66cd6cad4919f980dd21307d0150ff251762a264.tar.gz
lwn-66cd6cad4919f980dd21307d0150ff251762a264.zip
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>
Diffstat (limited to 'fs/exofs/super.c')
-rw-r--r--fs/exofs/super.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/fs/exofs/super.c b/fs/exofs/super.c
index 78f5ad633d3b..e87510f4749e 100644
--- a/fs/exofs/super.c
+++ b/fs/exofs/super.c
@@ -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;