Hello Alexander,

In addition to your patch, I've also applied the patch below. With
these two patches the fs is much more stable for me.

However, something is holding a d_ref across the calls to
reiser4_writepage. It's not clear to me that this is allowed so my
patch may not be a full fix.

Andrew Wade

signed-off-by: <[EMAIL PROTECTED]>

diff -rupN a/fs/reiser4/plugin/item/extent_file_ops.c 
b/fs/reiser4/plugin/item/extent_file_ops.c
--- a/fs/reiser4/plugin/item/extent_file_ops.c  2006-08-28 11:30:33.000000000 
-0400
+++ b/fs/reiser4/plugin/item/extent_file_ops.c  2006-08-29 13:06:20.000000000 
-0400
@@ -1320,20 +1320,22 @@ static int extent_readpage_filler(void *
                                      TWIG_LEVEL, CBK_UNIQUE, NULL);
                if (result != CBK_COORD_FOUND) {
                        reiser4_unset_hint(hint);
-                       return result;
+                       goto out;
                }
                ext_coord->valid = 0;
        }
 
        if (zload(ext_coord->coord.node)) {
                reiser4_unset_hint(hint);
-               return RETERR(-EIO);
+               result = RETERR(-EIO);
+               goto out;
        }
        if (!item_is_extent(&ext_coord->coord)) {
                /* tail conversion is running in parallel */
                zrelse(ext_coord->coord.node);
                reiser4_unset_hint(hint);
-               return RETERR(-EIO);
+               result = RETERR(-EIO);
+               goto out;
        }
 
        if (ext_coord->valid == 0)
@@ -1358,6 +1360,10 @@ static int extent_readpage_filler(void *
        } else
                reiser4_unset_hint(hint);
        zrelse(ext_coord->coord.node);
+
+out:
+       /* Calls to this function may be intermingled with VM writeback. */
+       reiser4_txn_restart_current();
        return result;
 }
 

Reply via email to