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;
}