Commit 48516ced authored by Steven Whitehouse's avatar Steven Whitehouse

[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: default avatarSteven Whitehouse <swhiteho@redhat.com>
parent 3cf1e7be
...@@ -121,6 +121,7 @@ static int gfs2_unstuffer_page(struct gfs2_inode *ip, struct buffer_head *dibh, ...@@ -121,6 +121,7 @@ static int gfs2_unstuffer_page(struct gfs2_inode *ip, struct buffer_head *dibh,
int gfs2_unstuff_dinode(struct gfs2_inode *ip, struct page *page) int gfs2_unstuff_dinode(struct gfs2_inode *ip, struct page *page)
{ {
struct buffer_head *bh, *dibh; struct buffer_head *bh, *dibh;
struct gfs2_dinode *di;
u64 block = 0; u64 block = 0;
int isdir = gfs2_is_dir(ip); int isdir = gfs2_is_dir(ip);
int error; int error;
...@@ -141,8 +142,7 @@ int gfs2_unstuff_dinode(struct gfs2_inode *ip, struct page *page) ...@@ -141,8 +142,7 @@ int gfs2_unstuff_dinode(struct gfs2_inode *ip, struct page *page)
error = gfs2_dir_get_new_buffer(ip, block, &bh); error = gfs2_dir_get_new_buffer(ip, block, &bh);
if (error) if (error)
goto out_brelse; goto out_brelse;
gfs2_buffer_copy_tail(bh, gfs2_buffer_copy_tail(bh, sizeof(struct gfs2_meta_header),
sizeof(struct gfs2_meta_header),
dibh, sizeof(struct gfs2_dinode)); dibh, sizeof(struct gfs2_dinode));
brelse(bh); brelse(bh);
} else { } else {
...@@ -157,18 +157,17 @@ int gfs2_unstuff_dinode(struct gfs2_inode *ip, struct page *page) ...@@ -157,18 +157,17 @@ int gfs2_unstuff_dinode(struct gfs2_inode *ip, struct page *page)
/* Set up the pointer to the new block */ /* Set up the pointer to the new block */
gfs2_trans_add_bh(ip->i_gl, dibh, 1); gfs2_trans_add_bh(ip->i_gl, dibh, 1);
di = (struct gfs2_dinode *)dibh->b_data;
gfs2_buffer_clear_tail(dibh, sizeof(struct gfs2_dinode)); gfs2_buffer_clear_tail(dibh, sizeof(struct gfs2_dinode));
if (ip->i_di.di_size) { if (ip->i_di.di_size) {
*(u64 *)(dibh->b_data + sizeof(struct gfs2_dinode)) = *(__be64 *)(di + 1) = cpu_to_be64(block);
cpu_to_be64(block);
ip->i_di.di_blocks++; ip->i_di.di_blocks++;
di->di_blocks = cpu_to_be64(ip->i_di.di_blocks);
} }
ip->i_di.di_height = 1; ip->i_di.di_height = 1;
di->di_height = cpu_to_be16(1);
gfs2_dinode_out(&ip->i_di, dibh->b_data);
out_brelse: out_brelse:
brelse(dibh); brelse(dibh);
...@@ -229,6 +228,7 @@ static int build_height(struct inode *inode, unsigned height) ...@@ -229,6 +228,7 @@ static int build_height(struct inode *inode, unsigned height)
unsigned new_height = height - ip->i_di.di_height; unsigned new_height = height - ip->i_di.di_height;
struct buffer_head *dibh; struct buffer_head *dibh;
struct buffer_head *blocks[GFS2_MAX_META_HEIGHT]; struct buffer_head *blocks[GFS2_MAX_META_HEIGHT];
struct gfs2_dinode *di;
int error; int error;
u64 *bp; u64 *bp;
u64 bn; u64 bn;
...@@ -267,12 +267,13 @@ static int build_height(struct inode *inode, unsigned height) ...@@ -267,12 +267,13 @@ static int build_height(struct inode *inode, unsigned height)
dibh, sizeof(struct gfs2_dinode)); dibh, sizeof(struct gfs2_dinode));
brelse(blocks[n]); brelse(blocks[n]);
gfs2_trans_add_bh(ip->i_gl, dibh, 1); gfs2_trans_add_bh(ip->i_gl, dibh, 1);
di = (struct gfs2_dinode *)dibh->b_data;
gfs2_buffer_clear_tail(dibh, sizeof(struct gfs2_dinode)); gfs2_buffer_clear_tail(dibh, sizeof(struct gfs2_dinode));
bp = (u64 *)(dibh->b_data + sizeof(struct gfs2_dinode)); *(__be64 *)(di + 1) = cpu_to_be64(bn);
*bp = cpu_to_be64(bn);
ip->i_di.di_height += new_height; ip->i_di.di_height += new_height;
ip->i_di.di_blocks += new_height; ip->i_di.di_blocks += new_height;
gfs2_dinode_out(&ip->i_di, dibh->b_data); di->di_height = cpu_to_be16(ip->i_di.di_height);
di->di_blocks = cpu_to_be64(ip->i_di.di_blocks);
brelse(dibh); brelse(dibh);
return error; return error;
} }
......
...@@ -1166,6 +1166,7 @@ int gfs2_glock_nq_atime(struct gfs2_holder *gh) ...@@ -1166,6 +1166,7 @@ int gfs2_glock_nq_atime(struct gfs2_holder *gh)
curtime = get_seconds(); curtime = get_seconds();
if (curtime - ip->i_di.di_atime >= quantum) { if (curtime - ip->i_di.di_atime >= quantum) {
struct buffer_head *dibh; struct buffer_head *dibh;
struct gfs2_dinode *di;
error = gfs2_trans_begin(sdp, RES_DINODE, 0); error = gfs2_trans_begin(sdp, RES_DINODE, 0);
if (error == -EROFS) if (error == -EROFS)
...@@ -1180,7 +1181,8 @@ int gfs2_glock_nq_atime(struct gfs2_holder *gh) ...@@ -1180,7 +1181,8 @@ int gfs2_glock_nq_atime(struct gfs2_holder *gh)
ip->i_di.di_atime = curtime; ip->i_di.di_atime = curtime;
gfs2_trans_add_bh(ip->i_gl, dibh, 1); gfs2_trans_add_bh(ip->i_gl, dibh, 1);
gfs2_dinode_out(&ip->i_di, dibh->b_data); di = (struct gfs2_dinode *)dibh->b_data;
di->di_atime = cpu_to_be64(ip->i_di.di_atime);
brelse(dibh); brelse(dibh);
gfs2_trans_end(sdp); gfs2_trans_end(sdp);
......
...@@ -460,7 +460,8 @@ static int gfs2_commit_write(struct file *file, struct page *page, ...@@ -460,7 +460,8 @@ static int gfs2_commit_write(struct file *file, struct page *page,
struct gfs2_sbd *sdp = GFS2_SB(inode); struct gfs2_sbd *sdp = GFS2_SB(inode);
int error = -EOPNOTSUPP; int error = -EOPNOTSUPP;
struct buffer_head *dibh; struct buffer_head *dibh;
struct gfs2_alloc *al = &ip->i_alloc;; struct gfs2_alloc *al = &ip->i_alloc;
struct gfs2_dinode *di;
if (gfs2_assert_withdraw(sdp, gfs2_glock_is_locked_by_me(ip->i_gl))) if (gfs2_assert_withdraw(sdp, gfs2_glock_is_locked_by_me(ip->i_gl)))
goto fail_nounlock; goto fail_nounlock;
...@@ -470,6 +471,7 @@ static int gfs2_commit_write(struct file *file, struct page *page, ...@@ -470,6 +471,7 @@ static int gfs2_commit_write(struct file *file, struct page *page,
goto fail_endtrans; goto fail_endtrans;
gfs2_trans_add_bh(ip->i_gl, dibh, 1); gfs2_trans_add_bh(ip->i_gl, dibh, 1);
di = (struct gfs2_dinode *)dibh->b_data;
if (gfs2_is_stuffed(ip)) { if (gfs2_is_stuffed(ip)) {
u64 file_size; u64 file_size;
...@@ -495,10 +497,16 @@ static int gfs2_commit_write(struct file *file, struct page *page, ...@@ -495,10 +497,16 @@ static int gfs2_commit_write(struct file *file, struct page *page,
goto fail; goto fail;
} }
if (ip->i_di.di_size < inode->i_size) if (ip->i_di.di_size < inode->i_size) {
ip->i_di.di_size = inode->i_size; ip->i_di.di_size = inode->i_size;
di->di_size = cpu_to_be64(inode->i_size);
}
di->di_mode = cpu_to_be32(inode->i_mode);
di->di_atime = cpu_to_be64(inode->i_atime.tv_sec);
di->di_mtime = cpu_to_be64(inode->i_mtime.tv_sec);
di->di_ctime = cpu_to_be64(inode->i_ctime.tv_sec);
gfs2_dinode_out(&ip->i_di, dibh->b_data);
brelse(dibh); brelse(dibh);
gfs2_trans_end(sdp); gfs2_trans_end(sdp);
if (al->al_requested) { if (al->al_requested) {
......
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