aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorSteven Whitehouse <swhiteho@redhat.com>2006-10-02 12:39:19 -0400
committerSteven Whitehouse <swhiteho@redhat.com>2006-10-02 12:39:19 -0400
commit48516ced21e83a755ebae3d1ed03f1731befc391 (patch)
tree9cf3c78506056d36909ce8da5560162d4c0fbc17 /fs
parent3cf1e7bed4681bdb1c14b6e146ae9c0afb6c1552 (diff)
[GFS2] Remove uneeded endian conversion
In many places GFS2 was calling the endian conversion routines for an inode even when only a single field, or a few fields might have changed. As a result we were copying lots of data needlessly. This patch replaces those calls with conversion of just the required fields in each case. This should be faster and easier to understand. There are still other places which suffer from this problem, but this is a start in the right direction. Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/gfs2/bmap.c21
-rw-r--r--fs/gfs2/inode.c4
-rw-r--r--fs/gfs2/ops_address.c14
3 files changed, 25 insertions, 14 deletions
diff --git a/fs/gfs2/bmap.c b/fs/gfs2/bmap.c
index 92eef825167d..cc57f2ecd219 100644
--- a/fs/gfs2/bmap.c
+++ b/fs/gfs2/bmap.c
@@ -121,6 +121,7 @@ static int gfs2_unstuffer_page(struct gfs2_inode *ip, struct buffer_head *dibh,
121int gfs2_unstuff_dinode(struct gfs2_inode *ip, struct page *page) 121int gfs2_unstuff_dinode(struct gfs2_inode *ip, struct page *page)
122{ 122{
123 struct buffer_head *bh, *dibh; 123 struct buffer_head *bh, *dibh;
124 struct gfs2_dinode *di;
124 u64 block = 0; 125 u64 block = 0;
125 int isdir = gfs2_is_dir(ip); 126 int isdir = gfs2_is_dir(ip);
126 int error; 127 int error;
@@ -141,8 +142,7 @@ int gfs2_unstuff_dinode(struct gfs2_inode *ip, struct page *page)
141 error = gfs2_dir_get_new_buffer(ip, block, &bh); 142 error = gfs2_dir_get_new_buffer(ip, block, &bh);
142 if (error) 143 if (error)
143 goto out_brelse; 144 goto out_brelse;
144 gfs2_buffer_copy_tail(bh, 145 gfs2_buffer_copy_tail(bh, sizeof(struct gfs2_meta_header),
145 sizeof(struct gfs2_meta_header),
146 dibh, sizeof(struct gfs2_dinode)); 146 dibh, sizeof(struct gfs2_dinode));
147 brelse(bh); 147 brelse(bh);
148 } else { 148 } else {
@@ -157,18 +157,17 @@ int gfs2_unstuff_dinode(struct gfs2_inode *ip, struct page *page)
157 /* Set up the pointer to the new block */ 157 /* Set up the pointer to the new block */
158 158
159 gfs2_trans_add_bh(ip->i_gl, dibh, 1); 159 gfs2_trans_add_bh(ip->i_gl, dibh, 1);
160 160 di = (struct gfs2_dinode *)dibh->b_data;
161 gfs2_buffer_clear_tail(dibh, sizeof(struct gfs2_dinode)); 161 gfs2_buffer_clear_tail(dibh, sizeof(struct gfs2_dinode));
162 162
163 if (ip->i_di.di_size) { 163 if (ip->i_di.di_size) {
164 *(u64 *)(dibh->b_data + sizeof(struct gfs2_dinode)) = 164 *(__be64 *)(di + 1) = cpu_to_be64(block);
165 cpu_to_be64(block);
166 ip->i_di.di_blocks++; 165 ip->i_di.di_blocks++;
166 di->di_blocks = cpu_to_be64(ip->i_di.di_blocks);
167 } 167 }
168 168
169 ip->i_di.di_height = 1; 169 ip->i_di.di_height = 1;
170 170 di->di_height = cpu_to_be16(1);
171 gfs2_dinode_out(&ip->i_di, dibh->b_data);
172 171
173out_brelse: 172out_brelse:
174 brelse(dibh); 173 brelse(dibh);
@@ -229,6 +228,7 @@ static int build_height(struct inode *inode, unsigned height)
229 unsigned new_height = height - ip->i_di.di_height; 228 unsigned new_height = height - ip->i_di.di_height;
230 struct buffer_head *dibh; 229 struct buffer_head *dibh;
231 struct buffer_head *blocks[GFS2_MAX_META_HEIGHT]; 230 struct buffer_head *blocks[GFS2_MAX_META_HEIGHT];
231 struct gfs2_dinode *di;
232 int error; 232 int error;
233 u64 *bp; 233 u64 *bp;
234 u64 bn; 234 u64 bn;
@@ -267,12 +267,13 @@ static int build_height(struct inode *inode, unsigned height)
267 dibh, sizeof(struct gfs2_dinode)); 267 dibh, sizeof(struct gfs2_dinode));
268 brelse(blocks[n]); 268 brelse(blocks[n]);
269 gfs2_trans_add_bh(ip->i_gl, dibh, 1); 269 gfs2_trans_add_bh(ip->i_gl, dibh, 1);
270 di = (struct gfs2_dinode *)dibh->b_data;
270 gfs2_buffer_clear_tail(dibh, sizeof(struct gfs2_dinode)); 271 gfs2_buffer_clear_tail(dibh, sizeof(struct gfs2_dinode));
271 bp = (u64 *)(dibh->b_data + sizeof(struct gfs2_dinode)); 272 *(__be64 *)(di + 1) = cpu_to_be64(bn);
272 *bp = cpu_to_be64(bn);
273 ip->i_di.di_height += new_height; 273 ip->i_di.di_height += new_height;
274 ip->i_di.di_blocks += new_height; 274 ip->i_di.di_blocks += new_height;
275 gfs2_dinode_out(&ip->i_di, dibh->b_data); 275 di->di_height = cpu_to_be16(ip->i_di.di_height);
276 di->di_blocks = cpu_to_be64(ip->i_di.di_blocks);
276 brelse(dibh); 277 brelse(dibh);
277 return error; 278 return error;
278} 279}
diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c
index 57a4c8b68587..660dc81849a6 100644
--- a/fs/gfs2/inode.c
+++ b/fs/gfs2/inode.c
@@ -1166,6 +1166,7 @@ int gfs2_glock_nq_atime(struct gfs2_holder *gh)
1166 curtime = get_seconds(); 1166 curtime = get_seconds();
1167 if (curtime - ip->i_di.di_atime >= quantum) { 1167 if (curtime - ip->i_di.di_atime >= quantum) {
1168 struct buffer_head *dibh; 1168 struct buffer_head *dibh;
1169 struct gfs2_dinode *di;
1169 1170
1170 error = gfs2_trans_begin(sdp, RES_DINODE, 0); 1171 error = gfs2_trans_begin(sdp, RES_DINODE, 0);
1171 if (error == -EROFS) 1172 if (error == -EROFS)
@@ -1180,7 +1181,8 @@ int gfs2_glock_nq_atime(struct gfs2_holder *gh)
1180 ip->i_di.di_atime = curtime; 1181 ip->i_di.di_atime = curtime;
1181 1182
1182 gfs2_trans_add_bh(ip->i_gl, dibh, 1); 1183 gfs2_trans_add_bh(ip->i_gl, dibh, 1);
1183 gfs2_dinode_out(&ip->i_di, dibh->b_data); 1184 di = (struct gfs2_dinode *)dibh->b_data;
1185 di->di_atime = cpu_to_be64(ip->i_di.di_atime);
1184 brelse(dibh); 1186 brelse(dibh);
1185 1187
1186 gfs2_trans_end(sdp); 1188 gfs2_trans_end(sdp);
diff --git a/fs/gfs2/ops_address.c b/fs/gfs2/ops_address.c
index 811f4ada2a01..4fb743f4e4a4 100644
--- a/fs/gfs2/ops_address.c
+++ b/fs/gfs2/ops_address.c
@@ -460,7 +460,8 @@ static int gfs2_commit_write(struct file *file, struct page *page,
460 struct gfs2_sbd *sdp = GFS2_SB(inode); 460 struct gfs2_sbd *sdp = GFS2_SB(inode);
461 int error = -EOPNOTSUPP; 461 int error = -EOPNOTSUPP;
462 struct buffer_head *dibh; 462 struct buffer_head *dibh;
463 struct gfs2_alloc *al = &ip->i_alloc;; 463 struct gfs2_alloc *al = &ip->i_alloc;
464 struct gfs2_dinode *di;
464 465
465 if (gfs2_assert_withdraw(sdp, gfs2_glock_is_locked_by_me(ip->i_gl))) 466 if (gfs2_assert_withdraw(sdp, gfs2_glock_is_locked_by_me(ip->i_gl)))
466 goto fail_nounlock; 467 goto fail_nounlock;
@@ -470,6 +471,7 @@ static int gfs2_commit_write(struct file *file, struct page *page,
470 goto fail_endtrans; 471 goto fail_endtrans;
471 472
472 gfs2_trans_add_bh(ip->i_gl, dibh, 1); 473 gfs2_trans_add_bh(ip->i_gl, dibh, 1);
474 di = (struct gfs2_dinode *)dibh->b_data;
473 475
474 if (gfs2_is_stuffed(ip)) { 476 if (gfs2_is_stuffed(ip)) {
475 u64 file_size; 477 u64 file_size;
@@ -495,10 +497,16 @@ static int gfs2_commit_write(struct file *file, struct page *page,
495 goto fail; 497 goto fail;
496 } 498 }
497 499
498 if (ip->i_di.di_size < inode->i_size) 500 if (ip->i_di.di_size < inode->i_size) {
499 ip->i_di.di_size = inode->i_size; 501 ip->i_di.di_size = inode->i_size;
502 di->di_size = cpu_to_be64(inode->i_size);
503 }
504
505 di->di_mode = cpu_to_be32(inode->i_mode);
506 di->di_atime = cpu_to_be64(inode->i_atime.tv_sec);
507 di->di_mtime = cpu_to_be64(inode->i_mtime.tv_sec);
508 di->di_ctime = cpu_to_be64(inode->i_ctime.tv_sec);
500 509
501 gfs2_dinode_out(&ip->i_di, dibh->b_data);
502 brelse(dibh); 510 brelse(dibh);
503 gfs2_trans_end(sdp); 511 gfs2_trans_end(sdp);
504 if (al->al_requested) { 512 if (al->al_requested) {