Commit:     172e045a7fcc3ee647fa70dbd585a3c247b49cb2
Parent:     6883562588bc6c70776ecc396ee7eda36c2c8da9
Author:     Benjamin Marzinski <[EMAIL PROTECTED]>
AuthorDate: Fri Mar 23 14:51:56 2007 -0600
Committer:  Steven Whitehouse <[EMAIL PROTECTED]>
CommitDate: Tue May 1 09:10:52 2007 +0100

    [GFS2] flush the log if a transaction can't allocate space
    This is a fix for bz #208514. When GFS2 frees up space, the freed blocks
    aren't available for reuse until the resource group is successfully written
    to the ondisk journal. So in rare cases, GFS2 operations will fail, saying
    that the filesystem is out of space, when in reality, you are just waiting 
    a log flush. For instance, on a 1Gig filesystem, if I continually write 10 
    to a file, and then truncate it, after a hundred interations, the write will
    fail with -ENOSPC, even though the filesystem is just 1% full.
    The attached patch calls a log flush in these cases.  I tested this patch
    fairly heavily to check if there were any locking issues that I missed, and
    it seems to work just fine. Also, this patch only does the log flush if
    get_local_rgrp makes a complete loop of resource groups without skipping
    any do to locking issues. The code would be slightly simpler if it just 
    did the log flush after the first failed pass, and you could only ever have
    to go through the loop twice, instead of up to three times. However, I 
    that failing to find a rg simply do to locking issues would be common enough
    to skip the log flush in that case, but I'm not certain that this is the 
    way to go. Either way, I don't suppose this code will be hit all that often.
    Signed-off-by: Benjamin E. Marzinski <[EMAIL PROTECTED]>
    Signed-off-by: Steven Whitehouse <[EMAIL PROTECTED]>
 fs/gfs2/rgrp.c |    7 ++++++-
 1 files changed, 6 insertions(+), 1 deletions(-)

diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c
index 8d9c08b..2ce48d4 100644
--- a/fs/gfs2/rgrp.c
+++ b/fs/gfs2/rgrp.c
@@ -27,6 +27,7 @@
 #include "trans.h"
 #include "ops_file.h"
 #include "util.h"
+#include "log.h"
 #define BFITNOENT ((u32)~0)
@@ -941,9 +942,13 @@ static int get_local_rgrp(struct gfs2_inode *ip)
                        rgd = gfs2_rgrpd_get_first(sdp);
                if (rgd == begin) {
-                       if (++loops >= 2 || !skipped)
+                       if (++loops >= 3)
                                return -ENOSPC;
+                       if (!skipped)
+                               loops++;
                        flags = 0;
+                       if (loops == 2)
+                               gfs2_log_flush(sdp, NULL);
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at

Reply via email to