From b0aefac4edd63d9a083165c5fa3bc6cbb98be29e Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh-Weinraub Date: Tue, 15 Jan 2008 23:37:25 +0200 Subject: [PATCH] dir_lookup now uses new_inode instead of iget that deadlocks --- src/kernel/dir.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/kernel/dir.c b/src/kernel/dir.c index 7b8cac77e8177..ea44050564faa 100644 --- a/src/kernel/dir.c +++ b/src/kernel/dir.c @@ -265,17 +265,21 @@ static struct dentry *ceph_dir_lookup(struct inode *dir, struct dentry *dentry, if (rinfo.trace_nr > 0) { ino = le64_to_cpu(rinfo.trace_in[rinfo.trace_nr-1].in->ino); dout(10, "got and parsed stat result, ino %lu\n", ino); - inode = iget_locked(dir->i_sb, ino); - if (!inode) + + inode = ilookup(dir->i_sb, ino); + + if (!inode) { + inode = new_inode(dir->i_sb); + } + + if (!inode) { return ERR_PTR(-EACCES); + } + if ((err = ceph_fill_inode(inode, rinfo.trace_in[rinfo.trace_nr-1].in)) < 0) { - iput(inode); return ERR_PTR(err); } - if (inode->i_state & I_NEW) - unlock_new_inode(inode); d_add(dentry, inode); - iput(inode); } else { dout(10, "no trace in reply? wtf.\n"); } -- 2.39.5