Commit 175359f8 authored by Frederic Weisbecker's avatar Frederic Weisbecker

reiserfs: Fix softlockup while waiting on an inode

When we wait for an inode through reiserfs_iget(), we hold
the reiserfs lock. And waiting for an inode may imply waiting
for its writeback. But the inode writeback path may also require
the reiserfs lock, which leads to a deadlock.

We just need to release the reiserfs lock from reiserfs_iget()
to fix this.
Reported-by: default avatarAlexander Beregalov <a.beregalov@gmail.com>
Signed-off-by: default avatarFrederic Weisbecker <fweisbec@gmail.com>
Tested-by: default avatarChristian Kujau <lists@nerdbynature.de>
Cc: Chris Mason <chris.mason@oracle.com>
parent bbec9191
...@@ -1497,9 +1497,11 @@ struct inode *reiserfs_iget(struct super_block *s, const struct cpu_key *key) ...@@ -1497,9 +1497,11 @@ struct inode *reiserfs_iget(struct super_block *s, const struct cpu_key *key)
args.objectid = key->on_disk_key.k_objectid; args.objectid = key->on_disk_key.k_objectid;
args.dirid = key->on_disk_key.k_dir_id; args.dirid = key->on_disk_key.k_dir_id;
reiserfs_write_unlock(s);
inode = iget5_locked(s, key->on_disk_key.k_objectid, inode = iget5_locked(s, key->on_disk_key.k_objectid,
reiserfs_find_actor, reiserfs_init_locked_inode, reiserfs_find_actor, reiserfs_init_locked_inode,
(void *)(&args)); (void *)(&args));
reiserfs_write_lock(s);
if (!inode) if (!inode)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment