(From Andrew Wade <[EMAIL PROTECTED]>)

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
---
fs/reiser4/plugin/item/extent_file_ops.c |   12 +++++++++---
1 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/fs/reiser4/plugin/item/extent_file_ops.c 
b/fs/reiser4/plugin/item/extent_file_ops.c
index af4c89e..7afbca3 100644
--- a/fs/reiser4/plugin/item/extent_file_ops.c
+++ b/fs/reiser4/plugin/item/extent_file_ops.c
@@ -1313,20 +1313,22 @@ static int extent_readpage_filler(void *data, struct 
page *page)
                                      TWIG_LEVEL, CBK_UNIQUE, NULL);
                if (result != CBK_COORD_FOUND) {
                        unset_hint(hint);
-                       return result;
+                       goto out;
                }
                ext_coord->valid = 0;
        }

        if (zload(ext_coord->coord.node)) {
                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);
                unset_hint(hint);
-               return RETERR(-EIO);
+               result = RETERR(-EIO);
+               goto out;
        }

        if (ext_coord->valid == 0)
@@ -1351,6 +1353,10 @@ static int extent_readpage_filler(void *data, struct 
page *page)
        } else
                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;
}

-- 1.4.4.1.gaed4




Reply via email to