]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
Fixed bugs and crashes that were related to inconsistent iget ( + ilookup)/iput.
authorYehuda Sadeh-Weinraub <yehuda@yehuda.infit.com>
Mon, 14 Jan 2008 14:52:45 +0000 (16:52 +0200)
committerYehuda Sadeh-Weinraub <yehuda@yehuda.infit.com>
Mon, 14 Jan 2008 14:52:45 +0000 (16:52 +0200)
src/kernel/dir.c
src/kernel/file.c
src/kernel/mds_client.c
src/kernel/super.c

index bb5f255d9936c1aa08b7c6983e46423cc0f78b52..da2adaecc6728a24e76c7ad6b014d165cb4f53df 100644 (file)
@@ -149,12 +149,20 @@ nextfrag:
                                        dout(30, "d_alloc badness\n");
                                        break; 
                                }
+                       }
+
+                       if (dn->d_inode == NULL) {
                                in = new_inode(parent->d_sb);
                                if (in == NULL) {
                                        dout(30, "new_inode badness\n");
                                        d_delete(dn);
                                        break;
                                }
+                       } else {
+                               in=dn->d_inode;
+                       }
+
+                       if (in->i_ino !=  fi->rinfo.dir_in[i].in->ino) {
                                if (ceph_fill_inode(in, fi->rinfo.dir_in[i].in) < 0) {
                                        dout(30, "ceph_fill_inode badness\n");
                                        iput(in);
@@ -249,9 +257,12 @@ static struct dentry *ceph_dir_lookup(struct inode *dir, struct dentry *dentry,
                inode = iget(dir->i_sb, ino);
                if (!inode)
                        return ERR_PTR(-EACCES);
-               if ((err = ceph_fill_inode(inode, rinfo.trace_in[rinfo.trace_nr-1].in)) < 0) 
+               if ((err = ceph_fill_inode(inode, rinfo.trace_in[rinfo.trace_nr-1].in)) < 0) {
+                       iput(inode);
                        return ERR_PTR(err);
+               }
                d_add(dentry, inode);
+               iput(inode);
        } else {
                dout(10, "no trace in reply? wtf.\n");
        }
index fd5fee85fee901efb4d9d7ea92489d57a14d78e6..c1df788249bf2ad60b97adac483f3686f8c0a9f4 100644 (file)
@@ -71,7 +71,7 @@ int ceph_open(struct inode *inode, struct file *file)
        wanted = ceph_caps_wanted(ci);
        ci->i_cap_wanted |= wanted;   /* FIXME this isn't quite right */
 
-       dout(5, "ceph_open success, %lx %p\n", inode->i_ino, ilookup(inode->i_sb, inode->i_ino));
+       dout(5, "ceph_open success, %lx\n", inode->i_ino);
        return 0;
 }
 
index ce207d479c7085ac2ece95d7b437010060c3207d..94667d63b5959732f27bdea1df9973da99a28836 100644 (file)
@@ -941,6 +941,8 @@ void ceph_mdsc_handle_filecaps(struct ceph_mds_client *mdsc, struct ceph_msg *ms
                dout(10, "cap export/import -- IMPLEMENT ME\n");
                break;
        }
+
+       iput(inode);
        
        return;
 bad:
index 6f700229704a590f00711e7e64789abb38c810e0..bdc3a9fe9e5ca127336f8d7d84be2ae7eecaf10d 100644 (file)
@@ -437,12 +437,13 @@ static int open_root_inode(struct super_block *sb, struct ceph_mount_args *args)
        reqhead->args.open.mode = 0;
        if ((err = ceph_mdsc_do_request(mdsc, req, &rinfo, -1)) < 0)
                return err;
-       
-       inode = new_inode(sb);
+
+       BUG_ON(rinfo.trace_nr == 0);
+
+       inode = iget(sb, rinfo.trace_in[rinfo.trace_nr-1].in->ino) ;
        if (inode == NULL) 
                return -ENOMEM;
 
-       BUG_ON(rinfo.trace_nr == 0);
        if ((err = ceph_fill_inode(inode, rinfo.trace_in[rinfo.trace_nr-1].in)) < 0) 
                goto out;