From: Yehuda Sadeh-Weinraub Date: Tue, 1 Apr 2008 21:08:24 +0000 (+0300) Subject: kclient: for hard links, use the inode from the supplied dentry in the fill_trace() X-Git-Tag: v0.2~229^2~7 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=a4e82adbcd189ccbde85e90c0196d254e72327d0;p=ceph.git kclient: for hard links, use the inode from the supplied dentry in the fill_trace() --- diff --git a/src/kernel/dir.c b/src/kernel/dir.c index ab8036f67a49..c4eb8539f029 100644 --- a/src/kernel/dir.c +++ b/src/kernel/dir.c @@ -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); diff --git a/src/kernel/inode.c b/src/kernel/inode.c index abb24b30b468..fd1ed6ba4810 100644 --- a/src/kernel/inode.c +++ b/src/kernel/inode.c @@ -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;