Login
[x]
Log in using an account from:
Fedora Account System
Red Hat Associate
Red Hat Customer
Or login using a Red Hat Bugzilla account
Forgot Password
Login:
Hide Forgot
Create an Account
Red Hat Bugzilla – Attachment 312361 Details for
Bug 437149
GFS2: [RFE] Optimise rgrp lookup during block allocation/deallocation
[?]
New
Simple Search
Advanced Search
My Links
Browse
Requests
Reports
Current State
Search
Tabular reports
Graphical reports
Duplicates
Other Reports
User Changes
Plotly Reports
Bug Status
Bug Severity
Non-Defaults
|
Product Dashboard
Help
Page Help!
Bug Writing Guidelines
What's new
Browser Support Policy
5.0.4.rh83 Release notes
FAQ
Guides index
User guide
Web Services
Contact
Legal
This site requires JavaScript to be enabled to function correctly, please enable it.
[patch]
Idea to try and speed up writes
calc.diff (text/plain), 5.86 KB, created by
Steve Whitehouse
on 2008-07-22 16:31:46 UTC
(
hide
)
Description:
Idea to try and speed up writes
Filename:
MIME Type:
Creator:
Steve Whitehouse
Created:
2008-07-22 16:31:46 UTC
Size:
5.86 KB
patch
obsolete
>diff --git a/fs/gfs2/bmap.c b/fs/gfs2/bmap.c >index bec76b1..6099d3a 100644 >--- a/fs/gfs2/bmap.c >+++ b/fs/gfs2/bmap.c >@@ -1231,35 +1231,6 @@ int gfs2_file_dealloc(struct gfs2_inode *ip) > } > > /** >- * gfs2_write_calc_reserv - calculate number of blocks needed to write to a file >- * @ip: the file >- * @len: the number of bytes to be written to the file >- * @data_blocks: returns the number of data blocks required >- * @ind_blocks: returns the number of indirect blocks required >- * >- */ >- >-void gfs2_write_calc_reserv(struct gfs2_inode *ip, unsigned int len, >- unsigned int *data_blocks, unsigned int *ind_blocks) >-{ >- struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); >- unsigned int tmp; >- >- if (gfs2_is_dir(ip)) { >- *data_blocks = DIV_ROUND_UP(len, sdp->sd_jbsize) + 2; >- *ind_blocks = 3 * (sdp->sd_max_jheight - 1); >- } else { >- *data_blocks = (len >> sdp->sd_sb.sb_bsize_shift) + 3; >- *ind_blocks = 3 * (sdp->sd_max_height - 1); >- } >- >- for (tmp = *data_blocks; tmp > sdp->sd_diptrs;) { >- tmp = DIV_ROUND_UP(tmp, sdp->sd_inptrs); >- *ind_blocks += tmp; >- } >-} >- >-/** > * gfs2_write_alloc_required - figure out if a write will require an allocation > * @ip: the file being written to > * @offset: the offset to write to >@@ -1276,6 +1247,7 @@ int gfs2_write_alloc_required(struct gfs2_inode *ip, u64 offset, > struct buffer_head bh; > unsigned int shift; > u64 lblock, lblock_stop, size; >+ u64 end_of_file; > > *alloc_required = 0; > >@@ -1291,19 +1263,12 @@ int gfs2_write_alloc_required(struct gfs2_inode *ip, u64 offset, > > *alloc_required = 1; > shift = sdp->sd_sb.sb_bsize_shift; >- if (gfs2_is_dir(ip)) { >- unsigned int bsize = sdp->sd_jbsize; >- lblock = offset; >- do_div(lblock, bsize); >- lblock_stop = offset + len + bsize - 1; >- do_div(lblock_stop, bsize); >- } else { >- u64 end_of_file = (ip->i_di.di_size + sdp->sd_sb.sb_bsize - 1) >> shift; >- lblock = offset >> shift; >- lblock_stop = (offset + len + sdp->sd_sb.sb_bsize - 1) >> shift; >- if (lblock_stop > end_of_file) >- return 0; >- } >+ BUG_ON(gfs2_is_dir(ip)); >+ end_of_file = (ip->i_di.di_size + sdp->sd_sb.sb_bsize - 1) >> shift; >+ lblock = offset >> shift; >+ lblock_stop = (offset + len + sdp->sd_sb.sb_bsize - 1) >> shift; >+ if (lblock_stop > end_of_file) >+ return 0; > > size = (lblock_stop - lblock) << shift; > do { >diff --git a/fs/gfs2/bmap.h b/fs/gfs2/bmap.h >index 4e6cde2..c983177 100644 >--- a/fs/gfs2/bmap.h >+++ b/fs/gfs2/bmap.h >@@ -10,10 +10,40 @@ > #ifndef __BMAP_DOT_H__ > #define __BMAP_DOT_H__ > >+#include "inode.h" >+ > struct inode; > struct gfs2_inode; > struct page; > >+ >+/** >+ * gfs2_write_calc_reserv - calculate number of blocks needed to write to a file >+ * @ip: the file >+ * @len: the number of bytes to be written to the file >+ * @data_blocks: returns the number of data blocks required >+ * @ind_blocks: returns the number of indirect blocks required >+ * >+ */ >+ >+static inline void gfs2_write_calc_reserv(const struct gfs2_inode *ip, >+ unsigned int len, >+ unsigned int *data_blocks, >+ unsigned int *ind_blocks) >+{ >+ const struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); >+ unsigned int tmp; >+ >+ BUG_ON(gfs2_is_dir(ip)); >+ *data_blocks = (len >> sdp->sd_sb.sb_bsize_shift) + 3; >+ *ind_blocks = 3 * (sdp->sd_max_height - 1); >+ >+ for (tmp = *data_blocks; tmp > sdp->sd_diptrs;) { >+ tmp = DIV_ROUND_UP(tmp, sdp->sd_inptrs); >+ *ind_blocks += tmp; >+ } >+} >+ > int gfs2_unstuff_dinode(struct gfs2_inode *ip, struct page *page); > int gfs2_block_map(struct inode *inode, sector_t lblock, struct buffer_head *bh, int create); > int gfs2_extent_map(struct inode *inode, u64 lblock, int *new, u64 *dblock, unsigned *extlen); >@@ -21,10 +51,6 @@ int gfs2_extent_map(struct inode *inode, u64 lblock, int *new, u64 *dblock, unsi > int gfs2_truncatei(struct gfs2_inode *ip, u64 size); > int gfs2_truncatei_resume(struct gfs2_inode *ip); > int gfs2_file_dealloc(struct gfs2_inode *ip); >- >-void gfs2_write_calc_reserv(struct gfs2_inode *ip, unsigned int len, >- unsigned int *data_blocks, >- unsigned int *ind_blocks); > int gfs2_write_alloc_required(struct gfs2_inode *ip, u64 offset, > unsigned int len, int *alloc_required); > >diff --git a/fs/gfs2/ops_address.c b/fs/gfs2/ops_address.c >index e64a1b0..9131bdc 100644 >--- a/fs/gfs2/ops_address.c >+++ b/fs/gfs2/ops_address.c >@@ -627,7 +627,7 @@ static int gfs2_write_begin(struct file *file, struct address_space *mapping, > { > struct gfs2_inode *ip = GFS2_I(mapping->host); > struct gfs2_sbd *sdp = GFS2_SB(mapping->host); >- unsigned int data_blocks, ind_blocks, rblocks; >+ unsigned int data_blocks = 0, ind_blocks = 0, rblocks; > int alloc_required; > int error = 0; > struct gfs2_alloc *al; >@@ -641,11 +641,13 @@ static int gfs2_write_begin(struct file *file, struct address_space *mapping, > if (unlikely(error)) > goto out_uninit; > >- gfs2_write_calc_reserv(ip, len, &data_blocks, &ind_blocks); > error = gfs2_write_alloc_required(ip, pos, len, &alloc_required); > if (error) > goto out_unlock; > >+ if (alloc_required || gfs2_is_jdata(ip)) >+ gfs2_write_calc_reserv(ip, len, &data_blocks, &ind_blocks); >+ > if (alloc_required) { > al = gfs2_alloc_get(ip); > if (!al) { >diff --git a/fs/gfs2/ops_file.c b/fs/gfs2/ops_file.c >index e9a366d..039b9d8 100644 >--- a/fs/gfs2/ops_file.c >+++ b/fs/gfs2/ops_file.c >@@ -357,7 +357,6 @@ static int gfs2_page_mkwrite(struct vm_area_struct *vma, struct page *page) > goto out; > > set_bit(GIF_SW_PAGED, &ip->i_flags); >- gfs2_write_calc_reserv(ip, PAGE_CACHE_SIZE, &data_blocks, &ind_blocks); > ret = gfs2_write_alloc_required(ip, pos, PAGE_CACHE_SIZE, &alloc_required); > if (ret || !alloc_required) > goto out_unlock; >@@ -369,6 +368,7 @@ static int gfs2_page_mkwrite(struct vm_area_struct *vma, struct page *page) > ret = gfs2_quota_lock_check(ip); > if (ret) > goto out_alloc_put; >+ gfs2_write_calc_reserv(ip, PAGE_CACHE_SIZE, &data_blocks, &ind_blocks); > al->al_requested = data_blocks + ind_blocks; > ret = gfs2_inplace_reserve(ip); > if (ret) >diff --git a/fs/gfs2/quota.c b/fs/gfs2/quota.c
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 437149
:
311273
|
312361
|
326366
|
397212
|
519803
|
519826