GFS2: Reserve journal space for quota change in do_grow
authorBob Peterson <rpeterso@redhat.com>
Thu, 27 Jun 2013 16:47:51 +0000 (12:47 -0400)
committerSteven Whitehouse <swhiteho@redhat.com>
Thu, 27 Jun 2013 17:16:27 +0000 (18:16 +0100)
If a GFS2 file system is mounted with quotas and a file is grown
in such a way that its free blocks for the allocation are represented
in a secondary bitmap, GFS2 ran out of blocks in the transaction.
That resulted in "fatal: assertion "tr->tr_num_buf <= tr->tr_blocks".
This patch reserves extra blocks for the quota change so the
transaction has enough space.

Signed-off-by: Bob Peterson <rpeterso@redhat.com>
Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
fs/gfs2/bmap.c

index 93b5809c20bb347a9de3e5f0d46949c3dcf78dc5..5e2f56fccf6b3dfd516c04bd01649852dd1e855d 100644 (file)
@@ -1232,7 +1232,9 @@ static int do_grow(struct inode *inode, u64 size)
                unstuff = 1;
        }
 
-       error = gfs2_trans_begin(sdp, RES_DINODE + RES_STATFS + RES_RG_BIT, 0);
+       error = gfs2_trans_begin(sdp, RES_DINODE + RES_STATFS + RES_RG_BIT +
+                                (sdp->sd_args.ar_quota == GFS2_QUOTA_OFF ?
+                                 0 : RES_QUOTA), 0);
        if (error)
                goto do_grow_release;