From: Andreas Gruenbacher Date: Tue, 12 Dec 2017 15:47:20 +0000 (+0100) Subject: gfs2: Remove minor gfs2_journaled_truncate inefficiencies X-Git-Tag: v4.19~1725^2~10^2~7 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e7fdf0040660c2fa184ef176c02907a98bb6f5f5;p=platform%2Fkernel%2Flinux-rpi.git gfs2: Remove minor gfs2_journaled_truncate inefficiencies First, this function truncates the file in chunks. When the original file size isn't block aligned, each chunk that is truncated will remain be misaligned. This is inefficient. Second, this function doesn't recognize where holes are, so it loops through them. For each chunk of a hole, it creates a new transaction. At least avoid creating another transactions whe the current one is still empty. (An better fix would be to skip large holes, of course.) Signed-off-by: Andreas Gruenbacher Signed-off-by: Bob Peterson --- diff --git a/fs/gfs2/bmap.c b/fs/gfs2/bmap.c index 963117f..de0c3e3 100644 --- a/fs/gfs2/bmap.c +++ b/fs/gfs2/bmap.c @@ -1003,11 +1003,24 @@ static int gfs2_journaled_truncate(struct inode *inode, u64 oldsize, u64 newsize int error; while (oldsize != newsize) { + struct gfs2_trans *tr; + unsigned int offs; + chunk = oldsize - newsize; if (chunk > max_chunk) chunk = max_chunk; + + offs = oldsize & ~PAGE_MASK; + if (offs && chunk > PAGE_SIZE) + chunk = offs + ((chunk - offs) & PAGE_MASK); + truncate_pagecache(inode, oldsize - chunk); oldsize -= chunk; + + tr = current->journal_info; + if (!test_bit(TR_TOUCHED, &tr->tr_flags)) + continue; + gfs2_trans_end(sdp); error = gfs2_trans_begin(sdp, RES_DINODE, GFS2_JTRUNC_REVOKES); if (error)