From: Hans Reiser <reiser@namesys.com>
To: Andrew Morton <akpm@osdl.org>,
Linux Kernel Mailing List <Linux-Kernel@vger.kernel.org>
Subject: [PATCH] Reiser4 bug fixes
Date: Wed, 19 Jul 2006 13:22:23 -0700 [thread overview]
Message-ID: <44BE947F.30507@namesys.com> (raw)
Hopefully this will make reiser4 stable code again. Or at least, a lot more stable than v3 (or other FSes) was when it went in....
Signed-off-by: Hans Reiser
From: Vladimir Saveliev <vs@namesys.com>
This patch contains 4 reiser4 bug fixes:
- missing long term lock unlock on read' error handling code path is added
- truncate_inode_pages is now called with embedded mapping.
It is needed to deal properly with block device special files.
- copy_to_user might be called for more bytes than was prefaulted with fault_in_pages_writeable.
That caused undesirable major page faults.
- readdir bug similar to the previous one:
call to filldir might lead to deadlock due to major page fault.
Signed-off-by: Vladimir Saveliev <vs@namesys.com>
diff -puN fs/reiser4/super_ops.c~reiser4-one-line-fixes fs/reiser4/super_ops.c
--- linux-2.6.18-rc-mm2/fs/reiser4/super_ops.c~reiser4-one-line-fixes 2006-07-19 16:25:49.000000000 +0400
+++ linux-2.6.18-rc-mm2-vs/fs/reiser4/super_ops.c 2006-07-19 16:25:49.000000000 +0400
@@ -202,7 +202,7 @@ static void reiser4_delete_inode(struct
fplug->delete_object(inode);
}
- truncate_inode_pages(inode->i_mapping, 0);
+ truncate_inode_pages(&inode->i_data, 0);
inode->i_blocks = 0;
clear_inode(inode);
reiser4_exit_context(ctx);
diff -puN fs/reiser4/plugin/file/file.c~reiser4-one-line-fixes fs/reiser4/plugin/file/file.c
--- linux-2.6.18-rc-mm2/fs/reiser4/plugin/file/file.c~reiser4-one-line-fixes 2006-07-19 16:25:49.000000000 +0400
+++ linux-2.6.18-rc-mm2-vs/fs/reiser4/plugin/file/file.c 2006-07-19 17:35:35.000000000 +0400
@@ -781,9 +781,12 @@ int find_or_create_extent(struct page *p
lock_page(page);
node = jnode_of_page(page);
- unlock_page(page);
- if (IS_ERR(node))
+ if (IS_ERR(node)) {
+ unlock_page(page);
return PTR_ERR(node);
+ }
+ JF_SET(node, JNODE_WRITE_PREPARED);
+ unlock_page(page);
if (node->blocknr == 0) {
plugged_hole = 0;
@@ -791,6 +794,7 @@ int find_or_create_extent(struct page *p
(loff_t)page->index << PAGE_CACHE_SHIFT,
&plugged_hole);
if (result) {
+ JF_CLR(node, JNODE_WRITE_PREPARED);
jput(node);
warning("", "update_extent failed: %d", result);
return result;
@@ -806,6 +810,7 @@ int find_or_create_extent(struct page *p
}
BUG_ON(node->atom == NULL);
+ JF_CLR(node, JNODE_WRITE_PREPARED);
jput(node);
if (get_current_context()->entd) {
@@ -1631,14 +1636,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,
@@ -1729,7 +1738,9 @@ ssize_t read_unix_file(struct file *file
return RETERR(-EFAULT);
}
- 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);
diff -puN fs/reiser4/plugin/file_ops_readdir.c~reiser4-one-line-fixes fs/reiser4/plugin/file_ops_readdir.c
--- linux-2.6.18-rc-mm2/fs/reiser4/plugin/file_ops_readdir.c~reiser4-one-line-fixes 2006-07-19 16:25:49.000000000 +0400
+++ linux-2.6.18-rc-mm2-vs/fs/reiser4/plugin/file_ops_readdir.c 2006-07-19 16:25:49.000000000 +0400
@@ -349,6 +349,7 @@ feed_entry(struct file *f,
*/
assert("nikita-3436", lock_stack_isclean(get_current_lock_stack()));
+ txn_restart_current();
result = filldir(dirent, name, (int)strlen(name),
/* offset of this entry */
f->f_pos,
@@ -630,7 +631,7 @@ int readdir_common(struct file *f /* dir
detach_fsdata(f);
/* try to update directory's atime */
- if (reiser4_grab_space(inode_file_plugin(inode)->estimate.update(inode),
+ if (reiser4_grab_space_force(inode_file_plugin(inode)->estimate.update(inode),
BA_CAN_COMMIT) != 0)
warning("", "failed to update atime on readdir: %llu",
get_inode_oid(inode));
_
next reply other threads:[~2006-07-19 20:22 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-07-19 20:22 Hans Reiser [this message]
2006-08-19 20:16 ` [PATCH] Reiser4 bug fixes Christoph Hellwig
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=44BE947F.30507@namesys.com \
--to=reiser@namesys.com \
--cc=Linux-Kernel@vger.kernel.org \
--cc=akpm@osdl.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.