Hi guys, as I am heavily using reiser4 for some time now on my stable machine, I keep a git tree with vanilla -stable and reiser4 since -mm has sometimes been too unreliable. Lurking on this list I collected some patches, of which two seem to collide. The first one fixes a nasty "out of memory?" Oops for me and maybe others, and the second one was posted as a response to other Oopses on the list.
Since I reversed the first one in order to apply the second one, thinking (wrongly) that this one should be a better fix for the same issues and maybe more, I have my old pal out of memory back. Maybe the two should be merged in a compatible way, and a new patch against 2.6.16-stable be put on the namesys ftp server? Anyway, here come the patches in question: From: Alexander Zarochentsev <[EMAIL PROTECTED]> To: reiserfs-list@namesys.com Subject: Re: "warning("vs-44", "out of memory?")" Date: Wed, 12 Apr 2006 14:26:59 +0400 On Wednesday 12 April 2006 13:06, Alexander Zarochentsev wrote: > Hello > > On Wednesday 12 April 2006 11:42, Roy Lanek wrote: > > I have managed to save a copy of my > > /var/log/socklog-klog/others/current > > before the next complete freezing happened. > > Please use the latest reiser4 patch reiser4-for-2.6.16-2 from > ftp.namesys.com. and apply the following patch: Index: linux-2.6.17-rc1-mm1/fs/reiser4/plugin/item/extent_file_ops.c =================================================================== --- linux-2.6.17-rc1-mm1.orig/fs/reiser4/plugin/item/extent_file_ops.c +++ linux-2.6.17-rc1-mm1/fs/reiser4/plugin/item/extent_file_ops.c @@ -807,7 +807,7 @@ extent_balance_dirty_pages(struct inode if (excl) get_exclusive_access(uf_info); else - get_nonexclusive_access(uf_info, 0); + get_nonexclusive_access(uf_info, 1); } return 0; } Index: linux-2.6.17-rc1-mm1/fs/reiser4/plugin/item/tail.c =================================================================== --- linux-2.6.17-rc1-mm1.orig/fs/reiser4/plugin/item/tail.c +++ linux-2.6.17-rc1-mm1/fs/reiser4/plugin/item/tail.c @@ -510,7 +510,7 @@ tail_balance_dirty_pages(struct address_ if (excl) get_exclusive_access(uf_info); else - get_nonexclusive_access(uf_info, 0); + get_nonexclusive_access(uf_info, 1); } return 0; } This one helped me a lot. The second one brought older problems back, but may have fixed others for some people on this list. It seems to remove the second argument to get_nonexclusive_access(), though: From: Alexander Zarochentsev <[EMAIL PROTECTED]> To: reiserfs-list@namesys.com Subject: Re: Reproducible reiser4 bug with 2.6.16.2 patch on tail_conversion.c:80 Date: Thu, 11 May 2006 11:24:53 +0400 --Boundary-00=_FbuYEKWWhFAJ/IU Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-Disposition: inline Hello [original message snipped] please check whether the attached patch helps. -- Alex. --Boundary-00=_FbuYEKWWhFAJ/IU Content-Type: text/x-diff; charset="iso-8859-1"; name="reiser4-remove-atom_may_exists-from-get_nea.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="reiser4-remove-atom_may_exists-from-get_nea.diff" fs/reiser4/plugin/file/file.c | 17 ++++++++--------- fs/reiser4/plugin/file/file.h | 2 +- fs/reiser4/plugin/file/funcs.h | 5 ----- fs/reiser4/plugin/file/tail_conversion.c | 12 +++--------- fs/reiser4/plugin/item/extent_file_ops.c | 3 ++- fs/reiser4/plugin/item/tail.c | 3 ++- 6 files changed, 16 insertions(+), 26 deletions(-) Index: linux-2.6.17-rc3-mm1/fs/reiser4/plugin/item/extent_file_ops.c =================================================================== --- linux-2.6.17-rc3-mm1.orig/fs/reiser4/plugin/item/extent_file_ops.c +++ linux-2.6.17-rc3-mm1/fs/reiser4/plugin/item/extent_file_ops.c @@ -804,10 +804,11 @@ extent_balance_dirty_pages(struct inode f->length > PAGE_CACHE_SIZE ? PAGE_CACHE_SIZE : f->length); + txn_restart_current(); if (excl) get_exclusive_access(uf_info); else - get_nonexclusive_access(uf_info, 0); + get_nonexclusive_access(uf_info); } return 0; } Index: linux-2.6.17-rc3-mm1/fs/reiser4/plugin/item/tail.c =================================================================== --- linux-2.6.17-rc3-mm1.orig/fs/reiser4/plugin/item/tail.c +++ linux-2.6.17-rc3-mm1/fs/reiser4/plugin/item/tail.c @@ -507,10 +507,11 @@ tail_balance_dirty_pages(struct address_ } else drop_nonexclusive_access(uf_info); reiser4_throttle_write(inode); + txn_restart_current(); if (excl) get_exclusive_access(uf_info); else - get_nonexclusive_access(uf_info, 0); + get_nonexclusive_access(uf_info); } return 0; } Index: linux-2.6.17-rc3-mm1/fs/reiser4/plugin/file/file.c =================================================================== --- linux-2.6.17-rc3-mm1.orig/fs/reiser4/plugin/file/file.c +++ linux-2.6.17-rc3-mm1/fs/reiser4/plugin/file/file.c @@ -1597,7 +1597,7 @@ writepages_unix_file(struct address_spac break; } } else - get_nonexclusive_access(uf_info, 0); + get_nonexclusive_access(uf_info); while (to_capture > 0) { pgoff_t start; @@ -2023,7 +2023,7 @@ read_unix_file(struct file *file, char _ while (left > 0) { txn_restart_current(); - get_nonexclusive_access(uf_info, 0); + get_nonexclusive_access(uf_info); size = i_size_read(inode); if (*off >= size) { @@ -2177,7 +2177,7 @@ append_and_or_overwrite(hint_t * hint, s if (!exclusive) { drop_exclusive_access(uf_info); txn_restart_current(); - get_nonexclusive_access(uf_info, 0); + get_nonexclusive_access(uf_info); } if (result) return result; @@ -2531,19 +2531,18 @@ ssize_t write_unix_file(struct file *fil while (left > 0) { int excl = 0; - /* getting exclusive or not exclusive access requires no - transaction open */ - txn_restart_current(); - /* faultin user page */ fault_in_pages_readable(buf, left > PAGE_CACHE_SIZE ? PAGE_CACHE_SIZE : left); + /* getting exclusive or not exclusive access requires no + transaction open */ + txn_restart_current(); if (inode->i_size == 0) { get_exclusive_access(uf_info); excl = 1; } else { - get_nonexclusive_access(uf_info, 0); + get_nonexclusive_access(uf_info); excl = 0; } @@ -3015,7 +3014,7 @@ sendfile_unix_file(struct file *file, lo mutex_unlock(&inode->i_mutex); uf_info = unix_file_inode_data(inode); - get_nonexclusive_access(uf_info, 0); + get_nonexclusive_access(uf_info); result = generic_file_sendfile(file, ppos, count, actor, target); drop_nonexclusive_access(uf_info); error: Index: linux-2.6.17-rc3-mm1/fs/reiser4/plugin/file/file.h =================================================================== --- linux-2.6.17-rc3-mm1.orig/fs/reiser4/plugin/file/file.h +++ linux-2.6.17-rc3-mm1/fs/reiser4/plugin/file/file.h @@ -104,7 +104,7 @@ typedef struct unix_file_info { struct unix_file_info *unix_file_inode_data(const struct inode *inode); void get_exclusive_access(unix_file_info_t *); void drop_exclusive_access(unix_file_info_t *); -void get_nonexclusive_access(unix_file_info_t *, int); +void get_nonexclusive_access(unix_file_info_t *); void drop_nonexclusive_access(unix_file_info_t *); int try_to_get_nonexclusive_access(unix_file_info_t *); Index: linux-2.6.17-rc3-mm1/fs/reiser4/plugin/file/funcs.h =================================================================== --- linux-2.6.17-rc3-mm1.orig/fs/reiser4/plugin/file/funcs.h +++ linux-2.6.17-rc3-mm1/fs/reiser4/plugin/file/funcs.h @@ -1,11 +1,6 @@ /* Copyright 2001, 2002, 2003, 2004 by Hans Reiser, licensing governed by reiser4/README */ /* this prototypes functions used by both file.c and tail_conversion.c */ -void get_exclusive_access(unix_file_info_t *); -void drop_exclusive_access(unix_file_info_t *); -void get_nonexclusive_access(unix_file_info_t *, int); -void drop_nonexclusive_access(unix_file_info_t *); - int tail2extent(unix_file_info_t *); int extent2tail(unix_file_info_t *); int finish_conversion(struct inode *inode); Index: linux-2.6.17-rc3-mm1/fs/reiser4/plugin/file/tail_conversion.c =================================================================== --- linux-2.6.17-rc3-mm1.orig/fs/reiser4/plugin/file/tail_conversion.c +++ linux-2.6.17-rc3-mm1/fs/reiser4/plugin/file/tail_conversion.c @@ -69,18 +69,12 @@ static void nea_grabbed(unix_file_info_t * * Nonexclusive access is obtained on a file before read, write, readpage. */ -void get_nonexclusive_access(unix_file_info_t *uf_info, int atom_may_exist) +void get_nonexclusive_access(unix_file_info_t *uf_info) { assert("nikita-3029", schedulable()); - /* unix_file_filemap_nopage may call this when current atom exist already */ - assert("nikita-3361", - ergo(atom_may_exist == 0, - get_current_context()->trans->atom == NULL)); - BUG_ON(atom_may_exist == 0 - && get_current_context()->trans->atom != NULL); - + assert("nikita-3361", get_current_context()->trans->atom == NULL); + BUG_ON(get_current_context()->trans->atom != NULL); down_read(&uf_info->latch); - nea_grabbed(uf_info); } --Boundary-00=_FbuYEKWWhFAJ/IU-- Kind regards, Chris