Skip to content

Commit

Permalink
[GFS2] Reduce truncate IO traffic
Browse files Browse the repository at this point in the history
Current GFS2 setattr call unconditionally invokes do_shrink even the
requested size and actual file size are equal. This has generated large
amount of extra IOs found during NFS benchmark runs. This patch moves
the relevant logic out of shrink code path. Since setattr is a system
call, the time stamps update is still required.

Signed-off-by: S. Wendy Cheng <wcheng@redhat.com>
Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
  • Loading branch information
Wendy Cheng authored and Steven Whitehouse committed Oct 10, 2007
1 parent 9a5ad13 commit a13b8c5
Showing 1 changed file with 31 additions and 1 deletion.
32 changes: 31 additions & 1 deletion fs/gfs2/bmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -1085,6 +1085,33 @@ static int do_shrink(struct gfs2_inode *ip, u64 size)
return error;
}

static int do_touch(struct gfs2_inode *ip, u64 size)
{
struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
struct buffer_head *dibh;
int error;

error = gfs2_trans_begin(sdp, RES_DINODE, 0);
if (error)
return error;

down_write(&ip->i_rw_mutex);

error = gfs2_meta_inode_buffer(ip, &dibh);
if (error)
goto do_touch_out;

ip->i_inode.i_mtime = ip->i_inode.i_ctime = CURRENT_TIME;
gfs2_trans_add_bh(ip->i_gl, dibh, 1);
gfs2_dinode_out(ip, dibh->b_data);
brelse(dibh);

do_touch_out:
up_write(&ip->i_rw_mutex);
gfs2_trans_end(sdp);
return error;
}

/**
* gfs2_truncatei - make a file a given size
* @ip: the inode
Expand All @@ -1105,8 +1132,11 @@ int gfs2_truncatei(struct gfs2_inode *ip, u64 size)

if (size > ip->i_di.di_size)
error = do_grow(ip, size);
else
else if (size < ip->i_di.di_size)
error = do_shrink(ip, size);
else
/* update time stamps */
error = do_touch(ip, size);

return error;
}
Expand Down

0 comments on commit a13b8c5

Please sign in to comment.