Use a tighter bound for the number of blocks required by transactions in
gfs2_trans_begin: in the worst case, we'll have mixed data and metadata,
so we'll need a log desciptor for each type.

Signed-off-by: Andreas Gruenbacher <agrue...@redhat.com>
---
 fs/gfs2/trans.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/fs/gfs2/trans.c b/fs/gfs2/trans.c
index 058492cf44fa..3675e92f2857 100644
--- a/fs/gfs2/trans.c
+++ b/fs/gfs2/trans.c
@@ -60,8 +60,14 @@ int __gfs2_trans_begin(struct gfs2_sbd *sdp, unsigned int 
blocks,
        tr->tr_blocks = blocks;
        tr->tr_revokes = revokes;
        tr->tr_reserved = 1;
-       if (blocks)
-               tr->tr_reserved += 6 + blocks;
+       if (blocks) {
+               /*
+                * The reserved blocks are either used for data or metadata.
+                * We can have mixed data and metadata, each with its own log
+                * descriptor block; see calc_reserved().
+                */
+               tr->tr_reserved += blocks + 1 + DIV_ROUND_UP(blocks - 1, 
databuf_limit(sdp));
+       }
        if (revokes)
                tr->tr_reserved += gfs2_struct2blk(sdp, revokes);
        INIT_LIST_HEAD(&tr->tr_databuf);
-- 
2.26.2

Reply via email to