summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAbhijith Das <adas@redhat.com>2011-02-07 17:22:41 +0100
committerSteven Whitehouse <swhiteho@redhat.com>2011-02-07 21:00:44 +0100
commite79a46a0302a6bf8f879da43c00373b6ed1081ea (patch)
treea9061e1a3f1c9e8616ed08f5cff95321b6dc1b8c
parentGFS2: Improve cluster mmap scalability (diff)
downloadlinux-e79a46a0302a6bf8f879da43c00373b6ed1081ea.tar.xz
linux-e79a46a0302a6bf8f879da43c00373b6ed1081ea.zip
GFS2: panics on quotacheck update
Handle block allocation for forceful unstuffing of quota dinode during quota update using quotactl(). Also fix block reservation for special cases when quotas cross over block boundaries and update 2 blocks instead of 1. Signed-off-by: Abhi Das <adas@redhat.com> Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
-rw-r--r--fs/gfs2/quota.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/fs/gfs2/quota.c b/fs/gfs2/quota.c
index a689901963de..6ec964c31dc6 100644
--- a/fs/gfs2/quota.c
+++ b/fs/gfs2/quota.c
@@ -1587,6 +1587,8 @@ static int gfs2_set_dqblk(struct super_block *sb, int type, qid_t id,
offset = qd2offset(qd);
alloc_required = gfs2_write_alloc_required(ip, offset, sizeof(struct gfs2_quota));
+ if (gfs2_is_stuffed(ip))
+ alloc_required = 1;
if (alloc_required) {
al = gfs2_alloc_get(ip);
if (al == NULL)
@@ -1600,7 +1602,9 @@ static int gfs2_set_dqblk(struct super_block *sb, int type, qid_t id,
blocks += gfs2_rg_blocks(al);
}
- error = gfs2_trans_begin(sdp, blocks + RES_DINODE + 1, 0);
+ /* Some quotas span block boundaries and can update two blocks,
+ adding an extra block to the transaction to handle such quotas */
+ error = gfs2_trans_begin(sdp, blocks + RES_DINODE + 2, 0);
if (error)
goto out_release;