Skip to content

Commit

Permalink
gfs2: Remove minor gfs2_journaled_truncate inefficiencies
Browse files Browse the repository at this point in the history
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 <agruenba@redhat.com>
Signed-off-by: Bob Peterson <rpeterso@redhat.com>
  • Loading branch information
Andreas Gruenbacher authored and Bob Peterson committed Jan 17, 2018
1 parent 8b5860a commit e7fdf00
Showing 1 changed file with 13 additions and 0 deletions.
13 changes: 13 additions & 0 deletions fs/gfs2/bmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit e7fdf00

Please sign in to comment.