[PATCH] ufs: fix hang during `rm'
This fixes the code like this:
bh = sb_find_get_block (sb, tmp + j);
if ((bh && DATA_BUFFER_USED(bh)) || tmp != fs32_to_cpu(sb, *p)) {
retry = 1;
brelse (bh);
goto next1;
}
bforget (bh);
sb_find_get_block() ordinarily returns a buffer_head with b_count>=2, and
this code assume that in case if "b_count>1" buffer is used, so this caused
infinite loop.
(akpm: that is-the-buffer-busy code is incomprehensible. Good riddance. Use
of block_truncate_page() seems sane).
Signed-off-by: Evgeniy Dushistov <dushistov@mail.ru>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
e295cfcb29
commit
09114eb8c5
3 changed files with 18 additions and 57 deletions
|
|
@ -912,6 +912,7 @@ extern int ufs_sync_inode (struct inode *);
|
|||
extern void ufs_delete_inode (struct inode *);
|
||||
extern struct buffer_head * ufs_getfrag (struct inode *, unsigned, int, int *);
|
||||
extern struct buffer_head * ufs_bread (struct inode *, unsigned, int, int *);
|
||||
extern int ufs_getfrag_block (struct inode *inode, sector_t fragment, struct buffer_head *bh_result, int create);
|
||||
|
||||
/* namei.c */
|
||||
extern struct file_operations ufs_dir_operations;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue