mirror of
https://github.com/adulau/aha.git
synced 2024-12-28 03:36:19 +00:00
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6: ext3/4 with synchronous writes gets wedged by Postfix Fix nobh_truncate_page() to not pass stack garbage to get_block()
This commit is contained in:
commit
81ee1bad86
2 changed files with 27 additions and 6 deletions
|
@ -2736,6 +2736,8 @@ has_buffers:
|
|||
pos += blocksize;
|
||||
}
|
||||
|
||||
map_bh.b_size = blocksize;
|
||||
map_bh.b_state = 0;
|
||||
err = get_block(inode, iblock, &map_bh, 0);
|
||||
if (err)
|
||||
goto unlock;
|
||||
|
|
31
fs/inode.c
31
fs/inode.c
|
@ -1053,13 +1053,22 @@ int insert_inode_locked(struct inode *inode)
|
|||
struct super_block *sb = inode->i_sb;
|
||||
ino_t ino = inode->i_ino;
|
||||
struct hlist_head *head = inode_hashtable + hash(sb, ino);
|
||||
struct inode *old;
|
||||
|
||||
inode->i_state |= I_LOCK|I_NEW;
|
||||
while (1) {
|
||||
struct hlist_node *node;
|
||||
struct inode *old = NULL;
|
||||
spin_lock(&inode_lock);
|
||||
old = find_inode_fast(sb, head, ino);
|
||||
if (likely(!old)) {
|
||||
hlist_for_each_entry(old, node, head, i_hash) {
|
||||
if (old->i_ino != ino)
|
||||
continue;
|
||||
if (old->i_sb != sb)
|
||||
continue;
|
||||
if (old->i_state & (I_FREEING|I_CLEAR|I_WILL_FREE))
|
||||
continue;
|
||||
break;
|
||||
}
|
||||
if (likely(!node)) {
|
||||
hlist_add_head(&inode->i_hash, head);
|
||||
spin_unlock(&inode_lock);
|
||||
return 0;
|
||||
|
@ -1081,14 +1090,24 @@ int insert_inode_locked4(struct inode *inode, unsigned long hashval,
|
|||
{
|
||||
struct super_block *sb = inode->i_sb;
|
||||
struct hlist_head *head = inode_hashtable + hash(sb, hashval);
|
||||
struct inode *old;
|
||||
|
||||
inode->i_state |= I_LOCK|I_NEW;
|
||||
|
||||
while (1) {
|
||||
struct hlist_node *node;
|
||||
struct inode *old = NULL;
|
||||
|
||||
spin_lock(&inode_lock);
|
||||
old = find_inode(sb, head, test, data);
|
||||
if (likely(!old)) {
|
||||
hlist_for_each_entry(old, node, head, i_hash) {
|
||||
if (old->i_sb != sb)
|
||||
continue;
|
||||
if (!test(old, data))
|
||||
continue;
|
||||
if (old->i_state & (I_FREEING|I_CLEAR|I_WILL_FREE))
|
||||
continue;
|
||||
break;
|
||||
}
|
||||
if (likely(!node)) {
|
||||
hlist_add_head(&inode->i_hash, head);
|
||||
spin_unlock(&inode_lock);
|
||||
return 0;
|
||||
|
|
Loading…
Reference in a new issue