From: Steven Whitehouse <swhiteho@redhat.com>
To: linux-kernel@vger.kernel.org, cluster-devel@redhat.com
Cc: Steven Whitehouse <swhiteho@redhat.com>
Subject: [PATCH 07/16] GFS2: Fix truncation of journaled data files
Date: Fri, 30 Nov 2012 09:52:12 +0000 [thread overview]
Message-ID: <1354269141-3311-8-git-send-email-swhiteho@redhat.com> (raw)
In-Reply-To: <1354269141-3311-1-git-send-email-swhiteho@redhat.com>
This patch fixes an issue relating to not having enough revokes
available when truncating journaled data files. In order to ensure
that we do no run out, the truncation is broken into separate pieces
if it is large enough.
Tested using fsx on a journaled data file.
Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
diff --git a/fs/gfs2/bmap.c b/fs/gfs2/bmap.c
index de70e52..a68e91b 100644
--- a/fs/gfs2/bmap.c
+++ b/fs/gfs2/bmap.c
@@ -991,6 +991,41 @@ unlock:
return err;
}
+/**
+ * gfs2_journaled_truncate - Wrapper for truncate_pagecache for jdata files
+ * @inode: The inode being truncated
+ * @oldsize: The original (larger) size
+ * @newsize: The new smaller size
+ *
+ * With jdata files, we have to journal a revoke for each block which is
+ * truncated. As a result, we need to split this into separate transactions
+ * if the number of pages being truncated gets too large.
+ */
+
+#define GFS2_JTRUNC_REVOKES 8192
+
+static int gfs2_journaled_truncate(struct inode *inode, u64 oldsize, u64 newsize)
+{
+ struct gfs2_sbd *sdp = GFS2_SB(inode);
+ u64 max_chunk = GFS2_JTRUNC_REVOKES * sdp->sd_vfs->s_blocksize;
+ u64 chunk;
+ int error;
+
+ while (oldsize != newsize) {
+ chunk = oldsize - newsize;
+ if (chunk > max_chunk)
+ chunk = max_chunk;
+ truncate_pagecache(inode, oldsize, oldsize - chunk);
+ oldsize -= chunk;
+ gfs2_trans_end(sdp);
+ error = gfs2_trans_begin(sdp, RES_DINODE, GFS2_JTRUNC_REVOKES);
+ if (error)
+ return error;
+ }
+
+ return 0;
+}
+
static int trunc_start(struct inode *inode, u64 oldsize, u64 newsize)
{
struct gfs2_inode *ip = GFS2_I(inode);
@@ -1000,8 +1035,10 @@ static int trunc_start(struct inode *inode, u64 oldsize, u64 newsize)
int journaled = gfs2_is_jdata(ip);
int error;
- error = gfs2_trans_begin(sdp,
- RES_DINODE + (journaled ? RES_JDATA : 0), 0);
+ if (journaled)
+ error = gfs2_trans_begin(sdp, RES_DINODE + RES_JDATA, GFS2_JTRUNC_REVOKES);
+ else
+ error = gfs2_trans_begin(sdp, RES_DINODE, 0);
if (error)
return error;
@@ -1026,7 +1063,16 @@ static int trunc_start(struct inode *inode, u64 oldsize, u64 newsize)
ip->i_inode.i_mtime = ip->i_inode.i_ctime = CURRENT_TIME;
gfs2_dinode_out(ip, dibh->b_data);
- truncate_pagecache(inode, oldsize, newsize);
+ if (journaled)
+ error = gfs2_journaled_truncate(inode, oldsize, newsize);
+ else
+ truncate_pagecache(inode, oldsize, newsize);
+
+ if (error) {
+ brelse(dibh);
+ return error;
+ }
+
out_brelse:
brelse(dibh);
out:
--
1.7.4
next prev parent reply other threads:[~2012-11-30 10:23 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-11-30 9:52 GFS2: Pre-pull patch posting (merge window) Steven Whitehouse
2012-11-30 9:52 ` [PATCH 01/16] GFS2: Review bug traps in glops.c Steven Whitehouse
2012-11-30 9:52 ` [PATCH 02/16] GFS2: Speed up gfs2_rbm_from_block Steven Whitehouse
2012-11-30 9:52 ` [PATCH 03/16] GFS2: Rename glops go_xmote_th to go_sync Steven Whitehouse
2012-11-30 9:52 ` [PATCH 04/16] GFS2: Add test for resource group congestion status Steven Whitehouse
2012-11-30 9:52 ` [PATCH 05/16] GFS2: Use proper allocation context for new inodes Steven Whitehouse
2012-11-30 9:52 ` [PATCH 06/16] GFS2: Add Orlov allocator Steven Whitehouse
2012-11-30 9:52 ` Steven Whitehouse [this message]
2012-11-30 9:52 ` [PATCH 08/16] GFS2: Use dirty_inode in gfs2_dir_add Steven Whitehouse
2012-11-30 9:52 ` [PATCH 09/16] GFS2: Eliminate redundant buffer_head manipulation in gfs2_unlink_inode Steven Whitehouse
2012-11-30 9:52 ` [PATCH 10/16] GFS2: Fix one RG corner case Steven Whitehouse
2012-11-30 9:52 ` [PATCH 11/16] GFS2: skip dlm_unlock calls in unmount Steven Whitehouse
2012-11-30 9:52 ` [PATCH 12/16] GFS2: only use lvb on glocks that need it Steven Whitehouse
2012-11-30 9:52 ` [PATCH 13/16] GFS2: remove redundant lvb pointer Steven Whitehouse
2012-11-30 9:52 ` [PATCH 14/16] GFS2: don't reference inode's glock during block allocation trace Steven Whitehouse
2012-11-30 9:52 ` [PATCH 15/16] GFS2: add error check while allocating new inodes Steven Whitehouse
2012-11-30 9:52 ` [PATCH 16/16] GFS2: Set gl_object during inode create Steven Whitehouse
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1354269141-3311-8-git-send-email-swhiteho@redhat.com \
--to=swhiteho@redhat.com \
--cc=cluster-devel@redhat.com \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®