]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
kclient: for hard links, use the inode from the supplied dentry in the fill_trace()
authorYehuda Sadeh-Weinraub <yehuda@yehuda>
Tue, 1 Apr 2008 21:08:24 +0000 (00:08 +0300)
committerYehuda Sadeh-Weinraub <yehuda@yehuda>
Tue, 1 Apr 2008 21:08:24 +0000 (00:08 +0300)
src/kernel/dir.c
src/kernel/inode.c

index ab8036f67a49edb999df562bede52ffd16a78501..c4eb8539f0291509b0e488606053de88f6077cc9 100644 (file)
@@ -397,6 +397,12 @@ static int ceph_dir_link(struct dentry *old_dentry, struct inode *dir,
                d_drop(dentry);
                return PTR_ERR(req);
        }
+
+       dget(dentry);                /* to match put_request below */
+       req->r_last_dentry = dentry; /* use this dentry in fill_trace */
+       igrab(old_dentry->d_inode);
+       req->r_last_inode = old_dentry->d_inode;
+
        ceph_mdsc_lease_release(mdsc, dir, 0, CEPH_LOCK_ICONTENT);
        err = ceph_mdsc_do_request(mdsc, req);
        ceph_mdsc_put_request(req);
index abb24b30b468c455c88d8be381eede60f4f12dd2..fd1ed6ba4810c1e975ef199b26dc4d1a76896fdb 100644 (file)
@@ -435,7 +435,15 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req,
                if ((!dn->d_inode) ||
                    (ceph_ino(dn->d_inode) != ininfo->ino)) {
                        dout(10, "fill_trace new_inode\n");
-                       in = new_inode(dn->d_sb);
+                       if (req->r_last_inode && 
+                           ceph_ino(req->r_last_inode) == ininfo->ino) {
+                               in = req->r_last_inode;
+                               igrab(in);
+                               inc_nlink(in);
+                       } else {
+                               in = new_inode(dn->d_sb);
+                       }
+
                        if (in == NULL) {
                                dout(30, "new_inode badness\n");
                                err = -ENOMEM;