fs/reiser4/plugin/file/file.c |    7 ++++---
1 files changed, 4 insertions(+), 3 deletions(-)

Index: linux-2.6.16/fs/reiser4/plugin/file/file.c
===================================================================
--- linux-2.6.16.orig/fs/reiser4/plugin/file/file.c
+++ linux-2.6.16/fs/reiser4/plugin/file/file.c
@@ -1633,14 +1633,18 @@ static size_t read_file(hint_t * hint, s
                       /* error happened */
                       break;

-               if (coord->between != AT_UNIT)
+               if (coord->between != AT_UNIT) {
                       /* there were no items corresponding to given offset */
+                       done_lh(hint->ext_coord.lh);
                       break;
+               }

               loaded = coord->node;
               result = zload(loaded);
-               if (unlikely(result))
+               if (unlikely(result)) {
+                       done_lh(hint->ext_coord.lh);
                       break;
+               }

               if (hint->ext_coord.valid == 0)
                       validate_extended_coord(&hint->ext_coord,
@@ -1725,13 +1729,15 @@ ssize_t read_unix_file(struct file *file
                       left = size - *off;

               /* faultin user page */
-               result = fault_in_pages_writeable(buf, left > PAGE_CACHE_SIZE ? PAGE_CACHE_SIZE : left);
-               if (result) {
+               if(fault_in_pages_writeable(buf, left > PAGE_CACHE_SIZE ? PAGE_CACHE_SIZE : left)) {
                       drop_nonexclusive_access(uf_info);
-                       return RETERR(-EFAULT);
+                       result = RETERR(-EFAULT);
+                       break;
               }

-               read = read_file(hint, file, buf, left, off);
+               read = read_file(hint, file, buf,
+                                left > PAGE_CACHE_SIZE ? PAGE_CACHE_SIZE : left,
+                                off);

               drop_nonexclusive_access(uf_info);

@@ -1748,6 +1754,7 @@ ssize_t read_unix_file(struct file *file
               count += read;
       }
       save_file_hint(file, hint);
+       done_lh(&hint->lh);
       kfree(hint);

       if (count) {
Index: linux-2.6.16/fs/reiser4/as_ops.c
===================================================================
--- linux-2.6.16.orig/fs/reiser4/as_ops.c
+++ linux-2.6.16/fs/reiser4/as_ops.c
@@ -350,6 +350,9 @@ int reiser4_releasepage(struct page *pag
       if (PageDirty(page))
               return 0;

+       if (page_count(page) > 3)
+               return 0;
+
       /* releasable() needs jnode lock, because it looks at the jnode fields
        * and we need jload_lock here to avoid races with jload(). */
       spin_lock_jnode(node);