]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
dir_lookup now uses new_inode instead of iget that deadlocks
authorYehuda Sadeh-Weinraub <yehuda@yehuda.infit.com>
Tue, 15 Jan 2008 21:37:25 +0000 (23:37 +0200)
committerYehuda Sadeh-Weinraub <yehuda@yehuda.infit.com>
Tue, 15 Jan 2008 21:37:25 +0000 (23:37 +0200)
src/kernel/dir.c

index 7b8cac77e81775f41b5bee6ea2a1b183cb60da81..ea44050564faadfafa0676b5af4b7dadcb98380a 100644 (file)
@@ -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");
        }